diff --git a/src/app/tests/suites/certification/Test_TC_SC_5_1.yaml b/src/app/tests/suites/certification/Test_TC_SC_5_1.yaml
index 8264358..9220ee7 100644
--- a/src/app/tests/suites/certification/Test_TC_SC_5_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_SC_5_1.yaml
@@ -13,544 +13,229 @@
 # 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:
-    19.1.1. [TC-SC-5.1] Adding member to a group - TH as Admin and DUT as Group
-    Member
+name: 19.1.1. [TC-SC-5.1] Adding member to a group
 
 PICS:
     - PICS_MCORE_ROLE_COMMISSIONEE
 
 config:
     nodeId: 0x12344321
-    cluster: "Basic Information"
-    endpoint: 0
+    cluster: "Groups"
+    # Users should set endpoint value on the command line to PIXIT.G.ENDPOINT
+    endpoint: 1
 
 tests:
-    - label: "Precondition"
-      verification: |
-          DUT is commissioned by TH
-      disabled: true
+    - label: "Wait for the commissioned device to be retrieved"
+      cluster: "DelayCommands"
+      command: "WaitForCommissionee"
+      arguments:
+          values:
+              - name: "nodeId"
+                value: nodeId
 
-    - label:
-          "TH writes The ACL attribute in the Access Control cluster to add
-          Operate privileges for group 0x0103 and maintain the current
-          administrative privileges for the TH. The following access control
-          list shall be used: List item 1 (TH admin): Fabric index: 1,Privilege:
-          Administer (5),AuthMode: CASE (2),Subjects: TH node id ([N1]),Targets:
-          all (null) List item 2 (group operate access):Fabric index:
-          1,Privilege: Operate (3),AuthMode: Group (3),Subjects: group 0x0103
-          ([0x0103]),Targets: all (null)"
-      verification: |
-          ./chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [1], "targets": null },{"fabricIndex": 1, "privilege": 3, "authMode": 3, "subjects": ["0x0103"], "targets": null }]' 1 0
+    - label: "TH adds ACL Operate privileges for Group 0x0103"
+      cluster: "Access Control"
+      endpoint: 0
+      command: "writeAttribute"
+      attribute: "ACL"
+      arguments:
+          value:
+              [
+                  {
+                      FabricIndex: 1,
+                      Privilege: 5,
+                      AuthMode: 2,
+                      Subjects: [commissionerNodeId],
+                      Targets: null,
+                  },
+                  {
+                      FabricIndex: 1,
+                      Privilege: 3,
+                      AuthMode: 3,
+                      Subjects: [0x0103],
+                      Targets: null,
+                  },
+              ]
 
+    - label: "TH sends KeySetWrite command with incorrect key"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "KeySetWrite"
+      arguments:
+          values:
+              - name: GroupKeySet
+                value:
+                    {
+                        GroupKeySetID: 0x01a3,
+                        GroupKeySecurityPolicy: 0,
+                        EpochKey0: "0x00000000000000000000000000000001",
+                        EpochStartTime0: 111,
+                        EpochKey1: "0x00000000000000000000000000000002",
+                        EpochStartTime1: 222,
+                        EpochKey2: "0x00000000000000000000000000000003",
+                        EpochStartTime2: 333,
+                    }
 
-            [1674109884.293472][29548:29550] CHIP:DMG: WriteResponseMessage =
-            [1674109884.293477][29548:29550] CHIP:DMG: {
-            [1674109884.293479][29548:29550] CHIP:DMG:         AttributeStatusIBs =
-            [1674109884.293486][29548:29550] CHIP:DMG:         [
-            [1674109884.293489][29548:29550] CHIP:DMG:                 AttributeStatusIB =
-            [1674109884.293494][29548:29550] CHIP:DMG:                 {
-            [1674109884.293497][29548:29550] CHIP:DMG:                         AttributePathIB =
-            [1674109884.293502][29548:29550] CHIP:DMG:                         {
-            [1674109884.293506][29548:29550] CHIP:DMG:                                 Endpoint = 0x0,
-            [1674109884.293510][29548:29550] CHIP:DMG:                                 Cluster = 0x1f,
-            [1674109884.293514][29548:29550] CHIP:DMG:                                 Attribute = 0x0000_0000,
-            [1674109884.293518][29548:29550] CHIP:DMG:                         }
-            [1674109884.293523][29548:29550] CHIP:DMG:
-            [1674109884.293527][29548:29550] CHIP:DMG:                         StatusIB =
-            [1674109884.293531][29548:29550] CHIP:DMG:                         {
-            [1674109884.293536][29548:29550] CHIP:DMG:                                 status = 0x00 (SUCCESS),
-            [1674109884.293539][29548:29550] CHIP:DMG:                         },
-            [1674109884.293543][29548:29550] CHIP:DMG:
-            [1674109884.293547][29548:29550] CHIP:DMG:                 },
-            [1674109884.293572][29548:29550] CHIP:DMG:
-            [1674109884.293575][29548:29550] CHIP:DMG:                 AttributeStatusIB =
-            [1674109884.293579][29548:29550] CHIP:DMG:                 {
-            [1674109884.293582][29548:29550] CHIP:DMG:                         AttributePathIB =
-            [1674109884.293586][29548:29550] CHIP:DMG:                         {
-            [1674109884.293590][29548:29550] CHIP:DMG:                                 Endpoint = 0x0,
-            [1674109884.293594][29548:29550] CHIP:DMG:                                 Cluster = 0x1f,
-            [1674109884.293598][29548:29550] CHIP:DMG:                                 Attribute = 0x0000_0000,
-            [1674109884.293602][29548:29550] CHIP:DMG:                                 ListIndex = Null,
-            [1674109884.293605][29548:29550] CHIP:DMG:                         }
-            [1674109884.293611][29548:29550] CHIP:DMG:
-            [1674109884.293614][29548:29550] CHIP:DMG:                         StatusIB =
-            [1674109884.293618][29548:29550] CHIP:DMG:                         {
-            [1674109884.293621][29548:29550] CHIP:DMG:                                 status = 0x00 (SUCCESS),
-            [1674109884.293625][29548:29550] CHIP:DMG:                         },
-            [1674109884.293629][29548:29550] CHIP:DMG:
-            [1674109884.293632][29548:29550] CHIP:DMG:                 },
-            [1674109884.293640][29548:29550] CHIP:DMG:
-            [1674109884.293643][29548:29550] CHIP:DMG:                 AttributeStatusIB =
-            [1674109884.293647][29548:29550] CHIP:DMG:                 {
-            [1674109884.293650][29548:29550] CHIP:DMG:                         AttributePathIB =
-            [1674109884.293654][29548:29550] CHIP:DMG:                         {
-            [1674109884.293657][29548:29550] CHIP:DMG:                                 Endpoint = 0x0,
-            [1674109884.293661][29548:29550] CHIP:DMG:                                 Cluster = 0x1f,
-            [1674109884.293665][29548:29550] CHIP:DMG:                                 Attribute = 0x0000_0000,
-            [1674109884.293669][29548:29550] CHIP:DMG:                                 ListIndex = Null,
-            [1674109884.293672][29548:29550] CHIP:DMG:                         }
-            [1674109884.293678][29548:29550] CHIP:DMG:
-            [1674109884.293681][29548:29550] CHIP:DMG:                         StatusIB =
-            [1674109884.293685][29548:29550] CHIP:DMG:                         {
-            [1674109884.293689][29548:29550] CHIP:DMG:                                 status = 0x00 (SUCCESS),
-            [1674109884.293692][29548:29550] CHIP:DMG:                         },
-            [1674109884.293696][29548:29550] CHIP:DMG:
-            [1674109884.293699][29548:29550] CHIP:DMG:                 },
-            [1674109884.293704][29548:29550] CHIP:DMG:
-            [1674109884.293707][29548:29550] CHIP:DMG:         ],
-            [1674109884.293717][29548:29550] CHIP:DMG:
-            [1674109884.293721][29548:29550] CHIP:DMG:         InteractionModelRevision = 1
-            [1674109884.293724][29548:29550] CHIP:DMG: }
-      disabled: true
+    - label: "TH sends KeySetWrite command with TH key"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "KeySetWrite"
+      arguments:
+          values:
+              - name: GroupKeySet
+                value:
+                    {
+                        GroupKeySetID: 0x01a3,
+                        GroupKeySecurityPolicy: 0,
+                        EpochKey0: "0xd0d1d2d3d4d5d6d7d8d9dadbdcdddedf",
+                        EpochStartTime0: 2220000,
+                        EpochKey1: "0xd1d1d2d3d4d5d6d7d8d9dadbdcdddedf",
+                        EpochStartTime1: 2220001,
+                        EpochKey2: "0xd2d1d2d3d4d5d6d7d8d9dadbdcdddedf",
+                        EpochStartTime2: 2220002,
+                    }
 
-    - label:
-          "TH sends KeySetWrite command in the GroupKeyManagement cluster to DUT
-          using a key that is NOT installed on the TH. This is intended to test
-          that the key set is correctly updated in the next step. GroupKeySet
-          fields are as follows: GroupKeySetID: 0x01a3,GroupKeySecurityPolicy:
-          TrustFirst (0),EpochKey0:
-          0x00000000000000000000000000000001,EpochStartTime0: 111,EpochKey1:
-          0x00000000000000000000000000000002,EpochStartTime1: 222,EpochKey2:
-          0x00000000000000000000000000000003,EpochStartTime2: 333"
-      verification: |
-          ./chip-tool groupkeymanagement key-set-write '{"groupKeySetID": "0x01a3","groupKeySecurityPolicy": 0, "epochKey0":"00000000000000000000000000000001", "epochStartTime0": 111,"epochKey1":"00000000000000000000000000000002", "epochStartTime1": 222,"epochKey2":"00000000000000000000000000000003", "epochStartTime2": 333 }' 1 0
+    - label: "TH binds GroupId to GroupKeySet"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "writeAttribute"
+      attribute: "GroupKeyMap"
+      arguments:
+          value: [{ FabricIndex: 1, GroupId: 0x0103, GroupKeySetID: 0x01a3 }]
 
+    - label: "TH sends RemoveAllGroups command"
+      command: "RemoveAllGroups"
 
-            [1674109957.007856][29570:29572] CHIP:DMG: InvokeResponseMessage =
-            [1674109957.007859][29570:29572] CHIP:DMG: {
-            [1674109957.007862][29570:29572] CHIP:DMG:         suppressResponse = false,
-            [1674109957.007865][29570:29572] CHIP:DMG:         InvokeResponseIBs =
-            [1674109957.007872][29570:29572] CHIP:DMG:         [
-            [1674109957.007875][29570:29572] CHIP:DMG:                 InvokeResponseIB =
-            [1674109957.007880][29570:29572] CHIP:DMG:                 {
-            [1674109957.007883][29570:29572] CHIP:DMG:                         CommandStatusIB =
-            [1674109957.007887][29570:29572] CHIP:DMG:                         {
-            [1674109957.007890][29570:29572] CHIP:DMG:                                 CommandPathIB =
-            [1674109957.007894][29570:29572] CHIP:DMG:                                 {
-            [1674109957.007898][29570:29572] CHIP:DMG:                                         EndpointId = 0x0,
-            [1674109957.007901][29570:29572] CHIP:DMG:                                         ClusterId = 0x3f,
-            [1674109957.007905][29570:29572] CHIP:DMG:                                         CommandId = 0x0,
-            [1674109957.007909][29570:29572] CHIP:DMG:                                 },
-            [1674109957.007913][29570:29572] CHIP:DMG:
-            [1674109957.007917][29570:29572] CHIP:DMG:                                 StatusIB =
-            [1674109957.007921][29570:29572] CHIP:DMG:                                 {
-            [1674109957.007924][29570:29572] CHIP:DMG:                                         status = 0x00 (SUCCESS),
-            [1674109957.007927][29570:29572] CHIP:DMG:                                 },
-            [1674109957.007931][29570:29572] CHIP:DMG:
-            [1674109957.007933][29570:29572] CHIP:DMG:                         },
-            [1674109957.007938][29570:29572] CHIP:DMG:
-            [1674109957.007941][29570:29572] CHIP:DMG:                 },
-            [1674109957.007946][29570:29572] CHIP:DMG:
-            [1674109957.007948][29570:29572] CHIP:DMG:         ],
-            [1674109957.007953][29570:29572] CHIP:DMG:
-            [1674109957.007956][29570:29572] CHIP:DMG:         InteractionModelRevision = 1
-            [1674109957.007958][29570:29572] CHIP:DMG: },
-      disabled: true
+    - label: "TH sends AddGroup command"
+      command: "AddGroup"
+      arguments:
+          values:
+              - name: GroupID
+                value: 0x0103
+              - name: GroupName
+                value: "Test Group"
 
-    - label:
-          "TH sends KeySetWrite command in the GroupKeyManagement cluster to DUT
-          using a key that is pre-installed on the TH. GroupKeySet fields are as
-          follows: GroupKeySetID: 0x01a3,GroupKeySecurityPolicy: TrustFirst
-          (0),EpochKey0: 0xd0d1d2d3d4d5d6d7d8d9dadbdcdddedf,EpochStartTime0:
-          2220000,EpochKey1: 0xd1d1d2d3d4d5d6d7d8d9dadbdcdddedf,EpochStartTime1:
-          2220001,EpochKey2: 0xd2d1d2d3d4d5d6d7d8d9dadbdcdddedf,EpochStartTime2:
-          2220002"
-      verification: |
-          ./chip-tool groupkeymanagement key-set-write '{"groupKeySetID": "0x01a3","groupKeySecurityPolicy": 0, "epochKey0":"d0d1d2d3d4d5d6d7d8d9dadbdcdddedf", "epochStartTime0": 2220000,"epochKey1":"d1d1d2d3d4d5d6d7d8d9dadbdcdddedf", "epochStartTime1": 2220001,"epochKey2":"d2d1d2d3d4d5d6d7d8d9dadbdcdddedf", "epochStartTime2": 2220002 }' 1 0
-
-
-            [1674110035.037849][29578:29580] CHIP:DMG: InvokeResponseMessage =
-            [1674110035.037852][29578:29580] CHIP:DMG: {
-            [1674110035.037856][29578:29580] CHIP:DMG:         suppressResponse = false,
-            [1674110035.037859][29578:29580] CHIP:DMG:         InvokeResponseIBs =
-            [1674110035.037864][29578:29580] CHIP:DMG:         [
-            [1674110035.037867][29578:29580] CHIP:DMG:                 InvokeResponseIB =
-            [1674110035.037872][29578:29580] CHIP:DMG:                 {
-            [1674110035.037875][29578:29580] CHIP:DMG:                         CommandStatusIB =
-            [1674110035.037879][29578:29580] CHIP:DMG:                         {
-            [1674110035.037882][29578:29580] CHIP:DMG:                                 CommandPathIB =
-            [1674110035.037886][29578:29580] CHIP:DMG:                                 {
-            [1674110035.037890][29578:29580] CHIP:DMG:                                         EndpointId = 0x0,
-            [1674110035.037893][29578:29580] CHIP:DMG:                                         ClusterId = 0x3f,
-            [1674110035.037897][29578:29580] CHIP:DMG:                                         CommandId = 0x0,
-            [1674110035.037900][29578:29580] CHIP:DMG:                                 },
-            [1674110035.037905][29578:29580] CHIP:DMG:
-            [1674110035.037908][29578:29580] CHIP:DMG:                                 StatusIB =
-            [1674110035.037912][29578:29580] CHIP:DMG:                                 {
-            [1674110035.037916][29578:29580] CHIP:DMG:                                         status = 0x00 (SUCCESS),
-            [1674110035.037920][29578:29580] CHIP:DMG:                                 },
-            [1674110035.037925][29578:29580] CHIP:DMG:
-            [1674110035.037929][29578:29580] CHIP:DMG:                         },
-            [1674110035.037934][29578:29580] CHIP:DMG:
-            [1674110035.037938][29578:29580] CHIP:DMG:                 },
-            [1674110035.037944][29578:29580] CHIP:DMG:
-            [1674110035.037948][29578:29580] CHIP:DMG:         ],
-            [1674110035.037954][29578:29580] CHIP:DMG:
-            [1674110035.037957][29578:29580] CHIP:DMG:         InteractionModelRevision = 1
-            [1674110035.037960][29578:29580] CHIP:DMG: },
-      disabled: true
-
-    - label:
-          "TH binds GroupId 0x0103 with GroupKeySetID 0x01a3 in the GroupKeyMap
-          attribute list on GroupKeyManagement cluster by writing the
-          GroupKeyMap attribute with one entry as follows: List item 1:
-          FabricIndex: 1,GroupId: 0x0103,GroupKeySetId: 0x01a3"
-      verification: |
-          ./chip-tool groupkeymanagement write group-key-map '[{"groupId": "0x0103", "groupKeySetID": "0x01a3", "fabricIndex": 1}]' 1 0
-
-            [1674110101.932149][29586:29588] CHIP:DMG: WriteResponseMessage =
-            [1674110101.932152][29586:29588] CHIP:DMG: {
-            [1674110101.932155][29586:29588] CHIP:DMG:         AttributeStatusIBs =
-            [1674110101.932161][29586:29588] CHIP:DMG:         [
-            [1674110101.932164][29586:29588] CHIP:DMG:                 AttributeStatusIB =
-            [1674110101.932169][29586:29588] CHIP:DMG:                 {
-            [1674110101.932173][29586:29588] CHIP:DMG:                         AttributePathIB =
-            [1674110101.932177][29586:29588] CHIP:DMG:                         {
-            [1674110101.932181][29586:29588] CHIP:DMG:                                 Endpoint = 0x0,
-            [1674110101.932185][29586:29588] CHIP:DMG:                                 Cluster = 0x3f,
-            [1674110101.932189][29586:29588] CHIP:DMG:                                 Attribute = 0x0000_0000,
-            [1674110101.932193][29586:29588] CHIP:DMG:                         }
-            [1674110101.932198][29586:29588] CHIP:DMG:
-            [1674110101.932201][29586:29588] CHIP:DMG:                         StatusIB =
-            [1674110101.932206][29586:29588] CHIP:DMG:                         {
-            [1674110101.932210][29586:29588] CHIP:DMG:                                 status = 0x00 (SUCCESS),
-            [1674110101.932213][29586:29588] CHIP:DMG:                         },
-            [1674110101.932217][29586:29588] CHIP:DMG:
-            [1674110101.932220][29586:29588] CHIP:DMG:                 },
-            [1674110101.932227][29586:29588] CHIP:DMG:
-            [1674110101.932230][29586:29588] CHIP:DMG:                 AttributeStatusIB =
-            [1674110101.932234][29586:29588] CHIP:DMG:                 {
-            [1674110101.932237][29586:29588] CHIP:DMG:                         AttributePathIB =
-            [1674110101.932240][29586:29588] CHIP:DMG:                         {
-            [1674110101.932244][29586:29588] CHIP:DMG:                                 Endpoint = 0x0,
-            [1674110101.932248][29586:29588] CHIP:DMG:                                 Cluster = 0x3f,
-            [1674110101.932252][29586:29588] CHIP:DMG:                                 Attribute = 0x0000_0000,
-            [1674110101.932256][29586:29588] CHIP:DMG:                                 ListIndex = Null,
-            [1674110101.932259][29586:29588] CHIP:DMG:                         }
-            [1674110101.932264][29586:29588] CHIP:DMG:
-            [1674110101.932267][29586:29588] CHIP:DMG:                         StatusIB =
-            [1674110101.932270][29586:29588] CHIP:DMG:                         {
-            [1674110101.932273][29586:29588] CHIP:DMG:                                 status = 0x00 (SUCCESS),
-            [1674110101.932276][29586:29588] CHIP:DMG:                         },
-            [1674110101.932280][29586:29588] CHIP:DMG:
-            [1674110101.932283][29586:29588] CHIP:DMG:                 },
-            [1674110101.932288][29586:29588] CHIP:DMG:
-            [1674110101.932291][29586:29588] CHIP:DMG:         ],
-            [1674110101.932298][29586:29588] CHIP:DMG:
-            [1674110101.932301][29586:29588] CHIP:DMG:         InteractionModelRevision = 1
-            [1674110101.932305][29586:29588] CHIP:DMG: }
-      disabled: true
-
-    - label: "TH sends RemoveAllGroups command to the DUT on PIXIT.G.ENDPOINT"
-      verification: |
-          ./chip-tool groups remove-all-groups 1 1
-
-
-            [1674110158.295305][29600:29602] CHIP:DMG: InvokeResponseMessage =
-            [1674110158.295310][29600:29602] CHIP:DMG: {
-            [1674110158.295314][29600:29602] CHIP:DMG:         suppressResponse = false,
-            [1674110158.295318][29600:29602] CHIP:DMG:         InvokeResponseIBs =
-            [1674110158.295327][29600:29602] CHIP:DMG:         [
-            [1674110158.295331][29600:29602] CHIP:DMG:                 InvokeResponseIB =
-            [1674110158.295339][29600:29602] CHIP:DMG:                 {
-            [1674110158.295344][29600:29602] CHIP:DMG:                         CommandStatusIB =
-            [1674110158.295349][29600:29602] CHIP:DMG:                         {
-            [1674110158.295354][29600:29602] CHIP:DMG:                                 CommandPathIB =
-            [1674110158.295361][29600:29602] CHIP:DMG:                                 {
-            [1674110158.295366][29600:29602] CHIP:DMG:                                         EndpointId = 0x1,
-            [1674110158.295372][29600:29602] CHIP:DMG:                                         ClusterId = 0x4,
-            [1674110158.295377][29600:29602] CHIP:DMG:                                         CommandId = 0x4,
-            [1674110158.295382][29600:29602] CHIP:DMG:                                 },
-            [1674110158.295390][29600:29602] CHIP:DMG:
-            [1674110158.295394][29600:29602] CHIP:DMG:                                 StatusIB =
-            [1674110158.295401][29600:29602] CHIP:DMG:                                 {
-            [1674110158.295407][29600:29602] CHIP:DMG:                                         status = 0x00 (SUCCESS),
-            [1674110158.295412][29600:29602] CHIP:DMG:                                 },
-            [1674110158.295418][29600:29602] CHIP:DMG:
-            [1674110158.295422][29600:29602] CHIP:DMG:                         },
-            [1674110158.295429][29600:29602] CHIP:DMG:
-            [1674110158.295433][29600:29602] CHIP:DMG:                 },
-            [1674110158.295440][29600:29602] CHIP:DMG:
-            [1674110158.295445][29600:29602] CHIP:DMG:         ],
-            [1674110158.295452][29600:29602] CHIP:DMG:
-            [1674110158.295457][29600:29602] CHIP:DMG:         InteractionModelRevision = 1
-            [1674110158.295461][29600:29602] CHIP:DMG: },
-      disabled: true
-
-    - label:
-          "TH sends AddGroup Command to DUT on PIXIT.G.ENDPOINT with the the
-          following settings GroupID: 0x0103,GroupName: Test Group"
-      verification: |
-          ./chip-tool groups add-group "0x0103" "Test Group" 1 1
-
-            [1674110214.486414][29605:29607] CHIP:DMG: },
-            [1674110214.486440][29605:29607] CHIP:DMG: Received Command Response Data, Endpoint=1 Cluster=0x0000_0004 Command=0x0000_0000
-            [1674110214.486856][29605:29607] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0004 Command 0x0000_0000
-            [1674110214.487108][29605:29607] CHIP:TOO:   AddGroupResponse: {
-            [1674110214.487116][29605:29607] CHIP:TOO:     status: 0
-            [1674110214.487119][29605:29607] CHIP:TOO:     groupID: 259
-            [1674110214.487123][29605:29607] CHIP:TOO:    }
-      disabled: true
-
-    - label:
-          "TH sends ViewGroup command with the GroupID to the Group cluster on
-          the DUT on PIXIT.G.ENDPOINT"
+    - label: "TH sends ViewGroup command"
       PICS: G.S.F00
-      verification: |
-          ./chip-tool groups view-group "0x0103" 1 1
+      command: "ViewGroup"
+      arguments:
+          values:
+              - name: GroupID
+                value: 0x0103
+      response:
+          values:
+              - name: Status
+                value: 0
+              - name: GroupID
+                value: 0x0103
+              - name: GroupName
+                value: "Test Group"
 
+    - label: "TH sends ViewGroup command"
+      PICS: "!(G.S.F00)"
+      command: "ViewGroup"
+      arguments:
+          values:
+              - name: GroupID
+                value: 0x0103
+      response:
+          values:
+              - name: Status
+                value: 0
+              - name: GroupID
+                value: 0x0103
+              - name: GroupName
+                value: ""
 
-            [1674110306.198950][29621:29623] CHIP:DMG: Received Command Response Data, Endpoint=1 Cluster=0x0000_0004 Command=0x0000_0001
-            [1674110306.198979][29621:29623] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0004 Command 0x0000_0001
-            [1674110306.199016][29621:29623] CHIP:TOO:   ViewGroupResponse: {
-            [1674110306.199030][29621:29623] CHIP:TOO:     status: 0
-            [1674110306.199041][29621:29623] CHIP:TOO:     groupID: 259
-            [1674110306.199051][29621:29623] CHIP:TOO:     groupName: Test Group
-            [1674110306.199061][29621:29623] CHIP:TOO:    }
-      disabled: true
+    - label: "TH sends KeySetRead"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "KeySetRead"
+      arguments:
+          values:
+              - name: GroupKeySetID
+                value: 0x01a3
+      response:
+          values:
+              - name: GroupKeySet
+                value:
+                    {
+                        GroupKeySetID: 0x01a3,
+                        GroupKeySecurityPolicy: 0,
+                        EpochKey0: null,
+                        EpochStartTime0: 2220000,
+                        EpochKey1: null,
+                        EpochStartTime1: 2220001,
+                        EpochKey2: null,
+                        EpochStartTime2: 2220002,
+                    }
 
-    - label:
-          "TH sends ViewGroup command with the GroupID to the Group cluster on
-          the DUT on PIXIT.G.ENDPOINT"
-      PICS: " !G.S.F00 "
-      verification: |
-          Verify DUT sends a ViewGroupResponse command with
-
-          Status: SUCCESS
-
-          GroupID: 0x0103
-
-          GroupName: ""
-      disabled: true
-
-    - label:
-          "TH sends KeySetRead command to GroupKeyManagement cluster with
-          GroupKeySetID as 0x01a3"
-      verification: |
-          ./chip-tool groupkeymanagement key-set-read "0x01a3" 1 0
-
-           [1674110375.913702][29626:29628] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_003F Command=0x0000_0002
-           [1674110375.913742][29626:29628] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003F Command 0x0000_0002
-           [1674110375.914256][29626:29628] CHIP:TOO:   KeySetReadResponse: {
-           [1674110375.914277][29626:29628] CHIP:TOO:     groupKeySet: {
-           [1674110375.914293][29626:29628] CHIP:TOO:       GroupKeySetID: 419
-           [1674110375.914306][29626:29628] CHIP:TOO:       GroupKeySecurityPolicy: 0
-           [1674110375.914317][29626:29628] CHIP:TOO:       EpochKey0: null
-           [1674110375.914329][29626:29628] CHIP:TOO:       EpochStartTime0: 2220000
-           [1674110375.914339][29626:29628] CHIP:TOO:       EpochKey1: null
-           [1674110375.914350][29626:29628] CHIP:TOO:       EpochStartTime1: 2220001
-           [1674110375.914359][29626:29628] CHIP:TOO:       EpochKey2: null
-           [1674110375.914369][29626:29628] CHIP:TOO:       EpochStartTime2: 2220002
-           [1674110375.914379][29626:29628] CHIP:TOO:      }
-           [1674110375.914390][29626:29628] CHIP:TOO:    }
-      disabled: true
-
-    - label:
-          "TH reads GroupKeyMap Attribute from the GroupKeyManagement cluster
-          from DUT"
-      verification: |
-          ./chip-tool groupkeymanagement read group-key-map 1 0
-
-            [1674110435.952959][29634:29636] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003F Attribute 0x0000_0000 DataVersion: 624171954
-            [1674110435.953367][29634:29636] CHIP:TOO:   GroupKeyMap: 1 entries
-            [1674110435.953401][29634:29636] CHIP:TOO:     [1]: {
-            [1674110435.953407][29634:29636] CHIP:TOO:       GroupId: 259
-            [1674110435.953411][29634:29636] CHIP:TOO:       GroupKeySetID: 419
-            [1674110435.953414][29634:29636] CHIP:TOO:       FabricIndex: 1
-            [1674110435.953417][29634:29636] CHIP:TOO:      }
-      disabled: true
-
-    - label:
-          "TH reads GroupTable attribute from GroupKeyManagement cluster on DUT
-          using a fabric-filtered read."
+    - label: "TH reads GroupTable attribute"
+      cluster: "Group Key Management"
+      endpoint: 0
       PICS: G.S.F00
-      verification: |
-          ./chip-tool groupkeymanagement read group-table 1 0
+      command: "readAttribute"
+      attribute: "GroupTable"
+      response:
+          value:
+              [
+                  {
+                      GroupId: 0x0103,
+                      Endpoints: [endpoint],
+                      GroupName: "Test Group",
+                  },
+              ]
 
-            [1674110549.621751][29686:29688] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003F Attribute 0x0000_0001 DataVersion: 624171954
-            [1674110549.621779][29686:29688] CHIP:TOO:   GroupTable: 1 entries
-            [1674110549.621810][29686:29688] CHIP:TOO:     [1]: {
-            [1674110549.621819][29686:29688] CHIP:TOO:       GroupId: 259
-            [1674110549.621826][29686:29688] CHIP:TOO:       Endpoints: 1 entries
-            [1674110549.621833][29686:29688] CHIP:TOO:         [1]: 1
-            [1674110549.621839][29686:29688] CHIP:TOO:       GroupName: Test Group
-            [1674110549.621845][29686:29688] CHIP:TOO:       FabricIndex: 1
-            [1674110549.621849][29686:29688] CHIP:TOO:      }
-      disabled: true
+    - label: "TH reads GroupTable attribute"
+      cluster: "Group Key Management"
+      endpoint: 0
+      PICS: "!(G.S.F00)"
+      command: "readAttribute"
+      attribute: "GroupTable"
+      response:
+          value: [{ GroupId: 0x0103, Endpoints: [endpoint], GroupName: "" }]
 
-    - label:
-          "TH reads GroupTable attribute from GroupKeyManagement cluster on DUT
-          using a fabric-filtered read."
-      PICS: " !G.S.F00 "
-      verification: |
-          F00(GN) feature is supporting for GroupTable attribute
-      disabled: true
+    - label: "TH removes the GroupKeySet"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "KeySetRemove"
+      arguments:
+          values:
+              - name: GroupKeySetID
+                value: 0x01a3
 
-    - label:
-          "TH removes the Group key set that was added by sending a KeySetRemove
-          command to the GroupKeyManagement cluster with the GroupKeySetID field
-          set to 0x01a3"
-      verification: |
-          ./chip-tool groupkeymanagement key-set-remove "0x01a3" 1 0
+    - label: "TH verifies the corresponding GroupKeyMap entry has been removed"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "readAttribute"
+      attribute: "GroupKeyMap"
+      response:
+          value: []
 
+    - label: "TH cleans up groups using RemoveAllGroups command"
+      command: "RemoveAllGroups"
 
-            [1674110684.044225][29696:29698] CHIP:DMG: InvokeResponseMessage =
-            [1674110684.044235][29696:29698] CHIP:DMG: {
-            [1674110684.044246][29696:29698] CHIP:DMG:         suppressResponse = false,
-            [1674110684.044256][29696:29698] CHIP:DMG:         InvokeResponseIBs =
-            [1674110684.044277][29696:29698] CHIP:DMG:         [
-            [1674110684.044288][29696:29698] CHIP:DMG:                 InvokeResponseIB =
-            [1674110684.044310][29696:29698] CHIP:DMG:                 {
-            [1674110684.044320][29696:29698] CHIP:DMG:                         CommandStatusIB =
-            [1674110684.044334][29696:29698] CHIP:DMG:                         {
-            [1674110684.044345][29696:29698] CHIP:DMG:                                 CommandPathIB =
-            [1674110684.044358][29696:29698] CHIP:DMG:                                 {
-            [1674110684.044372][29696:29698] CHIP:DMG:                                         EndpointId = 0x0,
-            [1674110684.044385][29696:29698] CHIP:DMG:                                         ClusterId = 0x3f,
-            [1674110684.044397][29696:29698] CHIP:DMG:                                         CommandId = 0x3,
-            [1674110684.044408][29696:29698] CHIP:DMG:                                 },
-            [1674110684.044426][29696:29698] CHIP:DMG:
-            [1674110684.044438][29696:29698] CHIP:DMG:                                 StatusIB =
-            [1674110684.044452][29696:29698] CHIP:DMG:                                 {
-            [1674110684.044465][29696:29698] CHIP:DMG:                                         status = 0x00 (SUCCESS),
-            [1674110684.044476][29696:29698] CHIP:DMG:                                 },
-            [1674110684.044490][29696:29698] CHIP:DMG:
-            [1674110684.044499][29696:29698] CHIP:DMG:                         },
-            [1674110684.044517][29696:29698] CHIP:DMG:
-            [1674110684.044527][29696:29698] CHIP:DMG:                 },
-            [1674110684.044543][29696:29698] CHIP:DMG:
-            [1674110684.044553][29696:29698] CHIP:DMG:         ],
-            [1674110684.044572][29696:29698] CHIP:DMG:
-            [1674110684.044583][29696:29698] CHIP:DMG:         InteractionModelRevision = 1
-            [1674110684.044592][29696:29698] CHIP:DMG: },
-      disabled: true
+    - label: "TH verifies the group has been removed in the GroupTable"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "readAttribute"
+      attribute: "GroupTable"
+      response:
+          value: []
 
-    - label:
-          "TH verifies that the key set removal in step 10 also removed the
-          corresponding entries in the GroupKeyMap by Reading the GroupKeyMap
-          attribute from the GroupKeyManagement cluster using a fabric-filtered
-          read."
-      verification: |
-          " ./chip-tool groupkeymanagement read group-key-map 1 0
-
-
-            [1674110744.294550][29707:29709] CHIP:DMG: ReportDataMessage =
-            [1674110744.294570][29707:29709] CHIP:DMG: {
-            [1674110744.294583][29707:29709] CHIP:DMG: 	AttributeReportIBs =
-            [1674110744.294611][29707:29709] CHIP:DMG: 	[
-            [1674110744.294626][29707:29709] CHIP:DMG: 		AttributeReportIB =
-            [1674110744.294654][29707:29709] CHIP:DMG: 		{
-            [1674110744.294667][29707:29709] CHIP:DMG: 			AttributeDataIB =
-            [1674110744.294686][29707:29709] CHIP:DMG: 			{
-            [1674110744.294703][29707:29709] CHIP:DMG: 				DataVersion = 0x25341bb2,
-            [1674110744.294719][29707:29709] CHIP:DMG: 				AttributePathIB =
-            [1674110744.294739][29707:29709] CHIP:DMG: 				{
-            [1674110744.294756][29707:29709] CHIP:DMG: 					Endpoint = 0x0,
-            [1674110744.294773][29707:29709] CHIP:DMG: 					Cluster = 0x3f,
-            [1674110744.294847][29707:29709] CHIP:DMG: 					Attribute = 0x0000_0000,
-            [1674110744.294864][29707:29709] CHIP:DMG: 				}
-            [1674110744.294885][29707:29709] CHIP:DMG:
-            [1674110744.294900][29707:29709] CHIP:DMG: 				Data = [
-            [1674110744.294917][29707:29709] CHIP:DMG:
-            [1674110744.294935][29707:29709] CHIP:DMG: 				],
-            [1674110744.294950][29707:29709] CHIP:DMG: 			},
-            [1674110744.294974][29707:29709] CHIP:DMG:
-            [1674110744.294986][29707:29709] CHIP:DMG: 		},
-            [1674110744.295012][29707:29709] CHIP:DMG:
-            [1674110744.295023][29707:29709] CHIP:DMG: 	],
-            [1674110744.295050][29707:29709] CHIP:DMG:
-            [1674110744.295063][29707:29709] CHIP:DMG: 	SuppressResponse = true,
-            [1674110744.295079][29707:29709] CHIP:DMG: 	InteractionModelRevision = 1
-            [1674110744.295093][29707:29709] CHIP:DMG: }
-            [1674110744.295288][29707:29709] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003F Attribute 0x0000_0000 DataVersion: 624171954
-            [1674110744.295368][29707:29709] CHIP:TOO:   GroupKeyMap: 0 entries"
-      disabled: true
-
-    - label:
-          "TH cleans up the groups by sending the RemoveAllGroups command to the
-          DUT on PIXIT.G.ENDPOINT"
-      verification: |
-          "./chip-tool groups remove-all-groups 1 1
-
-            [1674110831.412092][29723:29725] CHIP:DMG: InvokeResponseMessage =
-            [1674110831.412097][29723:29725] CHIP:DMG: {
-            [1674110831.412101][29723:29725] CHIP:DMG: 	suppressResponse = false,
-            [1674110831.412104][29723:29725] CHIP:DMG: 	InvokeResponseIBs =
-            [1674110831.412111][29723:29725] CHIP:DMG: 	[
-            [1674110831.412114][29723:29725] CHIP:DMG: 		InvokeResponseIB =
-            [1674110831.412121][29723:29725] CHIP:DMG: 		{
-            [1674110831.412125][29723:29725] CHIP:DMG: 			CommandStatusIB =
-            [1674110831.412130][29723:29725] CHIP:DMG: 			{
-            [1674110831.412134][29723:29725] CHIP:DMG: 				CommandPathIB =
-            [1674110831.412138][29723:29725] CHIP:DMG: 				{
-            [1674110831.412141][29723:29725] CHIP:DMG: 					EndpointId = 0x1,
-            [1674110831.412145][29723:29725] CHIP:DMG: 					ClusterId = 0x4,
-            [1674110831.412149][29723:29725] CHIP:DMG: 					CommandId = 0x4,
-            [1674110831.412153][29723:29725] CHIP:DMG: 				},
-            [1674110831.412158][29723:29725] CHIP:DMG:
-            [1674110831.412162][29723:29725] CHIP:DMG: 				StatusIB =
-            [1674110831.412168][29723:29725] CHIP:DMG: 				{
-            [1674110831.412172][29723:29725] CHIP:DMG: 					status = 0x00 (SUCCESS),
-            [1674110831.412175][29723:29725] CHIP:DMG: 				},
-            [1674110831.412180][29723:29725] CHIP:DMG:
-            [1674110831.412182][29723:29725] CHIP:DMG: 			},
-            [1674110831.412188][29723:29725] CHIP:DMG:
-            [1674110831.412191][29723:29725] CHIP:DMG: 		},
-            [1674110831.412195][29723:29725] CHIP:DMG:
-            [1674110831.412198][29723:29725] CHIP:DMG: 	],
-            [1674110831.412204][29723:29725] CHIP:DMG:
-            [1674110831.412207][29723:29725] CHIP:DMG: 	InteractionModelRevision = 1
-            [1674110831.412209][29723:29725] CHIP:DMG: },"
-      disabled: true
-
-    - label:
-          "TH reads verifies the group has been removed by reading the
-          GroupTable attribute from GroupKeyManagement cluster on DUT using a
-          fabric-filtered read."
-      verification: |
-          ./chip-tool groupkeymanagement read group-table 1 0
-
-
-            [1674110892.787761][29730:29732] CHIP:DMG: ReportDataMessage =
-            [1674110892.787768][29730:29732] CHIP:DMG: {
-            [1674110892.787772][29730:29732] CHIP:DMG: 	AttributeReportIBs =
-            [1674110892.787780][29730:29732] CHIP:DMG: 	[
-            [1674110892.787783][29730:29732] CHIP:DMG: 		AttributeReportIB =
-            [1674110892.787789][29730:29732] CHIP:DMG: 		{
-            [1674110892.787792][29730:29732] CHIP:DMG: 			AttributeDataIB =
-            [1674110892.787797][29730:29732] CHIP:DMG: 			{
-            [1674110892.787803][29730:29732] CHIP:DMG: 				DataVersion = 0x25341bb2,
-            [1674110892.787806][29730:29732] CHIP:DMG: 				AttributePathIB =
-            [1674110892.787811][29730:29732] CHIP:DMG: 				{
-            [1674110892.787815][29730:29732] CHIP:DMG: 					Endpoint = 0x0,
-            [1674110892.787819][29730:29732] CHIP:DMG: 					Cluster = 0x3f,
-            [1674110892.787825][29730:29732] CHIP:DMG: 					Attribute = 0x0000_0001,
-            [1674110892.787828][29730:29732] CHIP:DMG: 				}
-            [1674110892.787834][29730:29732] CHIP:DMG:
-            [1674110892.787840][29730:29732] CHIP:DMG: 				Data = [
-            [1674110892.787843][29730:29732] CHIP:DMG:
-            [1674110892.787847][29730:29732] CHIP:DMG: 				],
-            [1674110892.787850][29730:29732] CHIP:DMG: 			},
-            [1674110892.787855][29730:29732] CHIP:DMG:
-            [1674110892.787858][29730:29732] CHIP:DMG: 		},
-            [1674110892.787863][29730:29732] CHIP:DMG:
-            [1674110892.787865][29730:29732] CHIP:DMG: 	],
-            [1674110892.787871][29730:29732] CHIP:DMG:
-            [1674110892.787875][29730:29732] CHIP:DMG: 	SuppressResponse = true,
-            [1674110892.787878][29730:29732] CHIP:DMG: 	InteractionModelRevision = 1
-            [1674110892.787881][29730:29732] CHIP:DMG: }
-            [1674110892.787953][29730:29732] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003F Attribute 0x0000_0001 DataVersion: 624171954
-            [1674110892.787973][29730:29732] CHIP:TOO:   GroupTable: 0 entries
-      disabled: true
-
-    - label:
-          "TH writes The ACL attribute in the Access Control cluster to remove
-          Operate privileges for group 0x0103 and maintain the current
-          administrative privileges for the TH. The following access control
-          list shall be used: List item 1 (TH admin): Fabric index: 1,Privilege:
-          Administer (5),AuthMode: CASE (2),Subjects: TH node id ([N1]),
-          Targets: all (null)"
-      verification: |
-          Verify that the DUT sends SUCCESS response.
-      disabled: true
+    - label: "TH removes ACL Operate privileges for Group 0x0103"
+      cluster: "Access Control"
+      endpoint: 0
+      command: "writeAttribute"
+      attribute: "ACL"
+      arguments:
+          value:
+              [
+                  {
+                      FabricIndex: 1,
+                      Privilege: 5,
+                      AuthMode: 2,
+                      Subjects: [commissionerNodeId],
+                      Targets: null,
+                  },
+              ]
diff --git a/src/app/tests/suites/certification/Test_TC_SC_5_2.yaml b/src/app/tests/suites/certification/Test_TC_SC_5_2.yaml
index 152752b..fea8bac 100644
--- a/src/app/tests/suites/certification/Test_TC_SC_5_2.yaml
+++ b/src/app/tests/suites/certification/Test_TC_SC_5_2.yaml
@@ -20,47 +20,141 @@
 
 config:
     nodeId: 0x12344321
-    cluster: "Basic Information"
-    endpoint: 0
+    cluster: "Groups"
+    # Users should set endpoint value on the command line to PIXIT.G.ENDPOINT
+    endpoint: 1
 
 tests:
-    - label: "Precondition"
-      verification: |
-          DUT and TH are commissioned.
+    - label: "Wait for the commissioned device to be retrieved"
+      cluster: "DelayCommands"
+      command: "WaitForCommissionee"
+      arguments:
+          values:
+              - name: "nodeId"
+                value: nodeId
 
-          DUT and TH are part of a common group.- Run TC-SC-5.1 to establish this precondition
+    - label: "TH adds ACL Operate privileges for Group 0x0103"
+      cluster: "Access Control"
+      endpoint: 0
+      command: "writeAttribute"
+      attribute: "ACL"
+      arguments:
+          value:
+              [
+                  {
+                      FabricIndex: 1,
+                      Privilege: 5,
+                      AuthMode: 2,
+                      Subjects: [commissionerNodeId],
+                      Targets: null,
+                  },
+                  {
+                      FabricIndex: 1,
+                      Privilege: 3,
+                      AuthMode: 3,
+                      Subjects: [0x0103],
+                      Targets: null,
+                  },
+              ]
 
-          DUT supports the Identify cluster
-      disabled: true
+    - label: "TH sends KeySetWrite command with TH key"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "KeySetWrite"
+      arguments:
+          values:
+              - name: GroupKeySet
+                value:
+                    {
+                        GroupKeySetID: 0x01a3,
+                        GroupKeySecurityPolicy: 0,
+                        EpochKey0: "0xd0d1d2d3d4d5d6d7d8d9dadbdcdddedf",
+                        EpochStartTime0: 2220000,
+                        EpochKey1: "0xd1d1d2d3d4d5d6d7d8d9dadbdcdddedf",
+                        EpochStartTime1: 2220001,
+                        EpochKey2: "0xd2d1d2d3d4d5d6d7d8d9dadbdcdddedf",
+                        EpochStartTime2: 2220002,
+                    }
 
-    - label: "TH writes ACL entry by setting AuthMode as Group to DUT"
-      verification: |
-          As this step is executed in the TC-SC-5.1, we can skip this step during execution.
-      disabled: true
+    - label: "TH binds GroupId to GroupKeySet"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "writeAttribute"
+      attribute: "GroupKeyMap"
+      arguments:
+          value: [{ FabricIndex: 1, GroupId: 0x0103, GroupKeySetID: 0x01a3 }]
 
-    - label:
-          "TH sends a multicast Identify command with the IdentifyTime set to
-          0x0078 (120s) to DUT with GroupID and PIXIT.G.ENDPOINT"
-      PICS: I.S.C00.Rsp
-      verification: |
-          ./chip-tool identify identify 0x0078 0xffffffffffff0001 1
+    - label: "TH sends RemoveAllGroups command"
+      command: "RemoveAllGroups"
 
-          Verify Identify command on the TH(chip-tool) Log and below is the sample log provided for the raspi platform:
+    - label: "TH sends AddGroup command"
+      command: "AddGroup"
+      arguments:
+          values:
+              - name: GroupID
+                value: 0x0103
+              - name: GroupName
+                value: "Test Group"
 
+    - label: "TH sends ViewGroup command using group messaging"
+      PICS: G.S.F00
+      command: "ViewGroup"
+      groupId: 0x0103
+      arguments:
+          values:
+              - name: GroupID
+                value: 0x0103
+      response:
+          values:
+              - name: Status
+                value: 0
+              - name: GroupID
+                value: 0x0103
+              - name: GroupName
+                value: "Test Group"
 
-          [1657785273.973231][1618:1623] CHIP:DL: HandlePlatformSpecificBLEEvent 32784[1657785273.973291][1618:1623] CHIP:TOO: Sending command to group 0x1
-          [1657785273.973316][1618:1623] CHIP:TOO: Sending cluster (0x00000003) command (0x00000000) on Group 1
-      disabled: true
+    - label: "TH sends ViewGroup command using group messaging"
+      PICS: "!(G.S.F00)"
+      command: "ViewGroup"
+      groupId: 0x0103
+      arguments:
+          values:
+              - name: GroupID
+                value: 0x0103
+      response:
+          values:
+              - name: Status
+                value: 0
+              - name: GroupID
+                value: 0x0103
+              - name: GroupName
+                value: ""
 
-    - label:
-          "TH reads immediately IdentifyTime attribute from DUT on the
-          PIXIT.G.ENDPOINT set by DUT"
-      PICS: I.S.A0000
-      verification: |
-          ./chip-tool identify read identify-time 1 1
+    - label: "TH removes the GroupKeySet"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "KeySetRemove"
+      arguments:
+          values:
+              - name: GroupKeySetID
+                value: 0x01a3
 
-          Verify  Identify time is approximately equal to 0x0078 (120s),on the TH(chip-tool)  Log and below is the sample log provided for the raspi platform:
+    - label: "TH cleans up groups using RemoveAllGroups command"
+      command: "RemoveAllGroups"
 
-          [1657785288.647504][1624:1629] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0003 Attribute 0x0000_0000 DataVersion: 1130139861
-          [1657785288.647621][1624:1629] CHIP:TOO:   identify time: 120
-      disabled: true
+    - label: "TH removes ACL Operate privileges for Group 0x0103"
+      cluster: "Access Control"
+      endpoint: 0
+      command: "writeAttribute"
+      attribute: "ACL"
+      arguments:
+          value:
+              [
+                  {
+                      FabricIndex: 1,
+                      Privilege: 5,
+                      AuthMode: 2,
+                      Subjects: [commissionerNodeId],
+                      Targets: null,
+                  },
+              ]
diff --git a/src/app/tests/suites/ciTests.json b/src/app/tests/suites/ciTests.json
index b216318..857e538 100644
--- a/src/app/tests/suites/ciTests.json
+++ b/src/app/tests/suites/ciTests.json
@@ -154,7 +154,7 @@
     ],
     "PowerSourceConfiguration": ["Test_TC_PSCFG_1_1", "Test_TC_PSCFG_2_1"],
     "RelativeHumidityMeasurement": ["Test_TC_RH_1_1", "Test_TC_RH_2_1"],
-    "SecureChannel": [],
+    "SecureChannel": ["Test_TC_SC_5_1", "Test_TC_SC_5_2"],
     "Switch": ["Test_TC_SWTCH_1_1", "Test_TC_SWTCH_2_1"],
     "TemperatureMeasurement": ["Test_TC_TMP_1_1", "Test_TC_TMP_2_1"],
     "Thermostat": [
diff --git a/src/app/tests/suites/manualTests.json b/src/app/tests/suites/manualTests.json
index 9f3d106..f821ed9 100644
--- a/src/app/tests/suites/manualTests.json
+++ b/src/app/tests/suites/manualTests.json
@@ -227,8 +227,6 @@
         "Test_TC_SC_4_8",
         "Test_TC_SC_4_9",
         "Test_TC_SC_4_10",
-        "Test_TC_SC_5_1",
-        "Test_TC_SC_5_2",
         "Test_TC_SC_5_3",
         "Test_TC_SC_6_1"
     ],
diff --git a/src/lib/support/TestGroupData.h b/src/lib/support/TestGroupData.h
index 13c49ee..4cadb3a 100644
--- a/src/lib/support/TestGroupData.h
+++ b/src/lib/support/TestGroupData.h
@@ -44,8 +44,10 @@
 {
     static const chip::GroupId kGroup1   = 0x0101;
     static const chip::GroupId kGroup2   = 0x0102;
+    static const chip::GroupId kGroup3   = 0x0103;
     static const chip::KeysetId kKeySet1 = 0x01a1;
     static const chip::KeysetId kKeySet2 = 0x01a2;
+    static const chip::KeysetId kKeySet3 = 0x01a3;
 
     // Groups
 
@@ -57,6 +59,10 @@
     ReturnErrorOnFailure(provider->SetGroupInfo(fabric_index, group2));
     ReturnErrorOnFailure(provider->AddEndpoint(fabric_index, group2.group_id, 0));
 
+    const chip::Credentials::GroupDataProvider::GroupInfo group3(kGroup3, "Group #3");
+    ReturnErrorOnFailure(provider->SetGroupInfo(fabric_index, group3));
+    ReturnErrorOnFailure(provider->AddEndpoint(fabric_index, group3.group_id, 0));
+
     // Key Sets
 
     chip::Credentials::GroupDataProvider::KeySet keyset1(kKeySet1,
@@ -81,8 +87,20 @@
     err = provider->SetKeySet(fabric_index, compressed_fabric_id, keyset2);
     ReturnErrorOnFailure(err);
 
+    chip::Credentials::GroupDataProvider::KeySet keyset3(kKeySet3,
+                                                         chip::Credentials::GroupDataProvider::SecurityPolicy::kTrustFirst, 3);
+    const chip::Credentials::GroupDataProvider::EpochKey epoch_keys3[] = {
+        { 2220000, { 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf } },
+        { 2220001, { 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf } },
+        { 2220002, { 0xd2, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf } },
+    };
+    memcpy(keyset3.epoch_keys, epoch_keys3, sizeof(epoch_keys3));
+    err = provider->SetKeySet(fabric_index, compressed_fabric_id, keyset3);
+    ReturnErrorOnFailure(err);
+
     provider->SetGroupKeyAt(fabric_index, 0, chip::Credentials::GroupDataProvider::GroupKey(kGroup1, kKeySet1));
     provider->SetGroupKeyAt(fabric_index, 1, chip::Credentials::GroupDataProvider::GroupKey(kGroup2, kKeySet2));
+    provider->SetGroupKeyAt(fabric_index, 2, chip::Credentials::GroupDataProvider::GroupKey(kGroup3, kKeySet3));
 
     return CHIP_NO_ERROR;
 }
diff --git a/zzz_generated/chip-tool/zap-generated/test/Commands.h b/zzz_generated/chip-tool/zap-generated/test/Commands.h
index 06c412d..1eaa2e8 100644
--- a/zzz_generated/chip-tool/zap-generated/test/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/test/Commands.h
@@ -165,6 +165,8 @@
         printf("Test_TC_PSCFG_2_1\n");
         printf("Test_TC_RH_1_1\n");
         printf("Test_TC_RH_2_1\n");
+        printf("Test_TC_SC_5_1\n");
+        printf("Test_TC_SC_5_2\n");
         printf("Test_TC_SWTCH_1_1\n");
         printf("Test_TC_SWTCH_2_1\n");
         printf("Test_TC_TMP_1_1\n");
@@ -484,8 +486,6 @@
         printf("Test_TC_SC_4_8\n");
         printf("Test_TC_SC_4_9\n");
         printf("Test_TC_SC_4_10\n");
-        printf("Test_TC_SC_5_1\n");
-        printf("Test_TC_SC_5_2\n");
         printf("Test_TC_SC_5_3\n");
         printf("Test_TC_SC_6_1\n");
         printf("Test_TC_DGSW_2_1\n");
@@ -40972,6 +40972,793 @@
     }
 };
 
+class Test_TC_SC_5_1Suite : public TestCommand
+{
+public:
+    Test_TC_SC_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_5_1", 17, credsIssuerConfig)
+    {
+        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
+        AddArgument("cluster", &mCluster);
+        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
+        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
+    }
+
+    ~Test_TC_SC_5_1Suite() {}
+
+    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> mTimeout;
+
+    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
+    {
+
+        // Allow yaml to access the current commissioner node id.
+        // Default to 0 (undefined node id) so we know if this isn't
+        // set correctly.
+        // Reset on every step in case it changed.
+        chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        (void) commissionerNodeId;
+
+        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));
+            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));
+            break;
+        case 5:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 6:
+            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)));
+            }
+            break;
+        case 7:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 259U));
+                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Test Group", 10)));
+            }
+            break;
+        case 8:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 259U));
+                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("", 0)));
+            }
+            break;
+        case 9:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("groupKeySet.groupKeySetID", value.groupKeySet.groupKeySetID, 419U));
+                VerifyOrReturn(CheckValue("groupKeySet.groupKeySecurityPolicy", value.groupKeySet.groupKeySecurityPolicy, 0U));
+                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey0", value.groupKeySet.epochKey0));
+                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime0", value.groupKeySet.epochStartTime0));
+                VerifyOrReturn(
+                    CheckValue("groupKeySet.epochStartTime0.Value()", value.groupKeySet.epochStartTime0.Value(), 2220000ULL));
+                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey1", value.groupKeySet.epochKey1));
+                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime1", value.groupKeySet.epochStartTime1));
+                VerifyOrReturn(
+                    CheckValue("groupKeySet.epochStartTime1.Value()", value.groupKeySet.epochStartTime1.Value(), 2220001ULL));
+                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey2", value.groupKeySet.epochKey2));
+                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime2", value.groupKeySet.epochStartTime2));
+                VerifyOrReturn(
+                    CheckValue("groupKeySet.epochStartTime2.Value()", value.groupKeySet.epochStartTime2.Value(), 2220002ULL));
+            }
+            break;
+        case 10:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::DataModel::DecodableList<
+                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
+                    value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                {
+                    auto iter_0 = value.begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
+                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 259U));
+                    {
+                        auto iter_2 = iter_0.GetValue().endpoints.begin();
+                        VerifyOrReturn(
+                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 0));
+                        VerifyOrReturn(CheckValue("groupTable[0].endpoints[0]", iter_2.GetValue(),
+                                                  mEndpoint.HasValue() ? mEndpoint.Value() : 1U));
+                        VerifyOrReturn(
+                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 1));
+                    }
+                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
+                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
+                                                      chip::CharSpan("Test Group", 10)));
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 1));
+                }
+            }
+            break;
+        case 11:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::DataModel::DecodableList<
+                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
+                    value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                {
+                    auto iter_0 = value.begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
+                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 259U));
+                    {
+                        auto iter_2 = iter_0.GetValue().endpoints.begin();
+                        VerifyOrReturn(
+                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 0));
+                        VerifyOrReturn(CheckValue("groupTable[0].endpoints[0]", iter_2.GetValue(),
+                                                  mEndpoint.HasValue() ? mEndpoint.Value() : 1U));
+                        VerifyOrReturn(
+                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 1));
+                    }
+                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
+                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
+                                                      chip::CharSpan("", 0)));
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 1));
+                }
+            }
+            break;
+        case 12:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 13:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::DataModel::DecodableList<
+                    chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
+                    value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                {
+                    auto iter_0 = value.begin();
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 0));
+                }
+            }
+            break;
+        case 14:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 15:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::DataModel::DecodableList<
+                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
+                    value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                {
+                    auto iter_0 = value.begin();
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 0));
+                }
+            }
+            break;
+        case 16:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            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;
+        // Allow yaml to access the current commissioner node id.
+        // Default to 0 (undefined node id) so we know if this isn't
+        // set correctly.
+        // Reset on every step in case it changed.
+        chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        (void) commissionerNodeId;
+        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 adds ACL Operate privileges for Group 0x0103");
+            ListFreer listFreer;
+            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;
+
+            {
+                auto * listHolder_0 =
+                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
+                listFreer.add(listHolder_0);
+
+                listHolder_0->mList[0].privilege =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
+                listHolder_0->mList[0].authMode =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
+                listHolder_0->mList[0].subjects.SetNonNull();
+
+                {
+                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
+                    listFreer.add(listHolder_3);
+                    listHolder_3->mList[0]                  = commissionerNodeId;
+                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
+                }
+                listHolder_0->mList[0].targets.SetNull();
+                listHolder_0->mList[0].fabricIndex = 1U;
+
+                listHolder_0->mList[1].privilege =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
+                listHolder_0->mList[1].authMode =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
+                listHolder_0->mList[1].subjects.SetNonNull();
+
+                {
+                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
+                    listFreer.add(listHolder_3);
+                    listHolder_3->mList[0]                  = 259ULL;
+                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
+                }
+                listHolder_0->mList[1].targets.SetNull();
+                listHolder_0->mList[1].fabricIndex = 1U;
+
+                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
+                    listHolder_0->mList, 2);
+            }
+            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
+                                  chip::NullOptional, chip::NullOptional);
+        }
+        case 2: {
+            LogStep(2, "TH sends KeySetWrite command with incorrect key");
+            ListFreer listFreer;
+            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;
+
+            value.groupKeySet.groupKeySetID = 419U;
+            value.groupKeySet.groupKeySecurityPolicy =
+                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(0);
+            value.groupKeySet.epochKey0.SetNonNull();
+            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char("0x00000000000000000000000000000001garbage: not in length on purpose"), 34);
+            value.groupKeySet.epochStartTime0.SetNonNull();
+            value.groupKeySet.epochStartTime0.Value() = 111ULL;
+            value.groupKeySet.epochKey1.SetNonNull();
+            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char("0x00000000000000000000000000000002garbage: not in length on purpose"), 34);
+            value.groupKeySet.epochStartTime1.SetNonNull();
+            value.groupKeySet.epochStartTime1.Value() = 222ULL;
+            value.groupKeySet.epochKey2.SetNonNull();
+            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char("0x00000000000000000000000000000003garbage: not in length on purpose"), 34);
+            value.groupKeySet.epochStartTime2.SetNonNull();
+            value.groupKeySet.epochStartTime2.Value() = 333ULL;
+
+            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional
+
+            );
+        }
+        case 3: {
+            LogStep(3, "TH sends KeySetWrite command with TH key");
+            ListFreer listFreer;
+            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;
+
+            value.groupKeySet.groupKeySetID = 419U;
+            value.groupKeySet.groupKeySecurityPolicy =
+                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(0);
+            value.groupKeySet.epochKey0.SetNonNull();
+            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char("0xd0d1d2d3d4d5d6d7d8d9dadbdcdddedfgarbage: not in length on purpose"), 34);
+            value.groupKeySet.epochStartTime0.SetNonNull();
+            value.groupKeySet.epochStartTime0.Value() = 2220000ULL;
+            value.groupKeySet.epochKey1.SetNonNull();
+            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char("0xd1d1d2d3d4d5d6d7d8d9dadbdcdddedfgarbage: not in length on purpose"), 34);
+            value.groupKeySet.epochStartTime1.SetNonNull();
+            value.groupKeySet.epochStartTime1.Value() = 2220001ULL;
+            value.groupKeySet.epochKey2.SetNonNull();
+            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char("0xd2d1d2d3d4d5d6d7d8d9dadbdcdddedfgarbage: not in length on purpose"), 34);
+            value.groupKeySet.epochStartTime2.SetNonNull();
+            value.groupKeySet.epochStartTime2.Value() = 2220002ULL;
+
+            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional
+
+            );
+        }
+        case 4: {
+            LogStep(4, "TH binds GroupId to GroupKeySet");
+            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       = 259U;
+                listHolder_0->mList[0].groupKeySetID = 419U;
+                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 5: {
+            LogStep(5, "TH sends RemoveAllGroups command");
+            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 6: {
+            LogStep(6, "TH sends AddGroup command");
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
+            value.groupID   = 259U;
+            value.groupName = chip::Span<const char>("Test Groupgarbage: not in length on purpose", 10);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional
+
+            );
+        }
+        case 7: {
+            LogStep(7, "TH sends ViewGroup command");
+            VerifyOrDo(!ShouldSkip("G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
+            value.groupID = 259U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 8: {
+            LogStep(8, "TH sends ViewGroup command");
+            VerifyOrDo(!ShouldSkip("!(G.S.F00)"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
+            value.groupID = 259U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 9: {
+            LogStep(9, "TH sends KeySetRead");
+            ListFreer listFreer;
+            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value;
+            value.groupKeySetID = 419U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetRead::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 10: {
+            LogStep(10, "TH reads GroupTable attribute");
+            VerifyOrDo(!ShouldSkip("G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
+        }
+        case 11: {
+            LogStep(11, "TH reads GroupTable attribute");
+            VerifyOrDo(!ShouldSkip("!(G.S.F00)"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
+        }
+        case 12: {
+            LogStep(12, "TH removes the GroupKeySet");
+            ListFreer listFreer;
+            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value;
+            value.groupKeySetID = 419U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                               GroupKeyManagement::Commands::KeySetRemove::Id, value, chip::NullOptional
+
+            );
+        }
+        case 13: {
+            LogStep(13, "TH verifies the corresponding GroupKeyMap entry has been removed");
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, true, chip::NullOptional);
+        }
+        case 14: {
+            LogStep(14, "TH cleans up groups using RemoveAllGroups command");
+            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 15: {
+            LogStep(15, "TH verifies the group has been removed in the GroupTable");
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
+        }
+        case 16: {
+            LogStep(16, "TH removes ACL Operate privileges for Group 0x0103");
+            ListFreer listFreer;
+            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;
+
+            {
+                auto * listHolder_0 =
+                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
+                listFreer.add(listHolder_0);
+
+                listHolder_0->mList[0].privilege =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
+                listHolder_0->mList[0].authMode =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
+                listHolder_0->mList[0].subjects.SetNonNull();
+
+                {
+                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
+                    listFreer.add(listHolder_3);
+                    listHolder_3->mList[0]                  = commissionerNodeId;
+                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
+                }
+                listHolder_0->mList[0].targets.SetNull();
+                listHolder_0->mList[0].fabricIndex = 1U;
+
+                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
+                    listHolder_0->mList, 1);
+            }
+            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
+                                  chip::NullOptional, chip::NullOptional);
+        }
+        }
+        return CHIP_NO_ERROR;
+    }
+};
+
+class Test_TC_SC_5_2Suite : public TestCommand
+{
+public:
+    Test_TC_SC_5_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_5_2", 11, credsIssuerConfig)
+    {
+        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
+        AddArgument("cluster", &mCluster);
+        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
+        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
+    }
+
+    ~Test_TC_SC_5_2Suite() {}
+
+    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> mTimeout;
+
+    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
+    {
+
+        // Allow yaml to access the current commissioner node id.
+        // Default to 0 (undefined node id) so we know if this isn't
+        // set correctly.
+        // Reset on every step in case it changed.
+        chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        (void) commissionerNodeId;
+
+        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));
+            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));
+            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)));
+            }
+            break;
+        case 6:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 259U));
+                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Test Group", 10)));
+            }
+            break;
+        case 7:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 259U));
+                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("", 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;
+        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;
+        // Allow yaml to access the current commissioner node id.
+        // Default to 0 (undefined node id) so we know if this isn't
+        // set correctly.
+        // Reset on every step in case it changed.
+        chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        (void) commissionerNodeId;
+        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 adds ACL Operate privileges for Group 0x0103");
+            ListFreer listFreer;
+            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;
+
+            {
+                auto * listHolder_0 =
+                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
+                listFreer.add(listHolder_0);
+
+                listHolder_0->mList[0].privilege =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
+                listHolder_0->mList[0].authMode =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
+                listHolder_0->mList[0].subjects.SetNonNull();
+
+                {
+                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
+                    listFreer.add(listHolder_3);
+                    listHolder_3->mList[0]                  = commissionerNodeId;
+                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
+                }
+                listHolder_0->mList[0].targets.SetNull();
+                listHolder_0->mList[0].fabricIndex = 1U;
+
+                listHolder_0->mList[1].privilege =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
+                listHolder_0->mList[1].authMode =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
+                listHolder_0->mList[1].subjects.SetNonNull();
+
+                {
+                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
+                    listFreer.add(listHolder_3);
+                    listHolder_3->mList[0]                  = 259ULL;
+                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
+                }
+                listHolder_0->mList[1].targets.SetNull();
+                listHolder_0->mList[1].fabricIndex = 1U;
+
+                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
+                    listHolder_0->mList, 2);
+            }
+            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
+                                  chip::NullOptional, chip::NullOptional);
+        }
+        case 2: {
+            LogStep(2, "TH sends KeySetWrite command with TH key");
+            ListFreer listFreer;
+            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;
+
+            value.groupKeySet.groupKeySetID = 419U;
+            value.groupKeySet.groupKeySecurityPolicy =
+                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy>(0);
+            value.groupKeySet.epochKey0.SetNonNull();
+            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char("0xd0d1d2d3d4d5d6d7d8d9dadbdcdddedfgarbage: not in length on purpose"), 34);
+            value.groupKeySet.epochStartTime0.SetNonNull();
+            value.groupKeySet.epochStartTime0.Value() = 2220000ULL;
+            value.groupKeySet.epochKey1.SetNonNull();
+            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char("0xd1d1d2d3d4d5d6d7d8d9dadbdcdddedfgarbage: not in length on purpose"), 34);
+            value.groupKeySet.epochStartTime1.SetNonNull();
+            value.groupKeySet.epochStartTime1.Value() = 2220001ULL;
+            value.groupKeySet.epochKey2.SetNonNull();
+            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char("0xd2d1d2d3d4d5d6d7d8d9dadbdcdddedfgarbage: not in length on purpose"), 34);
+            value.groupKeySet.epochStartTime2.SetNonNull();
+            value.groupKeySet.epochStartTime2.Value() = 2220002ULL;
+
+            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional
+
+            );
+        }
+        case 3: {
+            LogStep(3, "TH binds GroupId to GroupKeySet");
+            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       = 259U;
+                listHolder_0->mList[0].groupKeySetID = 419U;
+                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 RemoveAllGroups command");
+            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 5: {
+            LogStep(5, "TH sends AddGroup command");
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
+            value.groupID   = 259U;
+            value.groupName = chip::Span<const char>("Test Groupgarbage: not in length on purpose", 10);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional
+
+            );
+        }
+        case 6: {
+            LogStep(6, "TH sends ViewGroup command using group messaging");
+            VerifyOrDo(!ShouldSkip("G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
+            value.groupID = 259U;
+            return SendGroupCommand(kIdentityAlpha, 259, Groups::Id, Groups::Commands::ViewGroup::Id, value);
+        }
+        case 7: {
+            LogStep(7, "TH sends ViewGroup command using group messaging");
+            VerifyOrDo(!ShouldSkip("!(G.S.F00)"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
+            value.groupID = 259U;
+            return SendGroupCommand(kIdentityAlpha, 259, Groups::Id, Groups::Commands::ViewGroup::Id, value);
+        }
+        case 8: {
+            LogStep(8, "TH removes the GroupKeySet");
+            ListFreer listFreer;
+            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value;
+            value.groupKeySetID = 419U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                               GroupKeyManagement::Commands::KeySetRemove::Id, value, chip::NullOptional
+
+            );
+        }
+        case 9: {
+            LogStep(9, "TH cleans up groups using RemoveAllGroups command");
+            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 10: {
+            LogStep(10, "TH removes ACL Operate privileges for Group 0x0103");
+            ListFreer listFreer;
+            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;
+
+            {
+                auto * listHolder_0 =
+                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
+                listFreer.add(listHolder_0);
+
+                listHolder_0->mList[0].privilege =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
+                listHolder_0->mList[0].authMode =
+                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
+                listHolder_0->mList[0].subjects.SetNonNull();
+
+                {
+                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
+                    listFreer.add(listHolder_3);
+                    listHolder_3->mList[0]                  = commissionerNodeId;
+                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
+                }
+                listHolder_0->mList[0].targets.SetNull();
+                listHolder_0->mList[0].fabricIndex = 1U;
+
+                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
+                    listHolder_0->mList, 1);
+            }
+            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
+                                  chip::NullOptional, chip::NullOptional);
+        }
+        }
+        return CHIP_NO_ERROR;
+    }
+};
+
 class Test_TC_SWTCH_1_1Suite : public TestCommand
 {
 public:
@@ -106132,144 +106919,6 @@
     }
 };
 
-class Test_TC_SC_5_1Suite : public TestCommand
-{
-public:
-    Test_TC_SC_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_5_1", 0, credsIssuerConfig)
-    {
-        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
-        AddArgument("cluster", &mCluster);
-        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
-        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
-    }
-
-    ~Test_TC_SC_5_1Suite() {}
-
-    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> mTimeout;
-
-    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
-    {
-
-        // Allow yaml to access the current commissioner node id.
-        // Default to 0 (undefined node id) so we know if this isn't
-        // set correctly.
-        // Reset on every step in case it changed.
-        chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
-        (void) commissionerNodeId;
-
-        bool shouldContinue = false;
-
-        switch (mTestIndex - 1)
-        {
-        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;
-        // Allow yaml to access the current commissioner node id.
-        // Default to 0 (undefined node id) so we know if this isn't
-        // set correctly.
-        // Reset on every step in case it changed.
-        chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
-        (void) commissionerNodeId;
-        switch (testIndex)
-        {}
-        return CHIP_NO_ERROR;
-    }
-};
-
-class Test_TC_SC_5_2Suite : public TestCommand
-{
-public:
-    Test_TC_SC_5_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_5_2", 0, credsIssuerConfig)
-    {
-        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
-        AddArgument("cluster", &mCluster);
-        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
-        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
-    }
-
-    ~Test_TC_SC_5_2Suite() {}
-
-    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> mTimeout;
-
-    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
-    {
-
-        // Allow yaml to access the current commissioner node id.
-        // Default to 0 (undefined node id) so we know if this isn't
-        // set correctly.
-        // Reset on every step in case it changed.
-        chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
-        (void) commissionerNodeId;
-
-        bool shouldContinue = false;
-
-        switch (mTestIndex - 1)
-        {
-        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;
-        // Allow yaml to access the current commissioner node id.
-        // Default to 0 (undefined node id) so we know if this isn't
-        // set correctly.
-        // Reset on every step in case it changed.
-        chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
-        (void) commissionerNodeId;
-        switch (testIndex)
-        {}
-        return CHIP_NO_ERROR;
-    }
-};
-
 class Test_TC_SC_5_3Suite : public TestCommand
 {
 public:
@@ -117180,6 +117829,8 @@
         make_unique<Test_TC_PSCFG_2_1Suite>(credsIssuerConfig),
         make_unique<Test_TC_RH_1_1Suite>(credsIssuerConfig),
         make_unique<Test_TC_RH_2_1Suite>(credsIssuerConfig),
+        make_unique<Test_TC_SC_5_1Suite>(credsIssuerConfig),
+        make_unique<Test_TC_SC_5_2Suite>(credsIssuerConfig),
         make_unique<Test_TC_SWTCH_1_1Suite>(credsIssuerConfig),
         make_unique<Test_TC_SWTCH_2_1Suite>(credsIssuerConfig),
         make_unique<Test_TC_TMP_1_1Suite>(credsIssuerConfig),
@@ -117488,8 +118139,6 @@
         make_unique<Test_TC_SC_4_8Suite>(credsIssuerConfig),
         make_unique<Test_TC_SC_4_9Suite>(credsIssuerConfig),
         make_unique<Test_TC_SC_4_10Suite>(credsIssuerConfig),
-        make_unique<Test_TC_SC_5_1Suite>(credsIssuerConfig),
-        make_unique<Test_TC_SC_5_2Suite>(credsIssuerConfig),
         make_unique<Test_TC_SC_5_3Suite>(credsIssuerConfig),
         make_unique<Test_TC_SC_6_1Suite>(credsIssuerConfig),
         make_unique<Test_TC_DGSW_2_1Suite>(credsIssuerConfig),
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 6d60cba..8d2baf9 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
@@ -152,6 +152,8 @@
         printf("Test_TC_PSCFG_2_1\n");
         printf("Test_TC_RH_1_1\n");
         printf("Test_TC_RH_2_1\n");
+        printf("Test_TC_SC_5_1\n");
+        printf("Test_TC_SC_5_2\n");
         printf("Test_TC_SWTCH_1_1\n");
         printf("Test_TC_TMP_1_1\n");
         printf("Test_TC_TMP_2_1\n");
@@ -57980,6 +57982,1263 @@
     }
 };
 
+class Test_TC_SC_5_1 : public TestCommandBridge {
+public:
+    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
+    Test_TC_SC_5_1()
+        : TestCommandBridge("Test_TC_SC_5_1")
+        , mTestIndex(0)
+    {
+        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
+        AddArgument("cluster", &mCluster);
+        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
+        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
+    }
+    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)
+
+    ~Test_TC_SC_5_1() {}
+
+    // Allow yaml to access the current commissioner node id.
+    // Default to 0 (undefined node id) so we know if this isn't
+    // set correctly.
+    // Reset on every step in case it changed.
+    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+
+    /////////// TestCommand Interface /////////
+    void NextTest() override
+    {
+        CHIP_ERROR err = CHIP_NO_ERROR;
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+
+        if (0 == mTestIndex) {
+            ChipLogProgress(chipTool, " **** Test Start: Test_TC_SC_5_1\n");
+        }
+
+        if (mTestCount == mTestIndex) {
+            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_SC_5_1\n");
+            SetCommandExitStatus(CHIP_NO_ERROR);
+            return;
+        }
+
+        Wait();
+
+        // Ensure we increment mTestIndex before we start running the relevant
+        // command.  That way if we lose the timeslice after we send the message
+        // but before our function call returns, we won't end up with an
+        // incorrect mTestIndex value observed when we get the response.
+        switch (mTestIndex++) {
+        case 0:
+            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
+            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
+            break;
+        case 1:
+            ChipLogProgress(chipTool, " ***** Test Step 1 : TH adds ACL Operate privileges for Group 0x0103\n");
+            err = TestThAddsAclOperatePrivilegesForGroup0x0103_1();
+            break;
+        case 2:
+            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends KeySetWrite command with incorrect key\n");
+            err = TestThSendsKeySetWriteCommandWithIncorrectKey_2();
+            break;
+        case 3:
+            ChipLogProgress(chipTool, " ***** Test Step 3 : TH sends KeySetWrite command with TH key\n");
+            err = TestThSendsKeySetWriteCommandWithThKey_3();
+            break;
+        case 4:
+            ChipLogProgress(chipTool, " ***** Test Step 4 : TH binds GroupId to GroupKeySet\n");
+            err = TestThBindsGroupIdToGroupKeySet_4();
+            break;
+        case 5:
+            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends RemoveAllGroups command\n");
+            err = TestThSendsRemoveAllGroupsCommand_5();
+            break;
+        case 6:
+            ChipLogProgress(chipTool, " ***** Test Step 6 : TH sends AddGroup command\n");
+            err = TestThSendsAddGroupCommand_6();
+            break;
+        case 7:
+            ChipLogProgress(chipTool, " ***** Test Step 7 : TH sends ViewGroup command\n");
+            if (ShouldSkip("G.S.F00")) {
+                NextTest();
+                return;
+            }
+            err = TestThSendsViewGroupCommand_7();
+            break;
+        case 8:
+            ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends ViewGroup command\n");
+            if (ShouldSkip("!(G.S.F00)")) {
+                NextTest();
+                return;
+            }
+            err = TestThSendsViewGroupCommand_8();
+            break;
+        case 9:
+            ChipLogProgress(chipTool, " ***** Test Step 9 : TH sends KeySetRead\n");
+            err = TestThSendsKeySetRead_9();
+            break;
+        case 10:
+            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads GroupTable attribute\n");
+            if (ShouldSkip("G.S.F00")) {
+                NextTest();
+                return;
+            }
+            err = TestThReadsGroupTableAttribute_10();
+            break;
+        case 11:
+            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads GroupTable attribute\n");
+            if (ShouldSkip("!(G.S.F00)")) {
+                NextTest();
+                return;
+            }
+            err = TestThReadsGroupTableAttribute_11();
+            break;
+        case 12:
+            ChipLogProgress(chipTool, " ***** Test Step 12 : TH removes the GroupKeySet\n");
+            err = TestThRemovesTheGroupKeySet_12();
+            break;
+        case 13:
+            ChipLogProgress(chipTool, " ***** Test Step 13 : TH verifies the corresponding GroupKeyMap entry has been removed\n");
+            err = TestThVerifiesTheCorrespondingGroupKeyMapEntryHasBeenRemoved_13();
+            break;
+        case 14:
+            ChipLogProgress(chipTool, " ***** Test Step 14 : TH cleans up groups using RemoveAllGroups command\n");
+            err = TestThCleansUpGroupsUsingRemoveAllGroupsCommand_14();
+            break;
+        case 15:
+            ChipLogProgress(chipTool, " ***** Test Step 15 : TH verifies the group has been removed in the GroupTable\n");
+            err = TestThVerifiesTheGroupHasBeenRemovedInTheGroupTable_15();
+            break;
+        case 16:
+            ChipLogProgress(chipTool, " ***** Test Step 16 : TH removes ACL Operate privileges for Group 0x0103\n");
+            err = TestThRemovesAclOperatePrivilegesForGroup0x0103_16();
+            break;
+        }
+
+        if (CHIP_NO_ERROR != err) {
+            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
+            SetCommandExitStatus(err);
+        }
+    }
+
+    void OnStatusUpdate(const chip::app::StatusIB & status) override
+    {
+        switch (mTestIndex - 1) {
+        case 0:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            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));
+            break;
+        case 5:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 6:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        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;
+        case 11:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 12:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 13:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 14:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 15:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 16:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        }
+
+        // Go on to the next test.
+        ContinueOnChipMainThread(CHIP_NO_ERROR);
+    }
+
+    chip::System::Clock::Timeout GetWaitDuration() const override
+    {
+        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
+    }
+
+private:
+    std::atomic_uint16_t mTestIndex;
+    const uint16_t mTestCount = 17;
+
+    chip::Optional<chip::NodeId> mNodeId;
+    chip::Optional<chip::CharSpan> mCluster;
+    chip::Optional<chip::EndpointId> mEndpoint;
+    chip::Optional<uint16_t> mTimeout;
+
+    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
+    {
+
+        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
+        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
+        return WaitForCommissionee("alpha", value);
+    }
+
+    CHIP_ERROR TestThAddsAclOperatePrivilegesForGroup0x0103_1()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        id aclArgument;
+        {
+            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
+            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
+            {
+                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
+                temp_3[0] = [NSNumber numberWithUnsignedLongLong:commissionerNodeId];
+                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
+            }
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];
+
+            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:3U];
+            {
+                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
+                temp_3[0] = [NSNumber numberWithUnsignedLongLong:259ULL];
+                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
+            }
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];
+
+            aclArgument = temp_0;
+        }
+        [cluster writeAttributeACLWithValue:aclArgument
+                                 completion:^(NSError * _Nullable err) {
+                                     NSLog(@"TH adds ACL Operate privileges for Group 0x0103 Error: %@", err);
+
+                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                     NextTest();
+                                 }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsKeySetWriteCommandWithIncorrectKey_2()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
+        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
+            [NSNumber numberWithUnsignedShort:419U];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
+            [NSNumber numberWithUnsignedChar:0U];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
+            [[NSData alloc] initWithBytes:"0x00000000000000000000000000000001" length:34];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
+            [NSNumber numberWithUnsignedLongLong:111ULL];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
+            [[NSData alloc] initWithBytes:"0x00000000000000000000000000000002" length:34];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
+            [NSNumber numberWithUnsignedLongLong:222ULL];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
+            [[NSData alloc] initWithBytes:"0x00000000000000000000000000000003" length:34];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
+            [NSNumber numberWithUnsignedLongLong:333ULL];
+
+        [cluster keySetWriteWithParams:params
+                            completion:^(NSError * _Nullable err) {
+                                NSLog(@"TH sends KeySetWrite command with incorrect key Error: %@", err);
+
+                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                NextTest();
+                            }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsKeySetWriteCommandWithThKey_3()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
+        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
+            [NSNumber numberWithUnsignedShort:419U];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
+            [NSNumber numberWithUnsignedChar:0U];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
+            [[NSData alloc] initWithBytes:"0xd0d1d2d3d4d5d6d7d8d9dadbdcdddedf" length:34];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
+            [NSNumber numberWithUnsignedLongLong:2220000ULL];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
+            [[NSData alloc] initWithBytes:"0xd1d1d2d3d4d5d6d7d8d9dadbdcdddedf" length:34];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
+            [NSNumber numberWithUnsignedLongLong:2220001ULL];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
+            [[NSData alloc] initWithBytes:"0xd2d1d2d3d4d5d6d7d8d9dadbdcdddedf" length:34];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
+            [NSNumber numberWithUnsignedLongLong:2220002ULL];
+
+        [cluster keySetWriteWithParams:params
+                            completion:^(NSError * _Nullable err) {
+                                NSLog(@"TH sends KeySetWrite command with TH key Error: %@", err);
+
+                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                NextTest();
+                            }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThBindsGroupIdToGroupKeySet_4()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        id groupKeyMapArgument;
+        {
+            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
+            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
+            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:259U];
+            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:419U];
+            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];
+
+            groupKeyMapArgument = temp_0;
+        }
+        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
+                                         completion:^(NSError * _Nullable err) {
+                                             NSLog(@"TH binds GroupId to GroupKeySet Error: %@", err);
+
+                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                             NextTest();
+                                         }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsRemoveAllGroupsCommand_5()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        [cluster removeAllGroupsWithCompletion:^(NSError * _Nullable err) {
+            NSLog(@"TH sends RemoveAllGroups command Error: %@", err);
+
+            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+            NextTest();
+        }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsAddGroupCommand_6()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
+        params.groupID = [NSNumber numberWithUnsignedShort:259U];
+        params.groupName = @"Test Group";
+        [cluster addGroupWithParams:params
+                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
+                             NSLog(@"TH sends AddGroup command Error: %@", err);
+
+                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                             NextTest();
+                         }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsViewGroupCommand_7()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
+        params.groupID = [NSNumber numberWithUnsignedShort:259U];
+        [cluster viewGroupWithParams:params
+                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
+                              NSLog(@"TH sends ViewGroup command Error: %@", err);
+
+                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                              {
+                                  id actualValue = values.status;
+                                  VerifyOrReturn(CheckValue("Status", actualValue, 0U));
+                              }
+
+                              {
+                                  id actualValue = values.groupID;
+                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 259U));
+                              }
+
+                              {
+                                  id actualValue = values.groupName;
+                                  VerifyOrReturn(CheckValueAsString("GroupName", actualValue, @"Test Group"));
+                              }
+
+                              NextTest();
+                          }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsViewGroupCommand_8()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
+        params.groupID = [NSNumber numberWithUnsignedShort:259U];
+        [cluster viewGroupWithParams:params
+                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
+                              NSLog(@"TH sends ViewGroup command Error: %@", err);
+
+                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                              {
+                                  id actualValue = values.status;
+                                  VerifyOrReturn(CheckValue("Status", actualValue, 0U));
+                              }
+
+                              {
+                                  id actualValue = values.groupID;
+                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 259U));
+                              }
+
+                              {
+                                  id actualValue = values.groupName;
+                                  VerifyOrReturn(CheckValueAsString("GroupName", actualValue, @""));
+                              }
+
+                              NextTest();
+                          }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsKeySetRead_9()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
+        params.groupKeySetID = [NSNumber numberWithUnsignedShort:419U];
+        [cluster
+            keySetReadWithParams:params
+                      completion:^(
+                          MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable values, NSError * _Nullable err) {
+                          NSLog(@"TH sends KeySetRead Error: %@", err);
+
+                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                          {
+                              id actualValue = values.groupKeySet;
+                              VerifyOrReturn(CheckValue("GroupKeySetID",
+                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).groupKeySetID, 419U));
+                              VerifyOrReturn(CheckValue("GroupKeySecurityPolicy",
+                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).groupKeySecurityPolicy, 0U));
+                              VerifyOrReturn(CheckValueNull(
+                                  "EpochKey0", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey0));
+                              VerifyOrReturn(CheckValueNonNull("EpochStartTime0",
+                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime0));
+                              VerifyOrReturn(CheckValue("EpochStartTime0",
+                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime0, 2220000ULL));
+                              VerifyOrReturn(CheckValueNull(
+                                  "EpochKey1", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey1));
+                              VerifyOrReturn(CheckValueNonNull("EpochStartTime1",
+                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime1));
+                              VerifyOrReturn(CheckValue("EpochStartTime1",
+                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime1, 2220001ULL));
+                              VerifyOrReturn(CheckValueNull(
+                                  "EpochKey2", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey2));
+                              VerifyOrReturn(CheckValueNonNull("EpochStartTime2",
+                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime2));
+                              VerifyOrReturn(CheckValue("EpochStartTime2",
+                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime2, 2220002ULL));
+                          }
+
+                          NextTest();
+                      }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThReadsGroupTableAttribute_10()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRReadParams alloc] init];
+        params.filterByFabric = true;
+        [cluster
+            readAttributeGroupTableWithParams:params
+                                   completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
+                                       NSLog(@"TH reads GroupTable attribute Error: %@", err);
+
+                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                       {
+                                           id actualValue = value;
+                                           VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast<uint32_t>(1)));
+                                           VerifyOrReturn(CheckValue("GroupId",
+                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupId, 259U));
+                                           VerifyOrReturn(CheckValue("Endpoints",
+                                               [((MTRGroupKeyManagementClusterGroupInfoMapStruct *)
+                                                       actualValue[0]).endpoints count],
+                                               static_cast<uint32_t>(1)));
+                                           VerifyOrReturn(CheckValue("",
+                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).endpoints[0],
+                                               mEndpoint.HasValue() ? mEndpoint.Value() : 1U));
+                                           VerifyOrReturn(CheckValueAsString("GroupName",
+                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupName,
+                                               @"Test Group"));
+                                       }
+
+                                       NextTest();
+                                   }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThReadsGroupTableAttribute_11()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRReadParams alloc] init];
+        params.filterByFabric = true;
+        [cluster
+            readAttributeGroupTableWithParams:params
+                                   completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
+                                       NSLog(@"TH reads GroupTable attribute Error: %@", err);
+
+                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                       {
+                                           id actualValue = value;
+                                           VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast<uint32_t>(1)));
+                                           VerifyOrReturn(CheckValue("GroupId",
+                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupId, 259U));
+                                           VerifyOrReturn(CheckValue("Endpoints",
+                                               [((MTRGroupKeyManagementClusterGroupInfoMapStruct *)
+                                                       actualValue[0]).endpoints count],
+                                               static_cast<uint32_t>(1)));
+                                           VerifyOrReturn(CheckValue("",
+                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).endpoints[0],
+                                               mEndpoint.HasValue() ? mEndpoint.Value() : 1U));
+                                           VerifyOrReturn(CheckValueAsString("GroupName",
+                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupName, @""));
+                                       }
+
+                                       NextTest();
+                                   }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThRemovesTheGroupKeySet_12()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
+        params.groupKeySetID = [NSNumber numberWithUnsignedShort:419U];
+        [cluster keySetRemoveWithParams:params
+                             completion:^(NSError * _Nullable err) {
+                                 NSLog(@"TH removes the GroupKeySet Error: %@", err);
+
+                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                 NextTest();
+                             }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThVerifiesTheCorrespondingGroupKeyMapEntryHasBeenRemoved_13()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRReadParams alloc] init];
+        params.filterByFabric = true;
+        [cluster
+            readAttributeGroupKeyMapWithParams:params
+                                    completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
+                                        NSLog(@"TH verifies the corresponding GroupKeyMap entry has been removed Error: %@", err);
+
+                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                        {
+                                            id actualValue = value;
+                                            VerifyOrReturn(
+                                                CheckValue("GroupKeyMap", [actualValue count], static_cast<uint32_t>(0)));
+                                        }
+
+                                        NextTest();
+                                    }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThCleansUpGroupsUsingRemoveAllGroupsCommand_14()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        [cluster removeAllGroupsWithCompletion:^(NSError * _Nullable err) {
+            NSLog(@"TH cleans up groups using RemoveAllGroups command Error: %@", err);
+
+            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+            NextTest();
+        }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThVerifiesTheGroupHasBeenRemovedInTheGroupTable_15()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRReadParams alloc] init];
+        params.filterByFabric = true;
+        [cluster
+            readAttributeGroupTableWithParams:params
+                                   completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
+                                       NSLog(@"TH verifies the group has been removed in the GroupTable Error: %@", err);
+
+                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                       {
+                                           id actualValue = value;
+                                           VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast<uint32_t>(0)));
+                                       }
+
+                                       NextTest();
+                                   }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThRemovesAclOperatePrivilegesForGroup0x0103_16()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        id aclArgument;
+        {
+            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
+            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
+            {
+                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
+                temp_3[0] = [NSNumber numberWithUnsignedLongLong:commissionerNodeId];
+                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
+            }
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];
+
+            aclArgument = temp_0;
+        }
+        [cluster writeAttributeACLWithValue:aclArgument
+                                 completion:^(NSError * _Nullable err) {
+                                     NSLog(@"TH removes ACL Operate privileges for Group 0x0103 Error: %@", err);
+
+                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                     NextTest();
+                                 }];
+
+        return CHIP_NO_ERROR;
+    }
+};
+
+class Test_TC_SC_5_2 : public TestCommandBridge {
+public:
+    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
+    Test_TC_SC_5_2()
+        : TestCommandBridge("Test_TC_SC_5_2")
+        , mTestIndex(0)
+    {
+        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
+        AddArgument("cluster", &mCluster);
+        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
+        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
+    }
+    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)
+
+    ~Test_TC_SC_5_2() {}
+
+    // Allow yaml to access the current commissioner node id.
+    // Default to 0 (undefined node id) so we know if this isn't
+    // set correctly.
+    // Reset on every step in case it changed.
+    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+
+    /////////// TestCommand Interface /////////
+    void NextTest() override
+    {
+        CHIP_ERROR err = CHIP_NO_ERROR;
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+
+        if (0 == mTestIndex) {
+            ChipLogProgress(chipTool, " **** Test Start: Test_TC_SC_5_2\n");
+        }
+
+        if (mTestCount == mTestIndex) {
+            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_SC_5_2\n");
+            SetCommandExitStatus(CHIP_NO_ERROR);
+            return;
+        }
+
+        Wait();
+
+        // Ensure we increment mTestIndex before we start running the relevant
+        // command.  That way if we lose the timeslice after we send the message
+        // but before our function call returns, we won't end up with an
+        // incorrect mTestIndex value observed when we get the response.
+        switch (mTestIndex++) {
+        case 0:
+            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
+            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
+            break;
+        case 1:
+            ChipLogProgress(chipTool, " ***** Test Step 1 : TH adds ACL Operate privileges for Group 0x0103\n");
+            err = TestThAddsAclOperatePrivilegesForGroup0x0103_1();
+            break;
+        case 2:
+            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends KeySetWrite command with TH key\n");
+            err = TestThSendsKeySetWriteCommandWithThKey_2();
+            break;
+        case 3:
+            ChipLogProgress(chipTool, " ***** Test Step 3 : TH binds GroupId to GroupKeySet\n");
+            err = TestThBindsGroupIdToGroupKeySet_3();
+            break;
+        case 4:
+            ChipLogProgress(chipTool, " ***** Test Step 4 : TH sends RemoveAllGroups command\n");
+            err = TestThSendsRemoveAllGroupsCommand_4();
+            break;
+        case 5:
+            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends AddGroup command\n");
+            err = TestThSendsAddGroupCommand_5();
+            break;
+        case 6:
+            ChipLogProgress(chipTool, " ***** Test Step 6 : TH sends ViewGroup command using group messaging\n");
+            if (ShouldSkip("G.S.F00")) {
+                NextTest();
+                return;
+            }
+            err = TestThSendsViewGroupCommandUsingGroupMessaging_6();
+            break;
+        case 7:
+            ChipLogProgress(chipTool, " ***** Test Step 7 : TH sends ViewGroup command using group messaging\n");
+            if (ShouldSkip("!(G.S.F00)")) {
+                NextTest();
+                return;
+            }
+            err = TestThSendsViewGroupCommandUsingGroupMessaging_7();
+            break;
+        case 8:
+            ChipLogProgress(chipTool, " ***** Test Step 8 : TH removes the GroupKeySet\n");
+            err = TestThRemovesTheGroupKeySet_8();
+            break;
+        case 9:
+            ChipLogProgress(chipTool, " ***** Test Step 9 : TH cleans up groups using RemoveAllGroups command\n");
+            err = TestThCleansUpGroupsUsingRemoveAllGroupsCommand_9();
+            break;
+        case 10:
+            ChipLogProgress(chipTool, " ***** Test Step 10 : TH removes ACL Operate privileges for Group 0x0103\n");
+            err = TestThRemovesAclOperatePrivilegesForGroup0x0103_10();
+            break;
+        }
+
+        if (CHIP_NO_ERROR != err) {
+            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
+            SetCommandExitStatus(err);
+        }
+    }
+
+    void OnStatusUpdate(const chip::app::StatusIB & status) override
+    {
+        switch (mTestIndex - 1) {
+        case 0:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            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));
+            break;
+        case 5:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 6:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        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.
+        ContinueOnChipMainThread(CHIP_NO_ERROR);
+    }
+
+    chip::System::Clock::Timeout GetWaitDuration() const override
+    {
+        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
+    }
+
+private:
+    std::atomic_uint16_t mTestIndex;
+    const uint16_t mTestCount = 11;
+
+    chip::Optional<chip::NodeId> mNodeId;
+    chip::Optional<chip::CharSpan> mCluster;
+    chip::Optional<chip::EndpointId> mEndpoint;
+    chip::Optional<uint16_t> mTimeout;
+
+    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
+    {
+
+        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
+        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
+        return WaitForCommissionee("alpha", value);
+    }
+
+    CHIP_ERROR TestThAddsAclOperatePrivilegesForGroup0x0103_1()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        id aclArgument;
+        {
+            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
+            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
+            {
+                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
+                temp_3[0] = [NSNumber numberWithUnsignedLongLong:commissionerNodeId];
+                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
+            }
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];
+
+            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:3U];
+            {
+                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
+                temp_3[0] = [NSNumber numberWithUnsignedLongLong:259ULL];
+                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
+            }
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];
+
+            aclArgument = temp_0;
+        }
+        [cluster writeAttributeACLWithValue:aclArgument
+                                 completion:^(NSError * _Nullable err) {
+                                     NSLog(@"TH adds ACL Operate privileges for Group 0x0103 Error: %@", err);
+
+                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                     NextTest();
+                                 }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsKeySetWriteCommandWithThKey_2()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
+        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
+            [NSNumber numberWithUnsignedShort:419U];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
+            [NSNumber numberWithUnsignedChar:0U];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
+            [[NSData alloc] initWithBytes:"0xd0d1d2d3d4d5d6d7d8d9dadbdcdddedf" length:34];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
+            [NSNumber numberWithUnsignedLongLong:2220000ULL];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
+            [[NSData alloc] initWithBytes:"0xd1d1d2d3d4d5d6d7d8d9dadbdcdddedf" length:34];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
+            [NSNumber numberWithUnsignedLongLong:2220001ULL];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
+            [[NSData alloc] initWithBytes:"0xd2d1d2d3d4d5d6d7d8d9dadbdcdddedf" length:34];
+        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
+            [NSNumber numberWithUnsignedLongLong:2220002ULL];
+
+        [cluster keySetWriteWithParams:params
+                            completion:^(NSError * _Nullable err) {
+                                NSLog(@"TH sends KeySetWrite command with TH key Error: %@", err);
+
+                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                NextTest();
+                            }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThBindsGroupIdToGroupKeySet_3()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        id groupKeyMapArgument;
+        {
+            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
+            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
+            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:259U];
+            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:419U];
+            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];
+
+            groupKeyMapArgument = temp_0;
+        }
+        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
+                                         completion:^(NSError * _Nullable err) {
+                                             NSLog(@"TH binds GroupId to GroupKeySet Error: %@", err);
+
+                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                             NextTest();
+                                         }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsRemoveAllGroupsCommand_4()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        [cluster removeAllGroupsWithCompletion:^(NSError * _Nullable err) {
+            NSLog(@"TH sends RemoveAllGroups command Error: %@", err);
+
+            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+            NextTest();
+        }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsAddGroupCommand_5()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
+        params.groupID = [NSNumber numberWithUnsignedShort:259U];
+        params.groupName = @"Test Group";
+        [cluster addGroupWithParams:params
+                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
+                             NSLog(@"TH sends AddGroup command Error: %@", err);
+
+                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                             NextTest();
+                         }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsViewGroupCommandUsingGroupMessaging_6()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
+        params.groupID = [NSNumber numberWithUnsignedShort:259U];
+        [cluster viewGroupWithParams:params
+                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
+                              NSLog(@"TH sends ViewGroup command using group messaging Error: %@", err);
+
+                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                              {
+                                  id actualValue = values.status;
+                                  VerifyOrReturn(CheckValue("Status", actualValue, 0U));
+                              }
+
+                              {
+                                  id actualValue = values.groupID;
+                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 259U));
+                              }
+
+                              {
+                                  id actualValue = values.groupName;
+                                  VerifyOrReturn(CheckValueAsString("GroupName", actualValue, @"Test Group"));
+                              }
+
+                              NextTest();
+                          }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThSendsViewGroupCommandUsingGroupMessaging_7()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
+        params.groupID = [NSNumber numberWithUnsignedShort:259U];
+        [cluster viewGroupWithParams:params
+                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
+                              NSLog(@"TH sends ViewGroup command using group messaging Error: %@", err);
+
+                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                              {
+                                  id actualValue = values.status;
+                                  VerifyOrReturn(CheckValue("Status", actualValue, 0U));
+                              }
+
+                              {
+                                  id actualValue = values.groupID;
+                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 259U));
+                              }
+
+                              {
+                                  id actualValue = values.groupName;
+                                  VerifyOrReturn(CheckValueAsString("GroupName", actualValue, @""));
+                              }
+
+                              NextTest();
+                          }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThRemovesTheGroupKeySet_8()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
+        params.groupKeySetID = [NSNumber numberWithUnsignedShort:419U];
+        [cluster keySetRemoveWithParams:params
+                             completion:^(NSError * _Nullable err) {
+                                 NSLog(@"TH removes the GroupKeySet Error: %@", err);
+
+                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                 NextTest();
+                             }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThCleansUpGroupsUsingRemoveAllGroupsCommand_9()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        [cluster removeAllGroupsWithCompletion:^(NSError * _Nullable err) {
+            NSLog(@"TH cleans up groups using RemoveAllGroups command Error: %@", err);
+
+            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+            NextTest();
+        }];
+
+        return CHIP_NO_ERROR;
+    }
+
+    CHIP_ERROR TestThRemovesAclOperatePrivilegesForGroup0x0103_10()
+    {
+
+        MTRBaseDevice * device = GetDevice("alpha");
+        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+        id aclArgument;
+        {
+            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
+            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
+            {
+                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
+                temp_3[0] = [NSNumber numberWithUnsignedLongLong:commissionerNodeId];
+                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
+            }
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
+            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];
+
+            aclArgument = temp_0;
+        }
+        [cluster writeAttributeACLWithValue:aclArgument
+                                 completion:^(NSError * _Nullable err) {
+                                     NSLog(@"TH removes ACL Operate privileges for Group 0x0103 Error: %@", err);
+
+                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+                                     NextTest();
+                                 }];
+
+        return CHIP_NO_ERROR;
+    }
+};
+
 class Test_TC_SWTCH_1_1 : public TestCommandBridge {
 public:
     // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
@@ -134327,6 +135586,8 @@
         make_unique<Test_TC_PSCFG_2_1>(),
         make_unique<Test_TC_RH_1_1>(),
         make_unique<Test_TC_RH_2_1>(),
+        make_unique<Test_TC_SC_5_1>(),
+        make_unique<Test_TC_SC_5_2>(),
         make_unique<Test_TC_SWTCH_1_1>(),
         make_unique<Test_TC_TMP_1_1>(),
         make_unique<Test_TC_TMP_2_1>(),
