Merge branch 'master' into asuppercamelcase
diff --git a/README.md b/README.md
index 665c6ca..3dce1ea 100644
--- a/README.md
+++ b/README.md
@@ -40,6 +40,7 @@
 - [ZAP Template Helpers](docs/helpers.md)
 - [ZAP External Template Helpers](docs/external-helpers.md)
 - [ZAP file Extensions](docs/zap-file-extensions.md)
+- [Upgrading ZAP files with GSDK upgrades](docs/zap-file-upgrade.md)
 - [FAQ/Developer dependencies](docs/faq.md)
 - [Release instructions](docs/release.md)
 - [Development Instructions](docs/development-instructions.md)
diff --git a/apack.json b/apack.json
index 6c5bb2c..4a887c7 100644
--- a/apack.json
+++ b/apack.json
@@ -4,8 +4,9 @@
   "description": "Graphical configuration tool for application and libraries based on Zigbee Cluster Library.",
   "path": [".", "node_modules/.bin/", "ZAP.app/Contents/MacOS"],
   "requiredFeatureLevel": "apack.core:9",
-  "featureLevel": 106,
+  "featureLevel": 107,
   "uc.triggerExtension": "zap",
+  "uc.sdkProvidedProperties": "zcl.matterZclJsonFile,zcl.matterTemplateJsonFile,zcl.zigbeeZclJsonFile,zcl.zigbeeTemplateJsonFile",
   "executable": {
     "zap:win32.x86_64": {
       "exe": "zap.exe",
@@ -74,10 +75,10 @@
       "cmd": "$(zap-cli) --version"
     },
     "uc_generate": {
-      "cmd": "$(zap-cli) generate --noUi --noServer -o ${generationOutput} --packageMatch fuzzy --zcl ${sdkRoot}/app/zcl/zcl-zap.json --zcl ${sdkRoot}/extension/matter_extension/src/app/zap-templates/zcl/zcl.json --generationTemplate ${sdkRoot}/protocol/zigbee/app/framework/gen-template/gen-templates.json --generationTemplate ${sdkRoot}/extension/matter_extension/src/app/zap-templates/app-templates.json --in ${contentFolder} --noLoadingFailure --appendGenerationSubdirectory --upgradeZapFile"
+      "cmd": "$(zap-cli) generate --noUi --noServer -o ${generationOutput} --packageMatch fuzzy [ --zcl ${zcl.zigbeeZclJsonFile} | --zcl ${sdkRoot}/app/zcl/zcl-zap.json ] [ --zcl ${zcl.matterZclJsonFile} | --zcl ${sdkRoot}/extension/matter_extension/src/app/zap-templates/zcl/zcl.json ] [ --generationTemplate ${zcl.zigbeeTemplateJsonFile} | --generationTemplate ${sdkRoot}/protocol/zigbee/app/framework/gen-template/gen-templates.json ] [ --generationTemplate ${zcl.matterTemplateJsonFile} | --generationTemplate ${sdkRoot}/extension/matter_extension/src/app/zap-templates/app-templates.json ] --in ${contentFolder} --noLoadingFailure --appendGenerationSubdirectory --upgradeZapFile"
     },
     "uc_upgrade": {
-      "cmd": "$(zap-cli) upgrade  --results ${results} -d ${tempContentFolder} --zcl ${sdkRoot}/app/zcl/zcl-zap.json --zcl ${sdkRoot}/extension/matter_extension/src/app/zap-templates/zcl/zcl.json --generationTemplate ${sdkRoot}/protocol/zigbee/app/framework/gen-template/gen-templates.json --generationTemplate ${sdkRoot}/extension/matter_extension/src/app/zap-templates/app-templates.json --noLoadingFailure"
+      "cmd": "$(zap-cli) upgrade --results ${results} -d ${tempContentFolder} [ --zcl ${zcl.zigbeeZclJsonFile} | --zcl ${sdkRoot}/app/zcl/zcl-zap.json ] [ --zcl ${zcl.matterZclJsonFile} | --zcl ${sdkRoot}/extension/matter_extension/src/app/zap-templates/zcl/zcl.json ] [ --generationTemplate ${zcl.zigbeeTemplateJsonFile} | --generationTemplate ${sdkRoot}/protocol/zigbee/app/framework/gen-template/gen-templates.json ] [ --generationTemplate ${zcl.matterTemplateJsonFile} | --generationTemplate ${sdkRoot}/extension/matter_extension/src/app/zap-templates/app-templates.json ] --noLoadingFailure"
     },
     "zapHelp": {
       "cmd": "$(zap) --help"
@@ -86,7 +87,7 @@
       "cmd": "$(zap) selfCheck"
     },
     "zapServer": {
-      "cmd": "$(zap) server --reuseZapInstance --packageMatch fuzzy --zcl ${sdkRoot}/app/zcl/zcl-zap.json --zcl ${sdkRoot}/extension/matter_extension/src/app/zap-templates/zcl/zcl.json --generationTemplate ${sdkRoot}/protocol/zigbee/app/framework/gen-template/gen-templates.json --generationTemplate ${sdkRoot}/extension/matter_extension/src/app/zap-templates/app-templates.json --studioHttpPort ${studioHttpPort} --noLoadingFailure --appendGenerationSubdirectory"
+      "cmd": "$(zap) server --reuseZapInstance --packageMatch fuzzy [ --zcl ${zcl.zigbeeZclJsonFile} | --zcl ${sdkRoot}/app/zcl/zcl-zap.json ] [ --zcl ${zcl.matterZclJsonFile} | --zcl ${sdkRoot}/extension/matter_extension/src/app/zap-templates/zcl/zcl.json ] [ --generationTemplate ${zcl.zigbeeTemplateJsonFile} | --generationTemplate ${sdkRoot}/protocol/zigbee/app/framework/gen-template/gen-templates.json ] [ --generationTemplate ${zcl.matterTemplateJsonFile} | --generationTemplate ${sdkRoot}/extension/matter_extension/src/app/zap-templates/app-templates.json ] --studioHttpPort ${studioHttpPort} --noLoadingFailure --appendGenerationSubdirectory"
     },
     "zapStop": {
       "cmd": "$(zap) stop --reuseZapInstance"
@@ -98,16 +99,16 @@
       "cmd": "$(zap) server --reuseZapInstance --studioHttpPort ${studioHttpPort}"
     },
     "zapFull": {
-      "cmd": "$(zap) --showUrl --zcl ${sdkRoot}/app/zcl/zcl-zap.json"
+      "cmd": "$(zap) --showUrl [ --zcl ${zcl.zigbeeZclJsonFile} | --zcl ${sdkRoot}/app/zcl/zcl-zap.json ]"
     },
     "zapRegenSdk": {
       "cmd": "$(zap) regenerateSdk --sdk ${sdkJsonFile}"
     },
     "zapIscConvert": {
-      "cmd": "$(zap) convert --noUi --noServer --noZapFileLog --zcl ${sdkRoot}/app/zcl/zcl-zap.json --out ${outFile} ${inFile}"
+      "cmd": "$(zap) convert --noUi --noServer --noZapFileLog [ --zcl ${zcl.zigbeeZclJsonFile} | --zcl ${sdkRoot}/app/zcl/zcl-zap.json ] --out ${outFile} ${inFile}"
     },
     "zapIscOpen": {
-      "cmd": "$(zap) --noServer --zcl ${sdkRoot}/app/zcl/zcl-zap.json --generationTemplate ${sdkRoot}/protocol/zigbee/app/framework/gen-template/gen-teplates.json ${inFile}"
+      "cmd": "$(zap) --noServer [ --zcl ${zcl.zigbeeZclJsonFile} | --zcl ${sdkRoot}/app/zcl/zcl-zap.json ] [ --generationTemplate ${zcl.zigbeeTemplateJsonFile} | --generationTemplate ${sdkRoot}/protocol/zigbee/app/framework/gen-template/gen-templates.json ] ${inFile}"
     }
   }
 }
diff --git a/docs/api.md b/docs/api.md
index 83fa303..06d0d29 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -8915,6 +8915,7 @@
     * [~access_aggregate(options)](#module_Templating API_ Access helpers..access_aggregate)
     * [~access(options)](#module_Templating API_ Access helpers..access)
     * [~default_access(options)](#module_Templating API_ Access helpers..default_access) ⇒
+    * [~chip_get_access_role(options)](#module_Templating API_ Access helpers..chip_get_access_role) ⇒ <code>string</code>
 
 <a name="module_Templating API_ Access helpers..collectDefaultAccessList"></a>
 
@@ -8979,6 +8980,18 @@
 | --- | --- |
 | options | <code>\*</code> | 
 
+<a name="module_Templating API_ Access helpers..chip_get_access_role"></a>
+
+### Templating API: Access helpers~chip\_get\_access\_role(options) ⇒ <code>string</code>
+Determines the access role for a given entity and operation.
+
+**Kind**: inner method of [<code>Templating API: Access helpers</code>](#module_Templating API_ Access helpers)  
+**Returns**: <code>string</code> - The access role.  
+
+| Param | Type |
+| --- | --- |
+| options | <code>\*</code> | 
+
 <a name="module_Templating API_ Attribute helpers"></a>
 
 ## Templating API: Attribute helpers
@@ -15038,7 +15051,8 @@
 <a name="module_REST API_ user data..httpPostCheckConformOnFeatureUpdate"></a>
 
 ### REST API: user data~httpPostCheckConformOnFeatureUpdate(db) ⇒
-HTTP POST: elements to be updated after toggle a device type feature
+HTTP POST: elements to be updated after toggle a device type feature.
+Set related warnings if user confirmed the change or change is disabled.
 
 **Kind**: inner method of [<code>REST API: user data</code>](#module_REST API_ user data)  
 **Returns**: callback for the express uri registration  
@@ -16373,7 +16387,8 @@
 <a name="module_REST API_ user data..httpPostCheckConformOnFeatureUpdate"></a>
 
 ### REST API: user data~httpPostCheckConformOnFeatureUpdate(db) ⇒
-HTTP POST: elements to be updated after toggle a device type feature
+HTTP POST: elements to be updated after toggle a device type feature.
+Set related warnings if user confirmed the change or change is disabled.
 
 **Kind**: inner method of [<code>REST API: user data</code>](#module_REST API_ user data)  
 **Returns**: callback for the express uri registration  
@@ -17699,7 +17714,7 @@
 * [JS API: async reporting](#module_JS API_ async reporting)
     * [~sendDirtyFlagStatus(db, session)](#module_JS API_ async reporting..sendDirtyFlagStatus)
     * [~sendNotificationUpdate(db, session)](#module_JS API_ async reporting..sendNotificationUpdate)
-    * [~startAsyncReporting(db, intervalMs)](#module_JS API_ async reporting..startAsyncReporting)
+    * [~startAsyncReporting(db)](#module_JS API_ async reporting..startAsyncReporting)
     * [~stopAsyncReporting()](#module_JS API_ async reporting..stopAsyncReporting)
 
 <a name="module_JS API_ async reporting..sendDirtyFlagStatus"></a>
@@ -17728,7 +17743,7 @@
 
 <a name="module_JS API_ async reporting..startAsyncReporting"></a>
 
-### JS API: async reporting~startAsyncReporting(db, intervalMs)
+### JS API: async reporting~startAsyncReporting(db)
 Start the interval that will check and report dirty flags.
 
 **Kind**: inner method of [<code>JS API: async reporting</code>](#module_JS API_ async reporting)  
@@ -17736,7 +17751,6 @@
 | Param | Type |
 | --- | --- |
 | db | <code>\*</code> | 
-| intervalMs | <code>\*</code> | 
 
 <a name="module_JS API_ async reporting..stopAsyncReporting"></a>
 
@@ -17935,6 +17949,7 @@
     * [.logBrowser(msg, err)](#module_JS API_ Environment utilities.logBrowser)
     * [.logIpc(msg, err)](#module_JS API_ Environment utilities.logIpc)
     * [.logDebug(msg, err)](#module_JS API_ Environment utilities.logDebug)
+    * [.logWarningToFile(msg)](#module_JS API_ Environment utilities.logWarningToFile)
     * [.isMatchingVersion(versionsArray, providedVersion)](#module_JS API_ Environment utilities.isMatchingVersion) ⇒
     * [.versionsCheck()](#module_JS API_ Environment utilities.versionsCheck) ⇒
     * [.httpStaticContent()](#module_JS API_ Environment utilities.httpStaticContent) ⇒
@@ -18244,6 +18259,17 @@
 | msg | <code>\*</code> | 
 | err | <code>\*</code> | 
 
+<a name="module_JS API_ Environment utilities.logWarningToFile"></a>
+
+### JS API: Environment utilities.logWarningToFile(msg)
+Log Warning level message to zap.log file.
+
+**Kind**: static method of [<code>JS API: Environment utilities</code>](#module_JS API_ Environment utilities)  
+
+| Param | Type |
+| --- | --- |
+| msg | <code>\*</code> | 
+
 <a name="module_JS API_ Environment utilities.isMatchingVersion"></a>
 
 ### JS API: Environment utilities.isMatchingVersion(versionsArray, providedVersion) ⇒
@@ -20187,6 +20213,7 @@
         * [~evaluateBooleanExpression(expr)](#module_Validation API_ Evaluate conformance expressions..evaluateConformanceExpression..evaluateBooleanExpression)
         * [~evaluateWithParentheses(expr)](#module_Validation API_ Evaluate conformance expressions..evaluateConformanceExpression..evaluateWithParentheses)
     * [~checkMissingTerms(expression, elementMap)](#module_Validation API_ Evaluate conformance expressions..checkMissingTerms) ⇒
+    * [~checkIfExpressionHasTerm(expression, term)](#module_Validation API_ Evaluate conformance expressions..checkIfExpressionHasTerm) ⇒
 
 <a name="module_Validation API_ Evaluate conformance expressions..evaluateConformanceExpression"></a>
 
@@ -20247,6 +20274,19 @@
 | expression | <code>\*</code> | 
 | elementMap | <code>\*</code> | 
 
+<a name="module_Validation API_ Evaluate conformance expressions..checkIfExpressionHasTerm"></a>
+
+### Validation API: Evaluate conformance expressions~checkIfExpressionHasTerm(expression, term) ⇒
+Check if the expression contains a given term.
+
+**Kind**: inner method of [<code>Validation API: Evaluate conformance expressions</code>](#module_Validation API_ Evaluate conformance expressions)  
+**Returns**: true if the expression contains the term, false otherwise  
+
+| Param |
+| --- |
+| expression | 
+| term | 
+
 <a name="module_Validation API_ Parse conformance data from XML"></a>
 
 ## Validation API: Parse conformance data from XML
@@ -20256,6 +20296,7 @@
 * [Validation API: Parse conformance data from XML](#module_Validation API_ Parse conformance data from XML)
     * [~parseConformanceFromXML(operand)](#module_Validation API_ Parse conformance data from XML..parseConformanceFromXML) ⇒
     * [~parseConformanceRecursively(operand, depth, parentJoinChar)](#module_Validation API_ Parse conformance data from XML..parseConformanceRecursively) ⇒
+    * [~getOptionalAttributeFromXML(element, elementType)](#module_Validation API_ Parse conformance data from XML..getOptionalAttributeFromXML) ⇒
 
 <a name="module_Validation API_ Parse conformance data from XML..parseConformanceFromXML"></a>
 
@@ -20317,6 +20358,23 @@
 | depth | <code>\*</code> | <code>0</code> | 
 | parentJoinChar | <code>\*</code> |  | 
 
+<a name="module_Validation API_ Parse conformance data from XML..getOptionalAttributeFromXML"></a>
+
+### Validation API: Parse conformance data from XML~getOptionalAttributeFromXML(element, elementType) ⇒
+if optional attribute is defined, return its value
+if optional attribute is undefined, check if the element conformance is mandatory
+if both optional attribute and conformance are undefined, return false
+Optional attribute takes precedence over conformance for backward compatibility on certain elements
+Log warnings to zap.log if both optional attribute and conformance are defined
+
+**Kind**: inner method of [<code>Validation API: Parse conformance data from XML</code>](#module_Validation API_ Parse conformance data from XML)  
+**Returns**: true if the element is optional, false if the element is mandatory  
+
+| Param | Type |
+| --- | --- |
+| element | <code>\*</code> | 
+| elementType | <code>\*</code> | 
+
 <a name="module_Validation API_ Validation APIs"></a>
 
 ## Validation API: Validation APIs
diff --git a/docs/helpers.md b/docs/helpers.md
index c86404f..a04a995 100644
--- a/docs/helpers.md
+++ b/docs/helpers.md
@@ -54,6 +54,7 @@
     * [~access_aggregate(options)](#module_Templating API_ Access helpers..access_aggregate)
     * [~access(options)](#module_Templating API_ Access helpers..access)
     * [~default_access(options)](#module_Templating API_ Access helpers..default_access) ⇒
+    * [~chip_get_access_role(options)](#module_Templating API_ Access helpers..chip_get_access_role) ⇒ <code>string</code>
 
 <a name="module_Templating API_ Access helpers..collectDefaultAccessList"></a>
 
@@ -118,6 +119,18 @@
 | --- | --- |
 | options | <code>\*</code> | 
 
+<a name="module_Templating API_ Access helpers..chip_get_access_role"></a>
+
+### Templating API: Access helpers~chip\_get\_access\_role(options) ⇒ <code>string</code>
+Determines the access role for a given entity and operation.
+
+**Kind**: inner method of [<code>Templating API: Access helpers</code>](#module_Templating API_ Access helpers)  
+**Returns**: <code>string</code> - The access role.  
+
+| Param | Type |
+| --- | --- |
+| options | <code>\*</code> | 
+
 <a name="module_Templating API_ Attribute helpers"></a>
 
 ## Templating API: Attribute helpers
diff --git a/docs/zap-file-upgrade.md b/docs/zap-file-upgrade.md
new file mode 100644
index 0000000..542cf22
--- /dev/null
+++ b/docs/zap-file-upgrade.md
@@ -0,0 +1,91 @@
+# Upgrading ZAP Files with SDK upgrades
+
+## Overview
+
+Upgrading ZAP files is a critical step when transitioning to newer versions of the SDK. This process ensures compatibility with the latest features, bug fixes, and improvements provided by the SDK. By following the upgrade guidelines, you can maintain the integrity of your ZAP configuration files and avoid potential issues during development or deployment. This document outlines the steps and best practices for performing ZAP file upgrades effectively.
+
+## How to upgrade the ZAP File?
+
+Run the following command to update your .zap file
+
+```bash
+"${Path to ZAP executable} upgrade  --results ${path to .yaml file to see results of upgrade} -d ${directory containing ZAP files} --zcl ${path to zcl json file} --generationTemplate ${path to templates json file} --noLoadingFailure"
+```
+
+## How to add upgrade rules for .zap files through your SDK
+
+### - Create an `upgrade-rules.json` file with the following information if one already does not exist
+
+```json
+{
+  "version": 1,
+  "description": "Upgrade Rules for Zigbee .zap files",
+  "category": "matter",
+  "upgradeRuleScripts": [
+    {
+      "path": "../../test/resource/test-matter-attribute-default-value-update.js",
+      "priority": 101
+    },
+    {
+      "path": "../../test/resource/test-attribute-default-value-update.js",
+      "priority": 100
+    }
+  ]
+}
+```
+
+**category**: Determines that these upgrade rules need to run for matter.
+
+**upgradeRuleScripts**: List of upgrade rules to run on .zap files. Includes the relative path from upgrade-rules.json to the upgrade scripts written in Javascript. Priority determines the order of execution for the upgrade rules. The scripts are run in order of priority with lower number signifying higher priority.
+
+### - Add relative path to the upgrade-rules.json from your zcl.json file
+
+```json
+"upgradeRules": "./upgrade-rules-matter.json"
+```
+
+### - Creating your own javascript upgrade rule
+
+Add a postLoad function as below with api and context as parameters. Api argument gives access to all APIs that can be used within the `postLoad` function. [Refer to the post-import API documentation](../src-electron/util/post-import-api.js) . Context gives the state of the Data-Model/ZCL with respect to the .zap file that will be passied along to the API calls.
+
+```javascript
+// Example upgrade rule to update default value of Level Control cluster attribute in Matter.
+async function postLoad(api, context) {
+  let resMsg = ''
+  let epts = await api.endpoints(context)
+  for (let i = 0; i < epts.length; i++) {
+    let clusters = await api.clusters(context, epts[i])
+    for (let j = 0; j < clusters.length; j++) {
+      if (clusters[j].code == '0x0008') {
+        let attributes = await api.attributes(context, epts[i], clusters[j])
+        for (let k = 0; k < attributes.length; k++) {
+          let attributeCode = parseInt(attributes[k].code)
+          let attributeValue = parseInt(attributes[k].defaultValue)
+          if (
+            attributeCode == 0 &&
+            (attributeValue == 0 || !attributeValue || attributeValue == 'null')
+          ) {
+            let params = [
+              {
+                key: context.updateKey.attributeDefault,
+                value: 10
+              }
+            ]
+            await api.updateAttribute(
+              context,
+              epts[i],
+              clusters[j],
+              attributes[k],
+              params
+            )
+            resMsg += `Current Value attribute's default value updated to 10 for Level Control cluster on endpoint ${epts[i].endpointIdentifier} ${epts[i].category}\n`
+          }
+        }
+      }
+    }
+  }
+  return { message: resMsg, status: 'automatic' } // Status can be 'nothing', 'automatic', 'user_verification', 'impossible'.
+}
+
+exports.postLoad = postLoad
+```
diff --git a/src-electron/db/db-api.js b/src-electron/db/db-api.js
index a1bab73..cb63acf 100644
--- a/src-electron/db/db-api.js
+++ b/src-electron/db/db-api.js
@@ -26,6 +26,7 @@
 const fsp = fs.promises
 const env = require('../util/env')
 const util = require('../util/util.js')
+const asyncReporting = require('../util/async-reporting.js')
 const dbEnum = require('../../src-shared/db-enum.js')
 const dbCache = require('./db-cache')
 const dbMapping = require('./db-mapping.js')
@@ -355,6 +356,8 @@
  * @returns A promise that resolves without an argument or rejects with error from the database closing.
  */
 async function closeDatabase(database) {
+  database._closed = true // Mark the database as closed
+  asyncReporting.stopAsyncReporting()
   dbCache.clear()
   return new Promise((resolve, reject) => {
     env.logSql('About to close database.')
@@ -372,6 +375,8 @@
  * @param {*} database
  */
 function closeDatabaseSync(database) {
+  database._closed = true // Mark the database as closed
+  asyncReporting.stopAsyncReporting()
   dbCache.clear()
   env.logSql('About to close database.')
   database.close((err) => {
diff --git a/src-electron/db/query-config.js b/src-electron/db/query-config.js
index 233ecca..4701283 100644
--- a/src-electron/db/query-config.js
+++ b/src-electron/db/query-config.js
@@ -230,7 +230,7 @@
       )
     // only set featureMap bit to 1 for mandatory features
     let featureMapBitsToBeEnabled = featuresOnEndpointTypeAndCluster
-      .filter((f) => f.conformance == 'M')
+      .filter((f) => f.conformance == dbEnum.conformance.mandatory)
       .map((f) => f.featureBit)
     featureMapBitsToBeEnabled.forEach(
       (featureBit) =>
diff --git a/src-electron/db/query-endpoint.js b/src-electron/db/query-endpoint.js
index b446489..e04c5bc 100644
--- a/src-electron/db/query-endpoint.js
+++ b/src-electron/db/query-endpoint.js
@@ -31,9 +31,39 @@
  *
  * @param {*} db
  * @param {*} sessionId
+ * @param {*} category
  * @returns Promise resolving into all endpoints.
  */
-async function selectAllEndpoints(db, sessionId) {
+async function selectAllEndpoints(db, sessionId, category = null) {
+  let categorySqlJoinString = category
+    ? `
+LEFT JOIN
+  ENDPOINT_TYPE
+ON
+  E1.ENDPOINT_TYPE_REF = ENDPOINT_TYPE.ENDPOINT_TYPE_ID
+LEFT JOIN
+  ENDPOINT_TYPE_DEVICE
+ON
+  ENDPOINT_TYPE_DEVICE.ENDPOINT_TYPE_REF = ENDPOINT_TYPE.ENDPOINT_TYPE_ID
+LEFT JOIN
+  DEVICE_TYPE
+ON
+  ENDPOINT_TYPE_DEVICE.DEVICE_TYPE_REF = DEVICE_TYPE.DEVICE_TYPE_ID
+LEFT JOIN
+  PACKAGE
+ON
+  PACKAGE.PACKAGE_ID = DEVICE_TYPE.PACKAGE_REF`
+    : ``
+
+  let categorySqlSelectString = category
+    ? `,
+  PACKAGE.CATEGORY`
+    : ``
+
+  let categorySqlWhereString = category
+    ? `AND
+  PACKAGE.CATEGORY = '${category}'`
+    : ``
   let rows = await dbApi.dbAll(
     db,
     `
@@ -46,18 +76,23 @@
   E1.NETWORK_IDENTIFIER,
   E2.ENDPOINT_ID AS PARENT_ENDPOINT_REF,
   E2.ENDPOINT_IDENTIFIER AS PARENT_ENDPOINT_IDENTIFIER
+  ${categorySqlSelectString}
 FROM
   ENDPOINT AS E1
 LEFT JOIN
   ENDPOINT AS E2
 ON
   E2.ENDPOINT_ID = E1.PARENT_ENDPOINT_REF
-WHERE E1.SESSION_REF = ?
-ORDER BY E1.ENDPOINT_IDENTIFIER
+${categorySqlJoinString}
+WHERE
+  E1.SESSION_REF = ?
+${categorySqlWhereString}
+ORDER BY
+  E1.ENDPOINT_IDENTIFIER
     `,
     [sessionId]
   )
-  return rows.map(dbMapping.map.endpoint)
+  return rows.map(dbMapping.map.endpointExtended)
 }
 
 /**
@@ -197,6 +232,7 @@
   return rows.map((row) => {
     return {
       clusterId: row['CLUSTER_ID'],
+      id: row['CLUSTER_ID'],
       endpointTypeId: row['ENDPOINT_TYPE_REF'],
       endpointTypeClusterId: row['ENDPOINT_TYPE_CLUSTER_ID'],
       hexCode: '0x' + bin.int16ToHex(row['CODE']),
diff --git a/src-electron/generator/helper-access.js b/src-electron/generator/helper-access.js
index 88df9a6..73c007b 100644
--- a/src-electron/generator/helper-access.js
+++ b/src-electron/generator/helper-access.js
@@ -237,6 +237,33 @@
   return templateUtil.templatePromise(this.global, p)
 }
 
+/**
+ * Determines the access role for a given entity and operation.
+ *
+ * @param {*} options
+ * @returns {string} The access role.
+ */
+async function chip_get_access_role(options) {
+  if (!('op' in options.hash)) {
+    throw new Error('Access helper requires op from the op="<op>" option.')
+  }
+
+  const op = options.hash.op
+  const accessList = await collectAccesslist(this, options)
+  const accessForOp = accessList.find((a) => a.operation === op)
+
+  if (accessForOp?.role) {
+    return accessForOp.role
+  }
+
+  if ('default' in options.hash) {
+    return options.hash.default
+  }
+
+  return ''
+}
+
 exports.access = access
 exports.access_aggregate = access_aggregate
 exports.default_access = default_access
+exports.chip_get_access_role = chip_get_access_role
diff --git a/src-electron/generator/matter/app/zap-templates/templates/app/helper.js b/src-electron/generator/matter/app/zap-templates/templates/app/helper.js
index 84c8c30..fc0bd67 100644
--- a/src-electron/generator/matter/app/zap-templates/templates/app/helper.js
+++ b/src-electron/generator/matter/app/zap-templates/templates/app/helper.js
@@ -534,6 +534,20 @@
   const preserveAcronyms = options && options.hash.preserveAcronyms;
   return string.tokensIntoCamelCase(label, false, preserveAcronyms);
 }
+/**
+ * Same as asUpperCamelCase, but with a special case for "RFID".
+ * Special case for cluster specific object files for Matter.
+ *
+ * @param {*} label
+ * @param {*} options
+ * @returns {string}
+ */
+function chip_name_for_id_usage(label, options) {
+  if (label == 'RFID') {
+    return 'Rfid';
+  }
+  return asUpperCamelCase(label, options);
+}
 
 function chip_friendly_endpoint_type_name(options) {
   let name = this.endpointTypeName;
@@ -1212,6 +1226,7 @@
   zcl_commands_that_need_timed_invoke;
 exports.if_is_fabric_scoped_struct = if_is_fabric_scoped_struct;
 exports.if_is_non_zero_default = if_is_non_zero_default;
+exports.chip_name_for_id_usage = chip_name_for_id_usage;
 
 exports.meta = {
   category: dbEnum.helperCategory.matter,
diff --git a/src-electron/ide-integration/studio-rest-api.js b/src-electron/ide-integration/studio-rest-api.js
index b50e335..dcb29e4 100644
--- a/src-electron/ide-integration/studio-rest-api.js
+++ b/src-electron/ide-integration/studio-rest-api.js
@@ -137,6 +137,31 @@
 }
 
 /**
+ * Retry connecting to the Studio server until it is ready.
+ * @param {string} url - The URL to connect to.
+ * @param {number} retries - Number of retry attempts.
+ * @param {number} delay - Delay between retries in milliseconds.
+ * @returns {Promise} - Resolves when the connection is successful, rejects if it fails.
+ */
+async function waitForServer(url, retries = 5, delay = 2000) {
+  for (let attempt = 1; attempt <= retries; attempt++) {
+    try {
+      let response = await axios.get(url)
+      if (response.status === 200) {
+        return response // Server is ready
+      }
+    } catch (err) {
+      env.logWarning(`Attempt ${attempt} failed: ${err.message}`)
+      if (attempt === retries) {
+        throw new Error(
+          `Failed to connect to Studio server at ${url} after ${retries} attempts.`
+        )
+      }
+    }
+    await new Promise((resolve) => setTimeout(resolve, delay)) // Wait before retrying
+  }
+}
+/**
  * Send HTTP GET request to Studio Jetty server for project information.
  * @param {} db
  * @param {*} sessionId
@@ -151,16 +176,14 @@
     if (studioIntegration && !isUserDisabled) {
       let path = restApiUrl(StudioRestAPI.GetProjectInfo, project)
       env.logDebug(`StudioUC(${name}): GET: ${path}`)
-      return axios
-        .get(path)
-        .then((resp) => {
-          env.logDebug(`StudioUC(${name}): RESP: ${resp.status}`)
-          return resp
-        })
-        .catch((err) => {
-          env.logWarning(`StudioUC(${name}): ERR: ${err.message}`)
-          return { data: [] }
-        })
+      try {
+        let response = await waitForServer(path) // Wait for the server to be ready
+        env.logDebug(`StudioUC(${name}): RESP: ${response.status}`)
+        return response
+      } catch (err) {
+        env.logWarning(`StudioUC(${name}): ERR: ${err.message}`)
+        return { data: [] }
+      }
     } else {
       if (!isUserDisabled)
         env.logWarning(`StudioUC(${name}): Studio integration is now enabled!`)
diff --git a/src-electron/importexport/import.js b/src-electron/importexport/import.js
index 86a5360..3d28e11 100644
--- a/src-electron/importexport/import.js
+++ b/src-electron/importexport/import.js
@@ -23,6 +23,8 @@
  */
 
 const fsp = require('fs').promises
+const fs = require('fs')
+const path = require('path')
 const importIsc = require('./import-isc.js')
 const importJson = require('./import-json.js')
 const dbApi = require('../db/db-api.js')
@@ -66,19 +68,16 @@
  *
  * @param {*} db
  * @param {*} sessionId
- * @param {*} scriptFile
+ * @param {*} scriptInfo
  * @returns Promise of function execution.
  */
-async function executePostImportScript(db, sessionId, scriptFile) {
+async function executePostImportScript(db, sessionId, scriptInfo) {
   let context = {
     db: db,
-    sessionId: sessionId
+    sessionId: sessionId,
+    script: scriptInfo
   }
-  return script.executeScriptFunction(
-    script.functions.postLoad,
-    context,
-    scriptFile
-  )
+  return script.executeScriptFunction(script.functions.postLoad, context)
 }
 
 /**
@@ -232,11 +231,32 @@
       options.upgradeTemplatePackages
     )
     if (options.postImportScript != null) {
-      await executePostImportScript(
-        db,
-        loaderResult.sessionId,
-        options.postImportScript
-      )
+      await executePostImportScript(db, loaderResult.sessionId, {
+        path: path.resolve(options.postImportScript),
+        category: null // When running individual scripts no need for category
+      })
+    }
+    if (options.upgradeRuleScripts != null) {
+      const upgradeScripts = options.upgradeRuleScripts
+      let upgradeMessages = []
+      for (let i = 0; i < upgradeScripts.length; i++) {
+        let upgradeScript = upgradeScripts[i]
+        if (fs.existsSync(upgradeScript.path)) {
+          let upgradeMessage = await executePostImportScript(
+            db,
+            loaderResult.sessionId,
+            upgradeScript
+          )
+          if (upgradeMessage) {
+            upgradeMessages.push(upgradeMessage)
+          }
+        } else {
+          throw new Error(
+            `Post import script path does not exist: ${upgradeScript.path}`
+          )
+        }
+      }
+      loaderResult.upgradeMessages = upgradeMessages
     }
     return loaderResult
   } finally {
diff --git a/src-electron/main-process/startup.js b/src-electron/main-process/startup.js
index e2a1bca..8117e24 100644
--- a/src-electron/main-process/startup.js
+++ b/src-electron/main-process/startup.js
@@ -312,13 +312,57 @@
       dbEnum.packageType.genTemplatesJson
     )
 
+    let upgradeRules = []
+    // If more than one upgrade package is present then it is a multiprotocol
+    // application so upgrade rules should be added to the corresponding endpoints.
+    let isMultiProtocol = upgradeZclPackages.length > 1
+    for (const pkg of upgradeZclPackages) {
+      if (pkg.path) {
+        try {
+          const jsonData = JSON.parse(fs.readFileSync(pkg.path, 'utf-8'))
+          if (jsonData.upgradeRules !== undefined) {
+            const upgradeRulesJsonPath = path.resolve(
+              path.dirname(pkg.path),
+              jsonData.upgradeRules
+            )
+            try {
+              const upgradeRulesData = JSON.parse(
+                fs.readFileSync(upgradeRulesJsonPath, 'utf-8')
+              )
+              // Sorting upgrade rules by priority and then run them
+              upgradeRulesData.upgradeRuleScripts
+                .sort((a, b) => a.priority - b.priority)
+                .forEach((ur) => {
+                  upgradeRules.push({
+                    path: path.resolve(path.dirname(pkg.path), ur.path),
+                    category: isMultiProtocol ? upgradeRulesData.category : null
+                  })
+                })
+            } catch (error) {
+              console.error(
+                `Error reading or parsing upgrade rules from path ${upgradeRulesJsonPath}:`,
+                error
+              )
+            }
+          }
+        } catch (error) {
+          console.error(
+            `Error reading or parsing JSON from path ${pkg.path}:`,
+            error
+          )
+        }
+      }
+    }
+
     let importResult = await importJs.importDataFromFile(db, zapFile, {
       defaultZclMetafile: argv.zclProperties,
       postImportScript: argv.postImportScript,
       packageMatch: argv.packageMatch,
       upgradeZclPackages: upgradeZclPackages,
-      upgradeTemplatePackages: upgradeTemplatePackages
+      upgradeTemplatePackages: upgradeTemplatePackages,
+      upgradeRuleScripts: upgradeRules // Used to apply all the upgrade rules to the .zap file
     })
+
     let sessionId = importResult.sessionId
     await util.ensurePackagesAndPopulateSessionOptions(db, sessionId, {
       zcl: argv.zclProperties,
@@ -345,15 +389,23 @@
       fileFormat: argv.saveFileFormat
     })
     options.logger(`    👉 write out: ${outputPath}`)
+    try {
+      if (upgrade_results != null) {
+        if (!fs.existsSync(path.dirname(upgrade_results))) {
+          fs.mkdirSync(path.dirname(upgrade_results), { recursive: true })
+        }
+        await writeConversionResultsFile(
+          upgrade_results,
+          importResult.upgradeMessages
+        )
+      }
+      options.logger(`    👉 write out: ${upgrade_results}`)
+    } catch (error) {
+      options.logger(`    ⚠️  failed to write out: ${upgrade_results}`)
+    }
+    options.logger('😎 Upgrade done!')
   }
-  try {
-    if (upgrade_results != null)
-      await writeConversionResultsFile(upgrade_results)
-    options.logger(`    👉 write out: ${upgrade_results}`)
-  } catch (error) {
-    options.logger(`    ⚠️  failed to write out: ${upgrade_results}`)
-  }
-  options.logger('😎 Upgrade done!')
+
   if (options.quitFunction != null) {
     options.quitFunction()
   }
@@ -468,20 +520,25 @@
  * Write conversion results into file given.
  *
  * @param {*} file
+ * @param {*} messages
  * @returns promise of a file write operation.
  */
-async function writeConversionResultsFile(file) {
+async function writeConversionResultsFile(file, messages = null) {
   return fsp.writeFile(
     file,
-    YAML.stringify({
-      upgrade_results: [
-        {
-          message:
-            'ZCL Advanced Platform (ZAP) configuration has been successfully upgraded.',
-          status: 'automatic'
-        }
-      ]
-    })
+    messages
+      ? YAML.stringify({
+          upgrade_results: messages
+        })
+      : YAML.stringify({
+          upgrade_results: [
+            {
+              message:
+                'ZCL Advanced Platform (ZAP) configuration has been successfully upgraded.',
+              status: 'automatic'
+            }
+          ]
+        })
   )
 }
 
diff --git a/src-electron/rest/user-data.js b/src-electron/rest/user-data.js
index 4f58247..b850fb7 100644
--- a/src-electron/rest/user-data.js
+++ b/src-electron/rest/user-data.js
@@ -100,7 +100,8 @@
 }
 
 /**
- * HTTP POST: elements to be updated after toggle a device type feature
+ * HTTP POST: elements to be updated after toggle a device type feature.
+ * Set related warnings if user confirmed the change or change is disabled.
  *
  * @param {*} db
  * @returns callback for the express uri registration
@@ -108,7 +109,7 @@
 function httpPostCheckConformOnFeatureUpdate(db) {
   return async (request, response) => {
     let sessionId = request.zapSessionId
-    let { featureData, featureMap, endpointId } = request.body
+    let { featureData, featureMap, endpointId, changeConfirmed } = request.body
     let { endpointTypeClusterId, deviceTypeClusterId } = featureData
 
     let elements = await queryEndpointType.getEndpointTypeElements(
@@ -123,25 +124,26 @@
       featureData,
       endpointId
     )
-
-    // set device type feature warning
-    await querySessionNotification.setNotificationOnFeatureChange(
-      db,
-      sessionId,
-      result
-    )
-    // do not set element warning if feature change disabled
-    if (!result.disableChange) {
-      let outdatedWarnings = conformChecker.getOutdatedElementWarning(
-        featureData,
-        elements,
-        result.elementMap
-      )
-      await querySessionNotification.deleteNotificationWithPatterns(
+    if (changeConfirmed || result.disableChange) {
+      // set device type feature warning
+      await querySessionNotification.setNotificationOnFeatureChange(
         db,
         sessionId,
-        outdatedWarnings
+        result
       )
+      // do not set element warning if feature change disabled
+      if (!result.disableChange) {
+        let outdatedWarnings = conformChecker.getOutdatedElementWarning(
+          featureData,
+          elements,
+          result.elementMap
+        )
+        await querySessionNotification.deleteNotificationWithPatterns(
+          db,
+          sessionId,
+          outdatedWarnings
+        )
+      }
     }
 
     response.status(StatusCodes.OK).json(result)
diff --git a/src-electron/util/async-reporting.js b/src-electron/util/async-reporting.js
index fc4e0f4..5274805 100644
--- a/src-electron/util/async-reporting.js
+++ b/src-electron/util/async-reporting.js
@@ -112,7 +112,6 @@
 /**
  * Start the interval that will check and report dirty flags.
  * @param {*} db
- * @param {*} intervalMs
  */
 function startAsyncReporting(db) {
   for (let key of Object.keys(asyncReports)) {
@@ -121,14 +120,32 @@
       // Session based reports get iterated over all sessions
       // and called with appropriate session.
       report.id = setInterval(async () => {
-        let sessions = await querySession.getAllSessions(db)
-        let allPromises = sessions.map((session) => report.fn(db, session))
-        return Promise.all(allPromises)
+        try {
+          // Check if the database is closed. Set in db-api#closeDatabase
+          if (db._closed) return
+          let sessions = await querySession.getAllSessions(db)
+          let allPromises = sessions.map((session) => {
+            if (db._closed) return
+            return report.fn(db, session)
+          })
+          return Promise.all(allPromises)
+        } catch (err) {
+          // If the database was closed during an async operation, we can get an error.
+          // We can ignore it if the db is marked as closed.
+          if (db._closed) return
+          env.logWarning(`Error in session-based async reporting: ${err}`)
+        }
       }, report.intervalMs)
     } else {
       // Non session based reports get called once with the db as the argument.
-      report.id = setInterval(() => {
-        report.fn(db)
+      report.id = setInterval(async () => {
+        if (db._closed) return
+        try {
+          await report.fn(db)
+        } catch (err) {
+          if (db._closed) return // Ignore errors if DB is closed.
+          env.logWarning(`Error in non-session-based async reporting: ${err}`)
+        }
       }, report.intervalMs)
     }
   }
diff --git a/src-electron/util/env.js b/src-electron/util/env.js
index 0e39ef5..5a08f81 100644
--- a/src-electron/util/env.js
+++ b/src-electron/util/env.js
@@ -196,6 +196,11 @@
 let versionObject = null
 let applicationStateDirectory = null
 
+let file_pino_logger = pino(
+  pinoOptions,
+  pino.destination({ dest: path.join(appDirectory(), 'zap.log'), sync: true })
+)
+
 /**
  * Set up the devlopment environment.
  */
@@ -525,6 +530,18 @@
 }
 
 /**
+ * Log Warning level message to zap.log file.
+ *
+ * @param {*} msg
+ */
+export function logWarningToFile(msg) {
+  let objectToLog = {
+    msg: msg
+  }
+  file_pino_logger.warn(objectToLog)
+}
+
+/**
  * Returns true if major or minor component of versions is different.
  *
  * @param {*} versionsArray
diff --git a/src-electron/util/post-import-api.js b/src-electron/util/post-import-api.js
index 8e14fc9..ec37740 100644
--- a/src-electron/util/post-import-api.js
+++ b/src-electron/util/post-import-api.js
@@ -51,8 +51,12 @@
  *
  * @param {*} context
  */
-function endpoints(context) {
-  return queryEndpoint.selectAllEndpoints(context.db, context.sessionId)
+async function endpoints(context) {
+  return queryEndpoint.selectAllEndpoints(
+    context.db,
+    context.sessionId,
+    context.script.category
+  )
 }
 
 /**
@@ -61,7 +65,7 @@
  * @param {*} context
  * @param {*} endpoint
  */
-function deleteEndpoint(context, endpoint) {
+async function deleteEndpoint(context, endpoint) {
   return queryEndpoint.deleteEndpoint(context.db, endpoint.id)
 }
 
@@ -71,7 +75,7 @@
  * @param {*} context
  * @param {*} endpoint
  */
-function clusters(context, endpoint) {
+async function clusters(context, endpoint) {
   return queryEndpoint.selectEndpointClusters(
     context.db,
     endpoint.endpointTypeRef
@@ -86,7 +90,7 @@
  * @param {*} endpoint
  * @param {*} cluster
  */
-function attributes(context, endpoint, cluster) {
+async function attributes(context, endpoint, cluster) {
   return queryEndpoint.selectEndpointClusterAttributes(
     context.db,
     cluster.clusterId,
@@ -103,7 +107,7 @@
  * @param {*} endpoint
  * @param {*} cluster
  */
-function commands(context, endpoint, cluster) {
+async function commands(context, endpoint, cluster) {
   return queryEndpoint.selectEndpointClusterCommands(
     context.db,
     cluster.clusterId,
@@ -289,6 +293,30 @@
 }
 
 /**
+ * Update an attribute with given parameters.
+ *
+ * @param {*} context
+ * @param {*} endpoint
+ * @param {*} cluster
+ * @param {*} attribute
+ * @param {*} params
+ * @returns promise of an updated or inserted attribute with parameters provided
+ */
+async function updateAttribute(context, endpoint, cluster, attribute, params) {
+  return queryConfig.insertOrUpdateAttributeState(
+    context.db,
+    endpoint.endpointTypeRef,
+    cluster.id,
+    attribute.side,
+    attribute.id,
+    params,
+    attribute.reportMinInterval,
+    attribute.reportMaxInterval,
+    attribute.reportableChange
+  )
+}
+
+/**
  * Non-public, common function to modify command.
  *
  * @param {*} context
@@ -617,6 +645,7 @@
 exports.enableIncomingCommand = enableIncomingCommand
 exports.disableOutgoingCommand = disableOutgoingCommand
 exports.enableOutgoingCommand = enableOutgoingCommand
+exports.updateAttribute = updateAttribute
 
 // Constants that are used a lot
 exports.client = dbEnum.source.client
diff --git a/src-electron/util/post-import.js b/src-electron/util/post-import.js
index 0b1a42f..9d84ac1 100644
--- a/src-electron/util/post-import.js
+++ b/src-electron/util/post-import.js
@@ -30,17 +30,18 @@
  * Executes a named function from a given script.
  * Arguments passed to the function are:
  *   api: which is the result of require('script-api.js')
- *   context: which contains 'db', 'sessionId', etc.
+ *   context: which contains 'db', 'sessionId', script category, etc.
  *
  * @param {*} functionName
  * @param {*} db
  * @param {*} sessionId
- * @param {*} script
  */
-async function executeScriptFunction(functionName, context, script) {
-  let resolvedPath = path.resolve(script)
+async function executeScriptFunction(functionName, context) {
+  let resolvedPath = path.resolve(context.script.path)
   let loadedScript = nativeRequire(resolvedPath)
   if (loadedScript[functionName]) {
+    // Add updateKeys available to the context
+    context.updateKey = require('../../src-shared/rest-api.js').updateKey
     return loadedScript[functionName](scriptApi, context)
   }
 }
diff --git a/src-electron/util/types.js b/src-electron/util/types.js
index 4f7cbf9..7a372ad 100644
--- a/src-electron/util/types.js
+++ b/src-electron/util/types.js
@@ -169,7 +169,7 @@
   let v = ''
   if (value == null || value.length == 0) {
     v = '0x00, '.repeat(size)
-  } else if (isNaN(value)) {
+  } else if (isString(type)) {
     // String Value
     if (isOneBytePrefixedString(type)) {
       v = bin.stringToOneByteLengthPrefixCBytes(value, size).content
diff --git a/src-electron/validation/conformance-checker.js b/src-electron/validation/conformance-checker.js
index c0630ce..acf9941 100644
--- a/src-electron/validation/conformance-checker.js
+++ b/src-electron/validation/conformance-checker.js
@@ -26,6 +26,7 @@
 const queryFeature = require('../db/query-feature')
 const querySessionNotice = require('../db/query-session-notification')
 const queryEndpointType = require('../db/query-endpoint-type')
+const dbEnum = require('../../src-shared/db-enum')
 
 /**
  *
@@ -37,7 +38,11 @@
 function filterRelatedDescElements(elements, featureCode) {
   return elements.filter((element) => {
     let terms = element.conformance.match(/[A-Za-z][A-Za-z0-9_]*/g)
-    return terms && terms.includes('desc') && terms.includes(featureCode)
+    return (
+      terms &&
+      terms.includes(dbEnum.conformance.desc) &&
+      terms.includes(featureCode)
+    )
   })
 }
 
diff --git a/src-electron/validation/conformance-expression-evaluator.js b/src-electron/validation/conformance-expression-evaluator.js
index 34979c7..faaa219 100644
--- a/src-electron/validation/conformance-expression-evaluator.js
+++ b/src-electron/validation/conformance-expression-evaluator.js
@@ -21,6 +21,8 @@
  * @module Validation API: Evaluate conformance expressions
  */
 
+const dbEnum = require('../../src-shared/db-enum')
+
 /**
  * Evaluate the value of a boolean conformance expression that includes terms and operators.
  * A term can be an attribute, command, event, feature, or conformance abbreviation.
@@ -75,8 +77,8 @@
   // if any term is desc, the conformance is too complex to parse
   for (let part of parts) {
     let terms = part.match(/[A-Za-z][A-Za-z0-9_]*/g)
-    if (terms && terms.includes('desc')) {
-      return 'desc'
+    if (terms && terms.includes(dbEnum.conformance.desc)) {
+      return dbEnum.conformance.desc
     }
   }
   for (let part of parts) {
@@ -91,13 +93,16 @@
       }
     } else {
       part = part.trim()
-      if (part == 'M') {
+      if (part == dbEnum.conformance.mandatory) {
         return 'mandatory'
-      } else if (part == 'O') {
+      } else if (part == dbEnum.conformance.optional) {
         return 'optional'
-      } else if (part == 'D' || part == 'X') {
+      } else if (
+        part == dbEnum.conformance.deprecated ||
+        part == dbEnum.conformance.disallowed
+      ) {
         return 'notSupported'
-      } else if (part == 'P') {
+      } else if (part == dbEnum.conformance.provisional) {
         return 'provisional'
       } else {
         // Evaluate the part with parentheses if needed
@@ -123,7 +128,7 @@
 function checkMissingTerms(expression, elementMap) {
   let terms = expression.match(/[A-Za-z][A-Za-z0-9_]*/g)
   let missingTerms = []
-  let abbreviations = ['M', 'O', 'P', 'D', 'X']
+  let abbreviations = Object.values(dbEnum.conformance)
   for (let term of terms) {
     if (!(term in elementMap) && !abbreviations.includes(term)) {
       missingTerms.push(term)
@@ -132,5 +137,18 @@
   return missingTerms
 }
 
+/**
+ * Check if the expression contains a given term.
+ *
+ * @param expression
+ * @param term
+ * @returns true if the expression contains the term, false otherwise
+ */
+function checkIfExpressionHasTerm(expression, term) {
+  let terms = expression.match(/[A-Za-z][A-Za-z0-9_]*/g)
+  return terms && terms.includes(term)
+}
+
 exports.evaluateConformanceExpression = evaluateConformanceExpression
 exports.checkMissingTerms = checkMissingTerms
+exports.checkIfExpressionHasTerm = checkIfExpressionHasTerm
diff --git a/src-electron/validation/conformance-xml-parser.js b/src-electron/validation/conformance-xml-parser.js
index b73ab9e..daa9b32 100644
--- a/src-electron/validation/conformance-xml-parser.js
+++ b/src-electron/validation/conformance-xml-parser.js
@@ -21,6 +21,10 @@
  * @module Validation API: Parse conformance data from XML
  */
 
+const dbEnum = require('../../src-shared/db-enum')
+const conformEvaluator = require('./conformance-expression-evaluator')
+const env = require('../util/env')
+
 /**
  * Parses conformance from XML data.
  * The conformance could come from features, attributes, commands, or events
@@ -88,7 +92,7 @@
     if (insideTerm && Object.keys(insideTerm).toString() != '$') {
       return parseConformanceRecursively(operand.mandatoryConform[0], depth + 1)
     } else {
-      return 'M'
+      return dbEnum.conformance.mandatory
     }
   } else if (operand.optionalConform) {
     let insideTerm = operand.optionalConform[0]
@@ -97,7 +101,7 @@
     if (insideTerm && Object.keys(insideTerm).toString() != '$') {
       return `[${parseConformanceRecursively(operand.optionalConform[0], depth + 1)}]`
     } else {
-      return 'O'
+      return dbEnum.conformance.optional
     }
   } else if (operand.otherwiseConform) {
     return Object.entries(operand.otherwiseConform[0])
@@ -138,11 +142,11 @@
       })
       .join(` ${joinChar} `)
   } else if (operand.provisionalConform) {
-    return 'P'
+    return dbEnum.conformance.provisional
   } else if (operand.disallowConform) {
-    return 'X'
+    return dbEnum.conformance.disallowed
   } else if (operand.deprecateConform) {
-    return 'D'
+    return dbEnum.conformance.deprecated
   } else {
     // reach base level terms, return the name directly
     for (const term of baseLevelTerms) {
@@ -151,8 +155,42 @@
       }
     }
     // reaching here means the term is too complex to parse
-    return 'desc'
+    return dbEnum.conformance.desc
+  }
+}
+
+/**
+ * if optional attribute is defined, return its value
+ * if optional attribute is undefined, check if the element conformance is mandatory
+ * if both optional attribute and conformance are undefined, return false
+ * Optional attribute takes precedence over conformance for backward compatibility on certain elements
+ * Log warnings to zap.log if both optional attribute and conformance are defined
+ *
+ * @param {*} element
+ * @param {*} elementType
+ * @returns true if the element is optional, false if the element is mandatory
+ */
+function getOptionalAttributeFromXML(element, elementType) {
+  let conformance = parseConformanceFromXML(element)
+  if (element.$.optional) {
+    if (conformance) {
+      env.logWarningToFile(
+        `Redundant 'optional' attribute and 'conformance' tag defined for ${elementType}: ${element.$.name}.` +
+          " 'optional' takes precedence, but consider removing it as 'conformance' is the recommended format."
+      )
+    }
+    return element.$.optional == 'true'
+  } else {
+    if (conformance) {
+      return !conformEvaluator.checkIfExpressionHasTerm(
+        conformance,
+        dbEnum.conformance.mandatory
+      )
+    } else {
+      return false
+    }
   }
 }
 
 exports.parseConformanceFromXML = parseConformanceFromXML
+exports.getOptionalAttributeFromXML = getOptionalAttributeFromXML
diff --git a/src-electron/validation/validation.js b/src-electron/validation/validation.js
index 0155014..fcad824 100644
--- a/src-electron/validation/validation.js
+++ b/src-electron/validation/validation.js
@@ -151,7 +151,10 @@
     let maxAllowedLength = attribute.maxLength
       ? attribute.maxLength
       : maxLengthForString
-    if (endpointAttribute.defaultValue.length > maxAllowedLength) {
+    if (
+      typeof endpointAttribute.defaultValue === 'string' &&
+      endpointAttribute.defaultValue.length > maxAllowedLength
+    ) {
       defaultAttributeIssues.push('String length out of range')
     }
   }
diff --git a/src-electron/zcl/zcl-loader-silabs.js b/src-electron/zcl/zcl-loader-silabs.js
index bf0549e..a4b0497 100644
--- a/src-electron/zcl/zcl-loader-silabs.js
+++ b/src-electron/zcl/zcl-loader-silabs.js
@@ -506,7 +506,10 @@
         name: command.$.name,
         description: command.description ? command.description[0].trim() : '',
         source: command.$.source,
-        isOptional: command.$.optional == 'true' ? true : false,
+        isOptional: conformParser.getOptionalAttributeFromXML(
+          command,
+          'command'
+        ),
         conformance: conformParser.parseConformanceFromXML(command),
         mustUseTimedInvoke: command.$.mustUseTimedInvoke == 'true',
         introducedIn: command.$.introducedIn,
@@ -567,7 +570,7 @@
         conformance: conformParser.parseConformanceFromXML(event),
         priority: event.$.priority,
         description: event.description ? event.description[0].trim() : '',
-        isOptional: event.$.optional == 'true',
+        isOptional: conformParser.getOptionalAttributeFromXML(event, 'event'),
         isFabricSensitive: event.$.isFabricSensitive == 'true'
       }
       ev.access = extractAccessIntoArray(event)
@@ -685,7 +688,10 @@
           : null,
         isWritable: attribute.$.writable == 'true',
         defaultValue: attribute.$.default,
-        isOptional: attribute.$.optional == 'true',
+        isOptional: conformParser.getOptionalAttributeFromXML(
+          attribute,
+          'attribute'
+        ),
         reportingPolicy: reportingPolicy,
         storagePolicy: storagePolicy,
         isSceneRequired:
diff --git a/src-shared/db-enum.js b/src-shared/db-enum.js
index 34bd02f..ca82f21 100644
--- a/src-shared/db-enum.js
+++ b/src-shared/db-enum.js
@@ -220,6 +220,7 @@
 
 exports.feature = {
   name: {
+    status: 'status',
     enabled: 'enabled',
     deviceType: 'deviceType',
     cluster: 'cluster',
@@ -231,6 +232,7 @@
     description: 'description'
   },
   label: {
+    status: '',
     enabled: 'Enabled',
     deviceType: 'Device Type',
     cluster: 'Cluster',
@@ -247,3 +249,17 @@
   name: 'FeatureMap',
   code: 65532
 }
+
+exports.conformance = {
+  mandatory: 'M',
+  optional: 'O',
+  disallowed: 'X',
+  deprecated: 'D',
+  provisional: 'P',
+  desc: 'desc'
+}
+
+exports.clusterSide = {
+  client: 'client',
+  server: 'server'
+}
diff --git a/src/App.vue b/src/App.vue
index 7798897..8b05882 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -152,6 +152,9 @@
     showExceptionIcon() {
       return this.$store.state.zap.showExceptionIcon
     },
+    query() {
+      return this.$store.state.zap.query // Access the query string from Vuex
+    },
     uiThemeCategory: {
       get() {
         if (this.$store.state.zap.isMultiConfig) {
@@ -171,12 +174,9 @@
   },
   methods: {
     parseQueryString() {
-      let search = window.location.search
-
-      if (search[0] === '?') {
-        search = search.substring(1)
-      }
-      this.query = querystring.parse(search)
+      const searchParams = new URLSearchParams(window.location.search)
+      const query = Object.fromEntries(searchParams.entries()) // Parse query string into an object
+      this.$store.commit('zap/setQuery', query) // Store it in Vuex
     },
 
     setTheme() {
@@ -263,37 +263,28 @@
           )
         })
       }
-
-      // Parse the query string into the front end.
-      let search = window.location.search
-
-      if (search[0] === '?') {
-        search = search.substring(1)
+      if (this.query[`uiMode`]) {
+        this.$store.dispatch('zap/setDefaultUiMode', this.query[`uiMode`])
       }
 
-      let query = querystring.parse(search)
-      if (query[`uiMode`]) {
-        this.$store.dispatch('zap/setDefaultUiMode', query[`uiMode`])
-      }
-
-      if (`debugNavBar` in query) {
+      if (`debugNavBar` in this.query) {
         this.$store.dispatch(
           'zap/setDebugNavBar',
-          query[`debugNavBar`] === 'true'
+          this.query[`debugNavBar`] === 'true'
         )
       } else {
         // If we don't specify it, default is on.
         this.$store.dispatch('zap/setDebugNavBar', true)
       }
 
-      if ('standalone' in query) {
-        this.$store.dispatch('zap/setStandalone', query['standalone'])
+      if ('standalone' in this.query) {
+        this.$store.dispatch('zap/setStandalone', this.query['standalone'])
       }
 
-      if (`setSaveButtonVisible` in query) {
+      if (`setSaveButtonVisible` in this.query) {
         this.$store.dispatch(
           'zap/setSaveButtonVisible',
-          query[`setSaveButtonVisible`] === 'true'
+          this.query[`setSaveButtonVisible`] === 'true'
         )
       } else {
         // If we don't specify it, default is off.
@@ -318,7 +309,7 @@
 
       // load initial UC component state
       this.$store.dispatch(`zap/loadUcComponentState`)
-      if (query[`newConfig`]) {
+      if (this.query[`newConfig`]) {
         this.loadInitialEndpoints()
       }
 
diff --git a/src/components/ZCLToolbar.vue b/src/components/ZCLToolbar.vue
index aee551b..161d652 100644
--- a/src/components/ZCLToolbar.vue
+++ b/src/components/ZCLToolbar.vue
@@ -61,9 +61,7 @@
       flat
       no-caps
       @click="saveChanges"
-      v-if="
-        this.$store.state.zap.saveButtonVisible && this.$store.state.zap.isDirty
-      "
+      v-if="showSaveButton"
     >
       <div class="text-center">
         <q-icon name="o_save" />
@@ -245,6 +243,12 @@
   name: 'ZCLToolbar',
   mixins: [CommonMixin],
   computed: {
+    query() {
+      return this.$store.state.zap.query // Access the query string from Vuex
+    },
+    showSaveButton() {
+      return !!this.query['stsApplicationId'] // Use optional chaining and double negation for clarity
+    },
     isCoreDocumentationAvailable() {
       return (
         this.$store.state.zap.genericOptions[
diff --git a/src/components/ZclDeviceTypeFeatureManager.vue b/src/components/ZclDeviceTypeFeatureManager.vue
index a4e01ac..60a678c 100644
--- a/src/components/ZclDeviceTypeFeatureManager.vue
+++ b/src/components/ZclDeviceTypeFeatureManager.vue
@@ -28,17 +28,46 @@
         <q-table
           class="my-striped-table"
           :rows="deviceTypeFeatures"
-          :columns="columns"
+          :columns="filteredColumns"
           flat
           v-model:pagination="pagination"
           separator="horizontal"
           id="ZclDeviceTypeFeatureManager"
         >
           <template v-slot:body="props">
-            <q-tr :props="props">
+            <q-tr :props="props" class="table_body attribute_table_body">
+              <q-td
+                v-if="hasFeatureWithDisabledCluster"
+                key="status"
+                :props="props"
+                class="q-px-none"
+                style="width: 30px; max-width: 30px"
+              >
+                <q-icon
+                  v-show="isClusterDisabled(props.row)"
+                  name="warning"
+                  class="text-amber"
+                  style="font-size: 1.5rem"
+                />
+                <q-tooltip
+                  v-if="isClusterDisabled(props.row)"
+                  anchor="top middle"
+                  self="bottom middle"
+                  :offset="[10, 10]"
+                >
+                  <div
+                    v-for="(line, index) in generateDisabledClusterWarning(
+                      props.row
+                    )"
+                    :key="index"
+                  >
+                    {{ line }}
+                  </div>
+                </q-tooltip>
+              </q-td>
               <q-td key="enabled" :props="props" auto-width>
                 <q-toggle
-                  :disable="isToggleDisabled(props.row.conformance)"
+                  :disable="isToggleDisabled(props.row)"
                   class="q-mt-xs v-step-14"
                   v-model="enabledDeviceTypeFeatures"
                   :val="
@@ -88,16 +117,11 @@
             </q-tr>
           </template>
         </q-table>
-        <q-dialog v-model="showDialog">
+        <q-dialog v-model="showDialog" persistent>
           <q-card>
             <q-card-section>
               <div class="row items-center">
-                <div class="text-h6 col">Updated Elements</div>
-                <div class="col-1 text-right">
-                  <q-btn dense flat icon="close" v-close-popup>
-                    <q-tooltip>Close</q-tooltip>
-                  </q-btn>
-                </div>
+                <div class="text-h6 col">Elements to be updated</div>
               </div>
               <div v-if="attributesToUpdate.length > 0">
                 <div
@@ -108,7 +132,9 @@
                 </div>
                 <ul>
                   <li
-                    v-for="(attribute, index) in attributesToUpdate"
+                    v-for="(attribute, index) in processElementsForDialog(
+                      attributesToUpdate
+                    )"
                     :key="'attribute' + index"
                     style="margin-bottom: 10px"
                   >
@@ -125,7 +151,9 @@
                 </div>
                 <ul>
                   <li
-                    v-for="(command, index) in commandsToUpdate"
+                    v-for="(command, index) in processElementsForDialog(
+                      commandsToUpdate
+                    )"
                     :key="'command' + index"
                     style="margin-bottom: 10px"
                   >
@@ -142,7 +170,9 @@
                 </div>
                 <ul>
                   <li
-                    v-for="(event, index) in eventsToUpdate"
+                    v-for="(event, index) in processElementsForDialog(
+                      eventsToUpdate
+                    )"
                     :key="'event' + index"
                     style="margin-bottom: 10px"
                   >
@@ -150,12 +180,18 @@
                   </li>
                 </ul>
               </div>
-              <div v-if="noElementsToUpdate">
-                <div class="text-body1" style="margin-top: 15px">
-                  {{ noElementsToUpdateMessage }}
-                </div>
-              </div>
             </q-card-section>
+            <q-card-actions>
+              <q-btn label="Cancel" v-close-popup class="col" />
+              <q-btn
+                label="Confirm"
+                color="primary"
+                @click="
+                  confirmFeatureUpdate(selectedFeature, updatedEnabledFeatures)
+                "
+                class="col v-step-4 w-step-3"
+              />
+            </q-card-actions>
           </q-card>
         </q-dialog>
       </div>
@@ -190,20 +226,159 @@
         return 'none'
       }
     },
-    isToggleDisabled(conformance) {
-      // disable toggling unsupported features
-      return conformance == 'X' || conformance == 'D'
+    isToggleDisabled(feature) {
+      // disable toggling features with unsupported conformance and disabled clusters
+      return (
+        feature.conformance == dbEnum.conformance.disallowed ||
+        feature.conformance == dbEnum.conformance.deprecated ||
+        this.isClusterDisabled(feature)
+      )
     },
     onToggleDeviceTypeFeature(featureData, inclusionList) {
-      /* when conformance is not properly handled and change is disabled,
-        do not set featureMap attribute */
-      let disabled = this.updateElementsAndSetWarnings(
-        featureData,
-        inclusionList
-      )
-      if (!disabled) {
-        this.setFeatureMapAttribute(featureData)
+      let featureMap = this.buildFeatureMap(featureData, inclusionList)
+      this.$serverPost(restApi.uri.checkConformOnFeatureUpdate, {
+        featureData: featureData,
+        featureMap: featureMap,
+        endpointId: this.endpointId[this.selectedEndpointId],
+        changeConfirmed: false
+      }).then((res) => {
+        // store backend response and frontend data for reuse if updates are confirmed
+        let {
+          attributesToUpdate,
+          commandsToUpdate,
+          eventsToUpdate,
+          displayWarning,
+          warningMessage,
+          disableChange
+        } = res.data
+
+        Object.assign(this, {
+          attributesToUpdate,
+          commandsToUpdate,
+          eventsToUpdate,
+          displayWarning,
+          warningMessage,
+          disableChange
+        })
+
+        this.selectedFeature = featureData
+        this.updatedEnabledFeatures = inclusionList
+
+        // if change disabled, display warning and do not show confirm dialog
+        if (this.disableChange) {
+          if (this.displayWarning) {
+            this.displayPopUpWarnings(this.warningMessage)
+          }
+        } else if (this.noElementsToUpdate) {
+          this.confirmFeatureUpdate(featureData, inclusionList)
+        } else {
+          this.showDialog = true
+        }
+      })
+    },
+    confirmFeatureUpdate(featureData, inclusionList) {
+      let featureMap = this.buildFeatureMap(featureData, inclusionList)
+      this.$store
+        .dispatch('zap/setRequiredElements', {
+          featureMap: featureMap,
+          deviceTypeClusterId: featureData.deviceTypeClusterId,
+          endpointTypeClusterId: featureData.endpointTypeClusterId
+        })
+        .then(() => {
+          // toggle attributes, commands, and events for correct conformance,
+          // and set their conformance warnings
+          this.attributesToUpdate.forEach((attribute) => {
+            let editContext = {
+              action: 'boolean',
+              endpointTypeIdList: this.endpointTypeIdList,
+              selectedEndpoint: this.selectedEndpointTypeId,
+              id: attribute.id,
+              value: attribute.value,
+              listType: 'selectedAttributes',
+              clusterRef: attribute.clusterRef,
+              attributeSide: attribute.side,
+              reportMinInterval: attribute.reportMinInterval,
+              reportMaxInterval: attribute.reportMaxInterval
+            }
+            this.setRequiredElementNotifications(
+              attribute,
+              attribute.value,
+              'attributes'
+            )
+            this.$store.dispatch('zap/updateSelectedAttribute', editContext)
+          })
+          this.commandsToUpdate.forEach((command) => {
+            let listType =
+              command.source == 'client' ? 'selectedIn' : 'selectedOut'
+            let editContext = {
+              action: 'boolean',
+              endpointTypeIdList: this.endpointTypeIdList,
+              id: command.id,
+              value: command.value,
+              listType: listType,
+              clusterRef: command.clusterRef,
+              commandSide: command.source
+            }
+            this.setRequiredElementNotifications(
+              command,
+              command.value,
+              'commands'
+            )
+            this.$store.dispatch('zap/updateSelectedCommands', editContext)
+          })
+          this.eventsToUpdate.forEach((event) => {
+            let editContext = {
+              action: 'boolean',
+              endpointTypeId: this.selectedEndpointTypeId,
+              id: event.id,
+              value: event.value,
+              listType: 'selectedEvents',
+              clusterRef: event.clusterRef,
+              eventSide: event.side
+            }
+            this.setRequiredElementNotifications(event, event.value, 'events')
+            this.$store.dispatch('zap/updateSelectedEvents', editContext)
+          })
+
+          // update enabled device type features
+          let added = this.featureIsEnabled(featureData, inclusionList)
+          let hashedVal = this.hashDeviceTypeClusterIdFeatureId(
+            featureData.deviceTypeClusterId,
+            featureData.featureId
+          )
+          this.$store.commit('zap/updateInclusionList', {
+            id: hashedVal,
+            added: added,
+            listType: 'enabledDeviceTypeFeatures',
+            view: 'featureView'
+          })
+        })
+
+      // set notifications and pop-up warnings for the updated feature
+      this.$serverPost(restApi.uri.checkConformOnFeatureUpdate, {
+        featureData: featureData,
+        featureMap: featureMap,
+        endpointId: this.endpointId[this.selectedEndpointId],
+        changeConfirmed: true
+      })
+      if (this.displayWarning) {
+        this.displayPopUpWarnings(this.warningMessage)
       }
+
+      // update featureMap attribute value for the updated cluster
+      this.setFeatureMapAttribute(featureData)
+
+      // close the dialog
+      this.showDialog = false
+
+      // clean the state of variables related to the dialog
+      Object.assign(this, {
+        displayWarning: false,
+        warningMessage: '',
+        disableChange: false,
+        selectedFeature: {},
+        updatedEnabledFeatures: []
+      })
     },
     setFeatureMapAttribute(featureData) {
       let featureMapAttributeId = featureData.featureMapAttributeId
@@ -220,150 +395,45 @@
         featureMapValue: newValue
       })
     },
-    updateElementsAndSetWarnings(featureData, inclusionList) {
+    processElementsForDialog(elementData) {
+      return (elementData || [])
+        .map((item) =>
+          item.value ? 'enabled ' + item.name : 'disabled ' + item.name
+        )
+        .sort(
+          // sort enabled elements before disabled ones
+          (a, b) => {
+            let aIsEnabled = a.includes('enabled')
+            let bIsEnabled = b.includes('enabled')
+            if (aIsEnabled && !bIsEnabled) return -1
+            if (!aIsEnabled && bIsEnabled) return 1
+            return 0
+          }
+        )
+    },
+    displayPopUpWarnings(warningMessage) {
+      if (!Array.isArray(warningMessage)) {
+        warningMessage = [warningMessage]
+      }
+      for (let warning of warningMessage) {
+        Notify.create({
+          message: warning,
+          type: 'warning',
+          classes: 'custom-notification notification-warning',
+          position: 'top',
+          html: true
+        })
+      }
+    },
+    buildFeatureMap(featureData, inclusionList) {
       let featureMap = {}
       this.deviceTypeFeatures.forEach((feature) => {
-        if (feature.deviceTypeClusterId == featureData.deviceTypeClusterId) {
+        if (feature.deviceTypeClusterId === featureData.deviceTypeClusterId) {
           let enabled = this.featureIsEnabled(feature, inclusionList)
           featureMap[feature.code] = enabled ? 1 : 0
         }
       })
-      this.$serverPost(restApi.uri.checkConformOnFeatureUpdate, {
-        featureData: featureData,
-        featureMap: featureMap,
-        endpointId: this.endpointId[this.selectedEndpointId]
-      }).then((res) => {
-        let {
-          attributesToUpdate,
-          commandsToUpdate,
-          eventsToUpdate,
-          displayWarning,
-          warningMessage,
-          disableChange
-        } = res.data
-
-        // show popup warning message
-        if (displayWarning) {
-          if (!Array.isArray(warningMessage)) {
-            warningMessage = [warningMessage]
-          }
-          for (let message of warningMessage) {
-            Notify.create({
-              message: message,
-              type: 'warning',
-              classes: 'custom-notification notification-warning',
-              position: 'top',
-              html: true
-            })
-          }
-        }
-
-        // if disableChange is true, the case is too complex to handle
-        // throw warnings and skip the following actions
-        if (disableChange) {
-          return disableChange
-        }
-
-        this.$store
-          .dispatch('zap/setRequiredElements', {
-            featureMap: featureMap,
-            deviceTypeClusterId: featureData.deviceTypeClusterId,
-            endpointTypeClusterId: featureData.endpointTypeClusterId
-          })
-          .then(() => {
-            // toggle attributes, commands, and events for correct conformance,
-            // and set their conformance notifications
-            attributesToUpdate.forEach((attribute) => {
-              let editContext = {
-                action: 'boolean',
-                endpointTypeIdList: this.endpointTypeIdList,
-                selectedEndpoint: this.selectedEndpointTypeId,
-                id: attribute.id,
-                value: attribute.value,
-                listType: 'selectedAttributes',
-                clusterRef: attribute.clusterRef,
-                attributeSide: attribute.side,
-                reportMinInterval: attribute.reportMinInterval,
-                reportMaxInterval: attribute.reportMaxInterval
-              }
-              this.setRequiredElementNotifications(
-                attribute,
-                attribute.value,
-                'attributes'
-              )
-              this.$store.dispatch('zap/updateSelectedAttribute', editContext)
-            })
-            commandsToUpdate.forEach((command) => {
-              let listType =
-                command.source == 'client' ? 'selectedIn' : 'selectedOut'
-              let editContext = {
-                action: 'boolean',
-                endpointTypeIdList: this.endpointTypeIdList,
-                id: command.id,
-                value: command.value,
-                listType: listType,
-                clusterRef: command.clusterRef,
-                commandSide: command.source
-              }
-              this.setRequiredElementNotifications(
-                command,
-                command.value,
-                'commands'
-              )
-              this.$store.dispatch('zap/updateSelectedCommands', editContext)
-            })
-            eventsToUpdate.forEach((event) => {
-              let editContext = {
-                action: 'boolean',
-                endpointTypeId: this.selectedEndpointTypeId,
-                id: event.id,
-                value: event.value,
-                listType: 'selectedEvents',
-                clusterRef: event.clusterRef,
-                eventSide: event.side
-              }
-              this.setRequiredElementNotifications(event, event.value, 'events')
-              this.$store.dispatch('zap/updateSelectedEvents', editContext)
-            })
-
-            // prepare messages and show dialog
-            this.attributesToUpdate = attributesToUpdate
-              .map((attribute) =>
-                attribute.value
-                  ? 'enabled ' + attribute.name
-                  : 'disabled ' + attribute.name
-              )
-              .sort((a, b) => (a.includes('enabled') ? -1 : 1))
-            this.commandsToUpdate = commandsToUpdate
-              .map((command) =>
-                command.value
-                  ? 'enabled ' + command.name
-                  : 'disabled ' + command.name
-              )
-              .sort((a, b) => (a.includes('enabled') ? -1 : 1))
-            this.eventsToUpdate = eventsToUpdate
-              .map((event) =>
-                event.value ? 'enabled ' + event.name : 'disabled ' + event.name
-              )
-              .sort((a, b) => (a.includes('enabled') ? -1 : 1))
-            this.showDialog = true
-
-            // update enabled device type features
-            let added = this.featureIsEnabled(featureData, inclusionList)
-            let hashedVal = this.hashDeviceTypeClusterIdFeatureId(
-              featureData.deviceTypeClusterId,
-              featureData.featureId
-            )
-            this.$store.commit('zap/updateInclusionList', {
-              id: hashedVal,
-              added: added,
-              listType: 'enabledDeviceTypeFeatures',
-              view: 'featureView'
-            })
-          })
-
-        return disableChange
-      })
+      return featureMap
     },
     featureIsEnabled(featureData, inclusionList) {
       return inclusionList.includes(
@@ -372,6 +442,34 @@
           featureData.featureId
         )
       )
+    },
+    isClusterDisabled(feature) {
+      return this.getMissingClusterSide(feature).length > 0
+    },
+    getMissingClusterSide(feature) {
+      let sides = []
+      let clusterId = feature.clusterRef
+      if (
+        !this.selectionClients.includes(clusterId) &&
+        feature.includeClient == 1
+      ) {
+        sides.push(dbEnum.clusterSide.client)
+      }
+      if (
+        !this.selectionServers.includes(clusterId) &&
+        feature.includeServer == 1
+      ) {
+        sides.push(dbEnum.clusterSide.server)
+      }
+      return sides
+    },
+    generateDisabledClusterWarning(feature) {
+      let sides = this.getMissingClusterSide(feature).join(' and ')
+      return [
+        `This feature cannot be toggled because its associated cluster: 
+        ${feature.cluster} ${sides} is disabled.`,
+        'Enable the cluster to allow toggling this feature.'
+      ]
     }
   },
   computed: {
@@ -381,13 +479,23 @@
         this.commandsToUpdate.length == 0 &&
         this.eventsToUpdate.length == 0
       )
+    },
+    filteredColumns() {
+      return this.hasFeatureWithDisabledCluster
+        ? this.columns
+        : this.columns.filter(
+            (column) => column.name != dbEnum.feature.name.status
+          )
+    },
+    hasFeatureWithDisabledCluster() {
+      return this.deviceTypeFeatures.some((feature) =>
+        this.isClusterDisabled(feature)
+      )
     }
   },
   data() {
     return {
       noDataMessage: 'No device type features available for this endpoint',
-      noElementsToUpdateMessage:
-        'No elements need to be updated after toggling this feature',
       pagination: {
         rowsPerPage: 10
       },
@@ -395,8 +503,19 @@
       attributesToUpdate: [],
       commandsToUpdate: [],
       eventsToUpdate: [],
+      disableChange: false,
+      displayWarning: false,
+      warningMessage: '',
+      selectedFeature: {},
+      updatedEnabledFeatures: [],
       columns: [
         {
+          name: dbEnum.feature.name.status,
+          required: false,
+          label: dbEnum.feature.label.status,
+          align: 'left'
+        },
+        {
           name: dbEnum.feature.name.enabled,
           required: true,
           label: dbEnum.feature.label.enabled,
diff --git a/src/components/ZclEventManager.vue b/src/components/ZclEventManager.vue
index 1938909..dc80f39 100644
--- a/src/components/ZclEventManager.vue
+++ b/src/components/ZclEventManager.vue
@@ -116,6 +116,7 @@
 import EditableAttributesMixin from '../util/editable-attributes-mixin.js'
 import uiOptions from '../util/ui-options'
 import CommonMixin from '../util/common-mixin'
+import dbEnum from '../../src-shared/db-enum'
 
 export default {
   name: 'ZclEventManager',
@@ -179,7 +180,8 @@
             !this.isEventSelected(row.id)) ||
             (this.eventsNotSupportedByConform[row.id] &&
               this.isEventSelected(row.id)))) ||
-        (row.conformance == 'M' && !this.isEventSelected(row.id))
+        (row.conformance == dbEnum.conformance.mandatory &&
+          !this.isEventSelected(row.id))
       )
     },
     getEventWarning(row) {
@@ -198,7 +200,10 @@
       ) {
         warnings.push(this.eventsNotSupportedByConform[row.id])
       }
-      if (row.conformance == 'M' && !this.isEventSelected(row.id)) {
+      if (
+        row.conformance == dbEnum.conformance.mandatory &&
+        !this.isEventSelected(row.id)
+      ) {
         warnings.push(this.defaultWarning)
       }
       return warnings
diff --git a/src/store/zap/actions.js b/src/store/zap/actions.js
index 4eba9f4..44284d5 100644
--- a/src/store/zap/actions.js
+++ b/src/store/zap/actions.js
@@ -1172,15 +1172,6 @@
 }
 
 /**
- * Show or hide the Save button in ZAP UI.
- * @param {*} context
- * @param {*} saveButtonVisible
- */
-export function setSaveButtonVisible(context, saveButtonVisible) {
-  context.commit('setSaveButtonVisible', saveButtonVisible)
-}
-
-/**
  * Set the mode of ZAP UI.
  * @param {*} context
  * @param {*} standalone
diff --git a/src/store/zap/mutations.js b/src/store/zap/mutations.js
index 96a53b5..6d27f93 100644
--- a/src/store/zap/mutations.js
+++ b/src/store/zap/mutations.js
@@ -49,6 +49,10 @@
   state.showDevTools = !state.showDevTools
 }
 
+export const setQuery = (state, query) => {
+  state.query = query
+}
+
 /**
  * Set the information text in the state
  * @param {*} state
@@ -786,15 +790,6 @@
 }
 
 /**
- * Show save button in the UI using the state.
- * @param {*} state
- * @param {*} saveButtonVisible
- */
-export function setSaveButtonVisible(state, saveButtonVisible) {
-  state.saveButtonVisible = saveButtonVisible
-}
-
-/**
  * Set standalone mode for ZAP using the state.
  * @param {*} state
  * @param {*} standalone
diff --git a/src/store/zap/state.js b/src/store/zap/state.js
index 1c39e04..9e82c17 100644
--- a/src/store/zap/state.js
+++ b/src/store/zap/state.js
@@ -52,12 +52,11 @@
     featureMapValue: 0,
     zclDeviceTypes: {},
     endpoints: [],
+    query: {},
     genericOptions: {},
     selectedGenericOptions: {},
     projectPackages: [],
     allPackages: [],
-    isDirty: false,
-    saveButtonVisible: false,
     clusterManager: {
       openDomains: {},
       lastSelectedDomain: null,
diff --git a/test/gen-matter-3-1.test.js b/test/gen-matter-3-1.test.js
index 90d53e3..5978271 100644
--- a/test/gen-matter-3-1.test.js
+++ b/test/gen-matter-3-1.test.js
@@ -368,6 +368,9 @@
     expect(endpointType1.deviceTypeRef[1]).toEqual(
       endpointType2.deviceTypeRef[0]
     )
+
+    // Testing number values for string type attributes under GENERATED_DEFAULTS(helper-endpointconfig.js)
+    expect(ept).toMatch(/\/\* 17 - Description, \*\/\\\n.*2, '7', '7',/)
   },
   testUtil.timeout.long()
 )
@@ -567,6 +570,14 @@
       zclPackageId
     )
     expect(globalBitmap.id).not.toEqual(clusterBitmap.id)
+
+    // Testing chip_get_access_role for attributes
+    expect(ept).toContain(
+      'Name - Acl, Read Privilege - Administer, Write Privilege - Administer'
+    )
+
+    // Testing chip_get_access_role for commands
+    expect(ept).toContain('Name - KeySetWrite, Invoke Privilege - Administer')
   },
   testUtil.timeout.long()
 )
diff --git a/test/gen-template/matter3/miscellaneous_helper_tests.zapt b/test/gen-template/matter3/miscellaneous_helper_tests.zapt
index 4b854bd..3d9c13a 100644
--- a/test/gen-template/matter3/miscellaneous_helper_tests.zapt
+++ b/test/gen-template/matter3/miscellaneous_helper_tests.zapt
@@ -46,3 +46,15 @@
   {{#if struct_contains_array}} Struct with array: {{name}}
   {{/if}}
 {{/zcl_structs}}
+
+// Test chip_get_access_role for attributes
+{{#zcl_attributes_server}}
+{{#if clusterRef}}
+Name - {{asUpperCamelCase label}}, Read Privilege - {{asUpperCamelCase (chip_get_access_role entity="attribute" op="read" default="view")}}, {{#if isWritableAttribute}}Write Privilege - {{asUpperCamelCase (chip_get_access_role entity="attribute" op="write" default="operate")}}{{/if}}
+{{/if}}
+{{/zcl_attributes_server}}
+
+// Test chip_get_access_role for commands
+{{#zcl_commands_source_client}}
+Name - {{asUpperCamelCase name}}, Invoke Privilege - {{asUpperCamelCase (chip_get_access_role entity="command" op="invoke" default="operate")}}
+{{/zcl_commands_source_client}}
\ No newline at end of file
diff --git a/test/resource/multiple-device-types-per-endpoint.zap b/test/resource/multiple-device-types-per-endpoint.zap
index 4c8fd8c..2735d06 100644
--- a/test/resource/multiple-device-types-per-endpoint.zap
+++ b/test/resource/multiple-device-types-per-endpoint.zap
@@ -6971,7 +6971,7 @@
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "B2",
+              "defaultValue": "77",
               "reportable": 1,
               "minInterval": 0,
               "maxInterval": 65344,
diff --git a/test/resource/test-attribute-default-value-update.js b/test/resource/test-attribute-default-value-update.js
new file mode 100644
index 0000000..ecec89e
--- /dev/null
+++ b/test/resource/test-attribute-default-value-update.js
@@ -0,0 +1,54 @@
+/**
+ *
+ *    Copyright (c) 2025 Silicon Labs
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+// Example upgrade rule to update default vale of cluster attribute.
+
+async function postLoad(api, context) {
+  let resMsg = ''
+  let epts = await api.endpoints(context)
+  for (let i = 0; i < epts.length; i++) {
+    let clusters = await api.clusters(context, epts[i])
+    for (let j = 0; j < clusters.length; j++) {
+      let attributes = await api.attributes(context, epts[i], clusters[j])
+      for (let k = 0; k < attributes.length; k++) {
+        let attributeCode = parseInt(attributes[k].code)
+        let attributeValue = parseInt(attributes[k].defaultValue)
+        if (
+          attributeCode == 0xfffd &&
+          (attributeValue <= 1 || !attributeValue || attributeValue == 'null')
+        ) {
+          let params = [
+            {
+              key: context.updateKey.attributeDefault,
+              value: 2
+            }
+          ]
+          await api.updateAttribute(
+            context,
+            epts[i],
+            clusters[j],
+            attributes[k],
+            params
+          )
+          resMsg += `Cluster Revision attribute default value updated to 2 for ${clusters[j].name} cluster on endpoint ${epts[i].endpointIdentifier} ${epts[i].category} \n`
+        }
+      }
+    }
+  }
+  return { message: resMsg, status: 'automatic' } // Status can be 'nothing', 'automatic', 'user_verification', 'impossible'.
+}
+
+exports.postLoad = postLoad
diff --git a/test/resource/test-matter-attribute-default-value-update.js b/test/resource/test-matter-attribute-default-value-update.js
new file mode 100644
index 0000000..3cffee4
--- /dev/null
+++ b/test/resource/test-matter-attribute-default-value-update.js
@@ -0,0 +1,56 @@
+/**
+ *
+ *    Copyright (c) 2025 Silicon Labs
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+// Example upgrade rule to update default value of Level Control cluster attribute in Matter.
+async function postLoad(api, context) {
+  let resMsg = ''
+  let epts = await api.endpoints(context)
+  for (let i = 0; i < epts.length; i++) {
+    let clusters = await api.clusters(context, epts[i])
+    for (let j = 0; j < clusters.length; j++) {
+      if (clusters[j].code == '0x0008') {
+        let attributes = await api.attributes(context, epts[i], clusters[j])
+        for (let k = 0; k < attributes.length; k++) {
+          let attributeCode = parseInt(attributes[k].code)
+          let attributeValue = parseInt(attributes[k].defaultValue)
+          if (
+            attributeCode == 0 &&
+            (attributeValue == 0 || !attributeValue || attributeValue == 'null')
+          ) {
+            let params = [
+              {
+                key: context.updateKey.attributeDefault,
+                value: 10
+              }
+            ]
+            await api.updateAttribute(
+              context,
+              epts[i],
+              clusters[j],
+              attributes[k],
+              params
+            )
+            resMsg += `Current Value attribute's default value updated to 10 for Level Control cluster on endpoint ${epts[i].endpointIdentifier} ${epts[i].category}\n`
+          }
+        }
+      }
+    }
+  }
+  return { message: resMsg, status: 'automatic' } // Status can be 'nothing', 'automatic', 'user_verification', 'impossible'.
+}
+
+exports.postLoad = postLoad
diff --git a/test/resource/test-script-2.js b/test/resource/test-script-2.js
index a21095c..d2d6cc4 100644
--- a/test/resource/test-script-2.js
+++ b/test/resource/test-script-2.js
@@ -19,6 +19,7 @@
 async function postLoad(api, context) {
   let epts = await api.endpoints(context)
   await api.deleteEndpoint(context, epts[0])
+  return { message: 'Endpoint Deleted', status: 'automatic' } // Status can be 'nothing', 'automatic', 'user_verification', 'impossible'.
 }
 
 exports.postLoad = postLoad
diff --git a/test/resource/test-zigbee-attribute-default-value-update.js b/test/resource/test-zigbee-attribute-default-value-update.js
new file mode 100644
index 0000000..45f52df
--- /dev/null
+++ b/test/resource/test-zigbee-attribute-default-value-update.js
@@ -0,0 +1,56 @@
+/**
+ *
+ *    Copyright (c) 2025 Silicon Labs
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+// Example upgrade rule to update default value of On/Off cluster attribute in Zigbee.
+async function postLoad(api, context) {
+  let resMsg = ''
+  let epts = await api.endpoints(context)
+  for (let i = 0; i < epts.length; i++) {
+    let clusters = await api.clusters(context, epts[i])
+    for (let j = 0; j < clusters.length; j++) {
+      if (clusters[j].code == '0x0006') {
+        let attributes = await api.attributes(context, epts[i], clusters[j])
+        for (let k = 0; k < attributes.length; k++) {
+          let attributeCode = parseInt(attributes[k].code)
+          let attributeValue = parseInt(attributes[k].defaultValue)
+          if (
+            attributeCode == 0 &&
+            (attributeValue == 0 || !attributeValue || attributeValue == 'null')
+          ) {
+            let params = [
+              {
+                key: context.updateKey.attributeDefault,
+                value: 1
+              }
+            ]
+            await api.updateAttribute(
+              context,
+              epts[i],
+              clusters[j],
+              attributes[k],
+              params
+            )
+            resMsg += `On/Off attribute default value updated to 1 for On/Off cluster on endpoint ${epts[i].endpointIdentifier} ${epts[i].category} \n`
+          }
+        }
+      }
+    }
+  }
+  return { message: resMsg, status: 'automatic' } // Status can be 'nothing', 'automatic', 'user_verification', 'impossible'.
+}
+
+exports.postLoad = postLoad
diff --git a/test/resource/upgrade/lighting-matter.zap b/test/resource/upgrade/lighting-matter.zap
new file mode 100644
index 0000000..70a8ef1
--- /dev/null
+++ b/test/resource/upgrade/lighting-matter.zap
@@ -0,0 +1,3743 @@
+{
+  "fileFormat": 2,
+  "featureLevel": 106,
+  "creator": "zap",
+  "keyValuePairs": [
+    {
+      "key": "commandDiscovery",
+      "value": "1"
+    },
+    {
+      "key": "defaultResponsePolicy",
+      "value": "always"
+    },
+    {
+      "key": "manufacturerCodes",
+      "value": "0x1002"
+    }
+  ],
+  "package": [
+    {
+      "pathRelativity": "relativeToZap",
+      "path": "../../../zcl-builtin/matter/zcl.json",
+      "type": "zcl-properties",
+      "category": "matter",
+      "version": 1,
+      "description": "Matter SDK ZCL data"
+    },
+    {
+      "pathRelativity": "relativeToZap",
+      "path": "../../gen-template/matter/gen-test.json",
+      "type": "gen-templates-json",
+      "category": "matter",
+      "version": "test-matter"
+    }
+  ],
+  "endpointTypes": [
+    {
+      "id": 1,
+      "name": "MA-rootdevice",
+      "deviceTypeRef": {
+        "code": 22,
+        "profileId": 259,
+        "label": "MA-rootdevice",
+        "name": "MA-rootdevice",
+        "deviceTypeOrder": 0
+      },
+      "deviceTypes": [
+        {
+          "code": 22,
+          "profileId": 259,
+          "label": "MA-rootdevice",
+          "name": "MA-rootdevice",
+          "deviceTypeOrder": 0
+        }
+      ],
+      "deviceVersions": [
+        1
+      ],
+      "deviceIdentifiers": [
+        22
+      ],
+      "deviceTypeName": "MA-rootdevice",
+      "deviceTypeCode": 22,
+      "deviceTypeProfileId": 259,
+      "clusters": [
+        {
+          "name": "Descriptor",
+          "code": 29,
+          "mfgCode": null,
+          "define": "DESCRIPTOR_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "attributes": [
+            {
+              "name": "DeviceTypeList",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ServerList",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClientList",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "PartsList",
+              "code": 3,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Access Control",
+          "code": 31,
+          "mfgCode": null,
+          "define": "ACCESS_CONTROL_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "attributes": [
+            {
+              "name": "ACL",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "Extension",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "SubjectsPerAccessControlEntry",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "TargetsPerAccessControlEntry",
+              "code": 3,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AccessControlEntriesPerFabric",
+              "code": 4,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Basic Information",
+          "code": 40,
+          "mfgCode": null,
+          "define": "BASIC_INFORMATION_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "attributes": [
+            {
+              "name": "DataModelRevision",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "VendorName",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "char_string",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "VendorID",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "type": "vendor_id",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ProductName",
+              "code": 3,
+              "mfgCode": null,
+              "side": "server",
+              "type": "char_string",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ProductID",
+              "code": 4,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "NodeLabel",
+              "code": 5,
+              "mfgCode": null,
+              "side": "server",
+              "type": "char_string",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "Location",
+              "code": 6,
+              "mfgCode": null,
+              "side": "server",
+              "type": "char_string",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "HardwareVersion",
+              "code": 7,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "HardwareVersionString",
+              "code": 8,
+              "mfgCode": null,
+              "side": "server",
+              "type": "char_string",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "SoftwareVersion",
+              "code": 9,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int32u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "SoftwareVersionString",
+              "code": 10,
+              "mfgCode": null,
+              "side": "server",
+              "type": "char_string",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "CapabilityMinima",
+              "code": 19,
+              "mfgCode": null,
+              "side": "server",
+              "type": "CapabilityMinimaStruct",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Localization Configuration",
+          "code": 43,
+          "mfgCode": null,
+          "define": "LOCALIZATION_CONFIGURATION_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "attributes": [
+            {
+              "name": "ActiveLocale",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "char_string",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "SupportedLocales",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Time Format Localization",
+          "code": 44,
+          "mfgCode": null,
+          "define": "TIME_FORMAT_LOCALIZATION_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "attributes": [
+            {
+              "name": "HourFormat",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "HourFormat",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Unit Localization",
+          "code": 45,
+          "mfgCode": null,
+          "define": "UNIT_LOCALIZATION_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "attributes": [
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "General Commissioning",
+          "code": 48,
+          "mfgCode": null,
+          "define": "GENERAL_COMMISSIONING_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "ArmFailSafe",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "ArmFailSafeResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "SetRegulatoryConfig",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "SetRegulatoryConfigResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "CommissioningComplete",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "CommissioningCompleteResponse",
+              "code": 5,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "Breadcrumb",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int64u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0000000000000000",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "BasicCommissioningInfo",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "BasicCommissioningInfo",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "RegulatoryConfig",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "type": "RegulatoryLocationType",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "LocationCapability",
+              "code": 3,
+              "mfgCode": null,
+              "side": "server",
+              "type": "RegulatoryLocationType",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "SupportsConcurrentConnection",
+              "code": 4,
+              "mfgCode": null,
+              "side": "server",
+              "type": "boolean",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Network Commissioning",
+          "code": 49,
+          "mfgCode": null,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "attributes": [
+            {
+              "name": "MaxNetworks",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "Networks",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "InterfaceEnabled",
+              "code": 4,
+              "mfgCode": null,
+              "side": "server",
+              "type": "boolean",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "LastNetworkingStatus",
+              "code": 5,
+              "mfgCode": null,
+              "side": "server",
+              "type": "NetworkCommissioningStatus",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "LastNetworkID",
+              "code": 6,
+              "mfgCode": null,
+              "side": "server",
+              "type": "octet_string",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "LastConnectErrorValue",
+              "code": 7,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int32s",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "General Diagnostics",
+          "code": 51,
+          "mfgCode": null,
+          "define": "GENERAL_DIAGNOSTICS_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "TestEventTrigger",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "NetworkInterfaces",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "RebootCount",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "TestEventTriggersEnabled",
+              "code": 8,
+              "mfgCode": null,
+              "side": "server",
+              "type": "boolean",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Administrator Commissioning",
+          "code": 60,
+          "mfgCode": null,
+          "define": "ADMINISTRATOR_COMMISSIONING_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "OpenCommissioningWindow",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "RevokeCommissioning",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "WindowStatus",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "CommissioningWindowStatusEnum",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AdminFabricIndex",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "fabric_idx",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AdminVendorId",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Operational Credentials",
+          "code": 62,
+          "mfgCode": null,
+          "define": "OPERATIONAL_CREDENTIALS_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "AttestationRequest",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "AttestationResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "CertificateChainRequest",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "CertificateChainResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "CSRRequest",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "CSRResponse",
+              "code": 5,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "AddNOC",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "UpdateNOC",
+              "code": 7,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "NOCResponse",
+              "code": 8,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "UpdateFabricLabel",
+              "code": 9,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "RemoveFabric",
+              "code": 10,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "AddTrustedRootCertificate",
+              "code": 11,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "NOCs",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "Fabrics",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "SupportedFabrics",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "CommissionedFabrics",
+              "code": 3,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "TrustedRootCertificates",
+              "code": 4,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "CurrentFabricIndex",
+              "code": 5,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Group Key Management",
+          "code": 63,
+          "mfgCode": null,
+          "define": "GROUP_KEY_MANAGEMENT_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "KeySetWrite",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "KeySetRead",
+              "code": 1,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "KeySetReadResponse",
+              "code": 2,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "KeySetRemove",
+              "code": 3,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "KeySetReadAllIndices",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "KeySetReadAllIndicesResponse",
+              "code": 5,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "GroupKeyMap",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GroupTable",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "MaxGroupsPerFabric",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "MaxGroupKeysPerFabric",
+              "code": 3,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "id": 2,
+      "name": "Anonymous Endpoint Type",
+      "deviceTypeRef": {
+        "code": 257,
+        "profileId": 259,
+        "label": "MA-dimmablelight",
+        "name": "MA-dimmablelight",
+        "deviceTypeOrder": 0
+      },
+      "deviceTypes": [
+        {
+          "code": 257,
+          "profileId": 259,
+          "label": "MA-dimmablelight",
+          "name": "MA-dimmablelight",
+          "deviceTypeOrder": 0
+        }
+      ],
+      "deviceVersions": [
+        1
+      ],
+      "deviceIdentifiers": [
+        257
+      ],
+      "deviceTypeName": "MA-dimmablelight",
+      "deviceTypeCode": 257,
+      "deviceTypeProfileId": 259,
+      "clusters": [
+        {
+          "name": "Identify",
+          "code": 3,
+          "mfgCode": null,
+          "define": "IDENTIFY_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "Identify",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "TriggerEffect",
+              "code": 64,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "IdentifyTime",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "IdentifyType",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "enum8",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "4",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Groups",
+          "code": 4,
+          "mfgCode": null,
+          "define": "GROUPS_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "AddGroup",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "AddGroupResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "ViewGroupResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "ViewGroup",
+              "code": 1,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "GetGroupMembershipResponse",
+              "code": 2,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "GetGroupMembership",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "RemoveGroupResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "RemoveGroup",
+              "code": 3,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "RemoveAllGroups",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "AddGroupIfIdentifying",
+              "code": 5,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "NameSupport",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap8",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "4",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Scenes",
+          "code": 5,
+          "mfgCode": null,
+          "define": "SCENES_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "apiMaturity": "provisional",
+          "commands": [
+            {
+              "name": "AddScene",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "AddSceneResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "ViewScene",
+              "code": 1,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "ViewSceneResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "RemoveScene",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "RemoveSceneResponse",
+              "code": 2,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "RemoveAllScenesResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "RemoveAllScenes",
+              "code": 3,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "StoreScene",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "StoreSceneResponse",
+              "code": 4,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            },
+            {
+              "name": "RecallScene",
+              "code": 5,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "GetSceneMembership",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "GetSceneMembershipResponse",
+              "code": 6,
+              "mfgCode": null,
+              "source": "server",
+              "isIncoming": 0,
+              "isEnabled": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "SceneCount",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x00",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "CurrentScene",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x00",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "CurrentGroup",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "type": "group_id",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0000",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "SceneValid",
+              "code": 3,
+              "mfgCode": null,
+              "side": "server",
+              "type": "boolean",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x00",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "NameSupport",
+              "code": 4,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap8",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x00",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "4",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "On/Off",
+          "code": 6,
+          "mfgCode": null,
+          "define": "ON_OFF_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "Off",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "On",
+              "code": 1,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "Toggle",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "OffWithEffect",
+              "code": 64,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "OnWithRecallGlobalScene",
+              "code": 65,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "OnWithTimedOff",
+              "code": 66,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "OnOff",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "boolean",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GlobalSceneControl",
+              "code": 16384,
+              "mfgCode": null,
+              "side": "server",
+              "type": "boolean",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "OnTime",
+              "code": 16385,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "OffWaitTime",
+              "code": 16386,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "StartUpOnOff",
+              "code": 16387,
+              "mfgCode": null,
+              "side": "server",
+              "type": "OnOffStartUpOnOff",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "4",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Level Control",
+          "code": 8,
+          "mfgCode": null,
+          "define": "LEVEL_CONTROL_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "MoveToLevel",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "Move",
+              "code": 1,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "Step",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "Stop",
+              "code": 3,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "MoveToLevelWithOnOff",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "MoveWithOnOff",
+              "code": 5,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "StepWithOnOff",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            },
+            {
+              "name": "StopWithOnOff",
+              "code": 7,
+              "mfgCode": null,
+              "source": "client",
+              "isIncoming": 1,
+              "isEnabled": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "CurrentLevel",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x00",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "RemainingTime",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0000",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "Options",
+              "code": 15,
+              "mfgCode": null,
+              "side": "server",
+              "type": "LevelControlOptions",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x00",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "OnLevel",
+              "code": 17,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "StartUpCurrentLevel",
+              "code": 16384,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "5",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Descriptor",
+          "code": 29,
+          "mfgCode": null,
+          "define": "DESCRIPTOR_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "attributes": [
+            {
+              "name": "DeviceTypeList",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ServerList",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClientList",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "PartsList",
+              "code": 3,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        }
+      ]
+    }
+  ],
+  "endpoints": [
+    {
+      "endpointTypeName": "MA-rootdevice",
+      "endpointTypeIndex": 0,
+      "profileId": 259,
+      "endpointId": 0,
+      "networkId": null,
+      "parentEndpointIdentifier": null
+    },
+    {
+      "endpointTypeName": "Anonymous Endpoint Type",
+      "endpointTypeIndex": 1,
+      "profileId": 259,
+      "endpointId": 1,
+      "networkId": 0,
+      "parentEndpointIdentifier": null
+    }
+  ]
+}
\ No newline at end of file
diff --git a/test/startup.test.js b/test/startup.test.js
index 7b4bcd8..1d2aca1 100644
--- a/test/startup.test.js
+++ b/test/startup.test.js
@@ -26,11 +26,22 @@
 const dbApi = require('../src-electron/db/db-api')
 const querySession = require('../src-electron/db/query-session')
 const util = require('../src-electron/util/util')
+const importJs = require('../src-electron/importexport/import')
+const genEngine = require('../src-electron/generator/generation-engine')
 let originalContent
+let originalContentLightMatter
+let db
 
 beforeAll(async () => {
   env.setDevelopmentEnv()
-  // Save the original file content before tests. Used for uc upgrade testiing
+  let file = env.sqliteTestFile('startup')
+  db = await dbApi.initDatabaseAndLoadSchema(
+    file,
+    env.schemaFile(),
+    env.zapVersion()
+  )
+  env.setDevelopmentEnv()
+  // Save the original file content before tests. Used for uc upgrade testing
   originalContent = await fsPromise.readFile(
     path.join(__dirname, './resource/upgrade/multi-protocol.zap'),
     'utf-8'
@@ -39,6 +50,10 @@
     path.join(__dirname, './resource/upgrade/light.zap'),
     'utf-8'
   )
+  originalContentLightMatter = await fsPromise.readFile(
+    path.join(__dirname, './resource/upgrade/lighting-matter.zap'),
+    'utf-8'
+  )
 })
 
 afterAll(async () => {
@@ -53,6 +68,11 @@
     originalContentLight,
     'utf-8'
   )
+  await fsPromise.writeFile(
+    path.join(__dirname, './resource/upgrade/lighting-matter.zap'),
+    originalContentLightMatter,
+    'utf-8'
+  )
 })
 
 test(
@@ -203,6 +223,12 @@
       .catch(() => false)
     expect(fileExists).toBe(true)
 
+    const matterFileExists = await fsPromise
+      .stat(path.join(__dirname, './resource/upgrade/lighting-matter.zap'))
+      .then(() => true)
+      .catch(() => false)
+    expect(matterFileExists).toBe(true)
+
     let upgradeDirectory = path.join(__dirname, 'resource/upgrade')
     let testUpgradeResults = path.join(
       __dirname,
@@ -236,6 +262,47 @@
       )
       .then(() => {
         expect(fs.existsSync(testUpgradeResults)).toBeTruthy()
+        const upgradeResultsContent = fs.readFileSync(
+          testUpgradeResults,
+          'utf-8'
+        )
+
+        // Matter and Zigbee specific multi-protocol app tests
+        expect(upgradeResultsContent).toMatch(
+          /Cluster Revision attribute default value updated to 2 for Localization\n.*Configuration cluster on endpoint 0 matter/
+        )
+        expect(upgradeResultsContent).toMatch(
+          /Cluster Revision attribute default value updated to 2 for ZLL\n.*Commissioning cluster on endpoint 1 zigbee/
+        )
+        expect(upgradeResultsContent).toMatch(
+          /Cluster Revision attribute default value updated to 2 for Descriptor\n.*cluster on endpoint 1 matter/
+        )
+
+        // Only the level control of matter should be updated and not zigbee because matter applied that upgrade rule
+        expect(upgradeResultsContent).toMatch(
+          /Current Value attribute's default value updated to 10 for Level Control\n.*cluster on endpoint 1 matter/
+        )
+        expect(upgradeResultsContent).not.toMatch(
+          /Current Value attribute's default value updated to 10 for Level Control\n.*cluster on endpoint 1 zigbee/
+        )
+
+        // Only the on/off of zigbee should be updated and not matter because zigbee applied that upgrade rule
+        expect(upgradeResultsContent).toMatch(
+          /On\/Off attribute default value updated to 1 for On\/Off cluster on endpoint\n.*1 zigbee/
+        )
+        expect(upgradeResultsContent).not.toMatch(
+          /On\/Off attribute default value updated to 1 for On\/Off cluster on endpoint\n.*1 matter/
+        )
+
+        // Testing the order(priority) in which upgrade rules were run
+        // Making sure lower priority tests are run first
+        expect(upgradeResultsContent).toMatch(
+          /Cluster Revision attribute default value updated to 2 for ZLL\n.*Commissioning cluster on endpoint 1 zigbee.*\n.*\n.*\n.*On\/Off attribute default value updated to 1 for On\/Off cluster on endpoint\n.*1 zigbee/
+        )
+        expect(upgradeResultsContent).toMatch(
+          /Cluster Revision attribute default value updated to 2 for Descriptor\n.*cluster on endpoint 1 matter.*\n.*\n.*\n.*Current Value attribute's default value updated to 10 for Level Control\n.*cluster on endpoint 1 matter/
+        )
+
         fs.unlinkSync(testUpgradeResults)
       })
 
@@ -256,6 +323,62 @@
       '../../../zcl-builtin/silabs/zcl-zigbee.json"'
     )
     expect(fileContent).toContain('../../../zcl-builtin/matter/zcl-matter.json')
+
+    // Import the upgraded file for multiprotocol
+    let importRes = await importJs.importDataFromFile(
+      db,
+      path.join(__dirname, './resource/upgrade/multi-protocol.zap'),
+      { sessionId: null }
+    )
+    expect(importRes.errors.length).toBe(0)
+    expect(importRes.warnings.length).toBe(0)
+
+    // Check that generation happens successfully with the upgraded file
+    let genResultMatter = await genEngine.generate(
+      db,
+      importRes.sessionId,
+      importRes.templateIds[0],
+      {},
+      {
+        generateOnly: 'endpoint-config.c',
+        disableDeprecationWarnings: true
+      }
+    )
+    // Check for the specific string in the generated content
+    expect(genResultMatter.content['endpoint-config.c']).not.toContain(
+      `{ 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(1) }`
+    )
+    expect(genResultMatter.content['endpoint-config.c']).toContain(
+      `{ 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(2) }`
+    )
+
+    // Import the upgraded file for matter
+    let importResMatter = await importJs.importDataFromFile(
+      db,
+      path.join(__dirname, './resource/upgrade/lighting-matter.zap'),
+      { sessionId: null }
+    )
+    expect(importResMatter.errors.length).toBe(0)
+    expect(importResMatter.warnings.length).toBe(0)
+
+    // Check that generation happens successfully with the upgraded file
+    let genResultMatterLight = await genEngine.generate(
+      db,
+      importResMatter.sessionId,
+      importResMatter.templateIds[0],
+      {},
+      {
+        generateOnly: 'endpoint-config.c',
+        disableDeprecationWarnings: true
+      }
+    )
+    // Check for the specific string in the generated content
+    expect(genResultMatterLight.content['endpoint-config.c']).not.toContain(
+      `{ 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(1) }`
+    )
+    expect(genResultMatterLight.content['endpoint-config.c']).toContain(
+      `{ 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(2) }`
+    )
   },
   testUtil.timeout.long()
 )
diff --git a/test/test-query.js b/test/test-query.js
index 5317aba..15c390b 100644
--- a/test/test-query.js
+++ b/test/test-query.js
@@ -255,6 +255,17 @@
     .then((rows) => rows.map(dbMapping.map.cluster))
 }
 
+/**
+ *
+ * @param {*} elements
+ * @param {*} name
+ * @returns true if the element is optional, false if the element is mandatory
+ */
+function checkIfElementIsOptional(elements, name) {
+  let element = elements.find((element) => element.name == name)
+  return element ? element.isOptional : false
+}
+
 exports.getAllEndpointTypeClusterState = getAllEndpointTypeClusterState
 exports.selectCountFrom = selectCountFrom
 exports.getEndpointTypeAttributes = getEndpointTypeAttributes
@@ -263,3 +274,4 @@
 exports.getAllSessionNotifications = getAllSessionNotifications
 exports.getAllNotificationMessages = getAllNotificationMessages
 exports.getAllSessionClusters = getAllSessionClusters
+exports.checkIfElementIsOptional = checkIfElementIsOptional
diff --git a/test/zcl-loader.test.js b/test/zcl-loader.test.js
index beefa59..4f1a114 100644
--- a/test/zcl-loader.test.js
+++ b/test/zcl-loader.test.js
@@ -23,6 +23,7 @@
 const queryZcl = require('../src-electron/db/query-zcl')
 const queryDeviceType = require('../src-electron/db/query-device-type')
 const queryCommand = require('../src-electron/db/query-command')
+const queryEvent = require('../src-electron/db/query-event')
 const queryPackage = require('../src-electron/db/query-package')
 const queryPackageNotification = require('../src-electron/db/query-package-notification')
 const zclLoader = require('../src-electron/zcl/zcl-loader')
@@ -594,14 +595,14 @@
       let ctx = await zclLoader.loadZcl(db, env.builtinMatterZclMetafile())
       let packageId = ctx.packageId
 
-      let zclCluster = await queryZcl.selectClusterByCode(db, packageId, 0x001f)
+      let aclCluster = await queryZcl.selectClusterByCode(db, packageId, 0x001f)
 
       /* Verify that the ACL attribute, defined using the list type format `array="true" type="X"` in XML,
         is correctly parsed and stored in the database as an array of AccessControlEntryStruct. */
       let attributes = await dbApi.dbAll(
         db,
         "SELECT * FROM ATTRIBUTE WHERE CLUSTER_REF = ? AND CODE = 0x0000 AND NAME = 'ACL'",
-        [zclCluster.id]
+        [aclCluster.id]
       )
       expect(attributes.length).toBe(1)
       let aclAttribute = attributes[0]
@@ -623,3 +624,111 @@
   },
   testUtil.timeout.long()
 )
+
+test(
+  'test loading IS_OPTIONAL column for Matter attributes, commands, and events',
+  async () => {
+    let db = await dbApi.initRamDatabase()
+    try {
+      await dbApi.loadSchema(db, env.schemaFile(), env.zapVersion())
+      let ctx = await zclLoader.loadZcl(db, env.builtinMatterZclMetafile())
+      let packageId = ctx.packageId
+
+      let doorLockCluster = await queryZcl.selectClusterByCode(
+        db,
+        packageId,
+        0x0101
+      )
+      let doorLockClusterId = doorLockCluster.id
+
+      let attributes =
+        await queryZcl.selectAttributesByClusterIdIncludingGlobal(
+          db,
+          doorLockClusterId,
+          [packageId]
+        )
+      // optional attribute undefined, conformance undefined -> mandatory
+      expect(
+        testQuery.checkIfElementIsOptional(attributes, 'ActuatorEnabled')
+      ).toBeFalsy()
+      // optional="true", conformance undefined -> optional
+      expect(
+        testQuery.checkIfElementIsOptional(attributes, 'DoorClosedEvents')
+      ).toBeTruthy()
+      // optional="false", conformance undefined -> mandatory
+      expect(
+        testQuery.checkIfElementIsOptional(attributes, 'LockType')
+      ).toBeFalsy()
+      // mandatory conformance, optional attribute undefined -> mandatory
+      expect(
+        testQuery.checkIfElementIsOptional(attributes, 'OperatingMode')
+      ).toBeFalsy()
+      // optionalConform to feature DPS, optional="true" -> optional
+      expect(
+        testQuery.checkIfElementIsOptional(attributes, 'DoorOpenEvents')
+      ).toBeTruthy()
+      // mandatory conformance, optional="true" -> optional as optional="true" takes precedence
+      expect(
+        testQuery.checkIfElementIsOptional(attributes, 'LockState')
+      ).toBeTruthy()
+      // mandatoryConform to feature DPS, optional="false" -> mandatory as optional="false" takes precedence
+      expect(
+        testQuery.checkIfElementIsOptional(attributes, 'DoorState')
+      ).toBeFalsy()
+
+      let commands = await queryCommand.selectCommandsByClusterId(
+        db,
+        doorLockClusterId,
+        [packageId]
+      )
+      // optional attribute undefined, conformance undefined -> mandatory
+      expect(
+        testQuery.checkIfElementIsOptional(commands, 'LockDoor')
+      ).toBeFalsy()
+      // optional="true", conformance undefined -> optional
+      expect(
+        testQuery.checkIfElementIsOptional(commands, 'GetWeekDaySchedule')
+      ).toBeTruthy()
+      // mandatory conformance, optional attribute undefined -> mandatory
+      expect(
+        testQuery.checkIfElementIsOptional(commands, 'UnlockDoor')
+      ).toBeFalsy()
+      // mandatoryConform to feature WDSCH, optional="true" -> optional
+      expect(
+        testQuery.checkIfElementIsOptional(commands, 'SetWeekDaySchedule')
+      ).toBeTruthy()
+      // optional conformance, optional="false" -> mandatory as optional="false" takes precedence
+      expect(
+        testQuery.checkIfElementIsOptional(commands, 'UnlockWithTimeout')
+      ).toBeFalsy()
+
+      let events = await queryEvent.selectEventsByClusterId(
+        db,
+        doorLockClusterId
+      )
+      // optional attribute undefined, conformance undefined -> mandatory
+      expect(
+        testQuery.checkIfElementIsOptional(events, 'LockUserChange')
+      ).toBeFalsy()
+      // optional="true", conformance undefined -> optional
+      expect(
+        testQuery.checkIfElementIsOptional(events, 'LockOperation')
+      ).toBeTruthy()
+      // mandatory conformance, optional attribute undefined -> mandatory
+      expect(
+        testQuery.checkIfElementIsOptional(events, 'LockOperationError')
+      ).toBeFalsy()
+      // mandatoryConform to feature DPS, optional="true" -> optional
+      expect(
+        testQuery.checkIfElementIsOptional(events, 'DoorStateChange')
+      ).toBeTruthy()
+      // mandatory conformance, optional="true" -> optional as optional="true" takes precedence
+      expect(
+        testQuery.checkIfElementIsOptional(events, 'DoorLockAlarm')
+      ).toBeTruthy()
+    } finally {
+      await dbApi.closeDatabase(db)
+    }
+  },
+  testUtil.timeout.long()
+)
diff --git a/zcl-builtin/matter/data-model/chip/door-lock-cluster.xml b/zcl-builtin/matter/data-model/chip/door-lock-cluster.xml
index 9902fe7..305b20e 100644
--- a/zcl-builtin/matter/data-model/chip/door-lock-cluster.xml
+++ b/zcl-builtin/matter/data-model/chip/door-lock-cluster.xml
@@ -67,16 +67,27 @@
             cluster itself. Those attributes/commands are marked with a special comment. -->
 
         <!-- Attributes -->
-        <attribute side="server" code="0" define="LOCK_STATE" type="DlLockState" min="0" max="2" isNullable="true" reportable="true" writable="false">LockState</attribute>
-        <attribute side="server" code="1" define="LOCK_TYPE" type="DlLockType" min="0" max="10" writable="false">LockType</attribute>
+        <attribute side="server" code="0" define="LOCK_STATE" type="DlLockState" min="0" max="2" isNullable="true" reportable="true" writable="false" optional="true">
+            <description>LockState</description>
+            <mandatoryConform/>
+        </attribute>
+        <attribute side="server" code="1" define="LOCK_TYPE" type="DlLockType" min="0" max="10" writable="false" optional="false">LockType</attribute>
         <attribute side="server" code="2" define="ACTUATOR_ENABLED" type="boolean" writable="false">ActuatorEnabled</attribute>
         <!-- Conformance feature DPS - for now optional -->
-        <attribute side="server" code="3" define="DOOR_STATE" type="DoorStateEnum" min="0" max="5" isNullable="true" reportable="true" optional="true">DoorState</attribute>
+        <attribute side="server" code="3" define="DOOR_STATE" type="DoorStateEnum" min="0" max="5" isNullable="true" reportable="true" optional="false">
+            <description>DoorState</description>
+            <mandatoryConform>
+                <feature name="DPS"/>
+            </mandatoryConform>
+        </attribute>
         <!-- Conformance feature [DPS] - for now optional -->
         <attribute side="server" code="4" define="DOOR_OPEN_EVENTS" type="INT32U" writable="true" optional="true">
             <description>DoorOpenEvents</description>
             <access op="read" role="view" />
             <access op="write" role="manage" />
+            <optionalConform>
+                <feature name="DPS"/>
+            </optionalConform>
         </attribute>
         <!-- Conformance feature [DPS] - for now optional -->
         <attribute side="server" code="5" define="DOOR_CLOSED_EVENTS" type="INT32U" writable="true" optional="true">
@@ -138,6 +149,7 @@
             <description>OperatingMode</description>
             <access op="read" role="view" />
             <access op="write" role="manage" />
+            <mandatoryConform/>
         </attribute>
         <attribute side="server" code="38" define="SUPPORTED_OPERATING_MODES" type="DlSupportedOperatingModes" min="0x0000" max="0xFFFF" default="0xFFF6" writable="false">SupportedOperatingModes</attribute>
         <attribute side="server" code="39" define="DEFAULT_CONFIGURATION_REGISTER" type="DlDefaultConfigurationRegister" min="0x0000" max="0xFFFF" reportable="true" default="0" writable="false" optional="true">DefaultConfigurationRegister</attribute>
@@ -208,13 +220,15 @@
             <description>This command causes the lock device to unlock the door.</description>
             <!-- Conformance feature [COTA & PIN] - for now optional -->
             <arg name="PINCode" type="OCTET_STRING" optional="true" />
+            <mandatoryConform/>
         </command>
         <!-- Command Toggle with ID 2 is deprecated/disallowed -->
-        <command source="client" code="3" name="UnlockWithTimeout" mustUseTimedInvoke="true" optional="true">
+        <command source="client" code="3" name="UnlockWithTimeout" mustUseTimedInvoke="true" optional="false">
             <description>This command causes the lock device to unlock the door with a timeout parameter.</description>
             <arg name="Timeout" type="INT16U" />
             <!-- Conformance feature [COTA & PIN] - for now optional -->
             <arg name="PINCode" type="OCTET_STRING" optional="true" />
+            <optionalConform/>
         </command>
         <!-- Conformance feature WDSCH - for now optional -->
         <command source="client" code="11" name="SetWeekDaySchedule" optional="true">
@@ -227,6 +241,9 @@
             <arg name="StartMinute" type="INT8U" />
             <arg name="EndHour" type="INT8U" />
             <arg name="EndMinute" type="INT8U" />
+            <mandatoryConform>
+                <feature name="WDSCH"/>
+            </mandatoryConform>
         </command>
         <!-- Conformance feature WDSCH - for now optional -->
         <command source="client" code="12" name="GetWeekDaySchedule" response="GetWeekDayScheduleResponse" optional="true">
@@ -396,16 +413,20 @@
 
 
         <!-- Events -->
-        <event side="server" code="0" name="DoorLockAlarm" priority="critical">
+        <event side="server" code="0" name="DoorLockAlarm" priority="critical" optional="true">
             <description>The door lock cluster provides several alarms which can be sent when there is a critical state on the door lock.</description>
             <field id="0" name="AlarmCode" type="AlarmCodeEnum" />
+            <mandatoryConform/>
         </event>
         <!-- Conformance feature DPS - for now optional -->
         <event side="server" code="1" name="DoorStateChange" priority="critical" optional="true">
             <description>The door lock server sends out a DoorStateChange event when the door lock door state changes.</description>
             <field id="0" name="DoorState" type="DoorStateEnum" />
+            <mandatoryConform>
+                <feature name="DPS"/>
+            </mandatoryConform>
         </event>
-        <event side="server" code="2" name="LockOperation" priority="critical">
+        <event side="server" code="2" name="LockOperation" priority="critical" optional="true">
             <description>The door lock server sends out a LockOperation event when the event is triggered by the various lock operation sources.</description>
             <field id="0" name="LockOperationType" type="LockOperationTypeEnum" />
             <field id="1" name="OperationSource" type="OperationSourceEnum" />
@@ -425,6 +446,7 @@
             <field id="5" name="SourceNode" type="NODE_ID" isNullable="true" />
             <!-- Conformance feature [USR] - for now optional -->
             <field id="6" name="Credentials" type="CredentialStruct" array="true" isNullable="true" optional="true" />
+            <mandatoryConform/>
         </event>
         <event side="server" code="4" name="LockUserChange" priority="info">
             <description>The door lock server sends out a LockUserChange event when a lock user, schedule, or credential change has occurred.</description>
diff --git a/zcl-builtin/matter/upgrade-rules-matter.json b/zcl-builtin/matter/upgrade-rules-matter.json
new file mode 100644
index 0000000..92757bc
--- /dev/null
+++ b/zcl-builtin/matter/upgrade-rules-matter.json
@@ -0,0 +1,15 @@
+{
+  "version": 1,
+  "description": "Upgrade Rules for Zigbee .zap files",
+  "category": "matter",
+  "upgradeRuleScripts": [
+    {
+      "path": "../../test/resource/test-matter-attribute-default-value-update.js",
+      "priority": 101
+    },
+    {
+      "path": "../../test/resource/test-attribute-default-value-update.js",
+      "priority": 100
+    }
+  ]
+}
diff --git a/zcl-builtin/matter/zcl-matter.json b/zcl-builtin/matter/zcl-matter.json
index e3c7562..47fc644 100644
--- a/zcl-builtin/matter/zcl-matter.json
+++ b/zcl-builtin/matter/zcl-matter.json
@@ -280,5 +280,6 @@
     "indexFieldId": 254,
     "indexFieldName": "FabricIndex",
     "indexType": "fabric_idx"
-  }
+  },
+  "upgradeRules": "./upgrade-rules-matter.json"
 }
diff --git a/zcl-builtin/silabs/upgrade-rules-zigbee.json b/zcl-builtin/silabs/upgrade-rules-zigbee.json
new file mode 100644
index 0000000..2c160be
--- /dev/null
+++ b/zcl-builtin/silabs/upgrade-rules-zigbee.json
@@ -0,0 +1,15 @@
+{
+  "version": 1,
+  "description": "Upgrade Rules for Zigbee .zap files",
+  "category": "zigbee",
+  "upgradeRuleScripts": [
+    {
+      "path": "../../test/resource/test-zigbee-attribute-default-value-update.js",
+      "priority": 101
+    },
+    {
+      "path": "../../test/resource/test-attribute-default-value-update.js",
+      "priority": 100
+    }
+  ]
+}
diff --git a/zcl-builtin/silabs/zcl-zigbee.json b/zcl-builtin/silabs/zcl-zigbee.json
index b5130f0..9b4fc1f 100644
--- a/zcl-builtin/silabs/zcl-zigbee.json
+++ b/zcl-builtin/silabs/zcl-zigbee.json
@@ -67,5 +67,6 @@
       "label": "List of clusters and attributes associated across protocols",
       "defaults": "multi-protocol.json"
     }
-  }
+  },
+  "upgradeRules": "./upgrade-rules-zigbee.json"
 }