Update Level Control XML to match spec definition  (#21361)

* Update Level Control XML

* Fix frequency conformance

* Add missing conformance

* Fix LVL and CC to be spec compliant

* fix PR review comments

* ZAP generated files

* Fix Tv Level Control calls

* regen MTR base clusters files

* Update tv casting code

* fix typo

* regen

* fix test case

* regen

* fix lvl 4.1 test

* generated files

* Apply suggestions from code review

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

* fix comment for LVL

* regen

* regen

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
index 44af943..38970b0 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
@@ -300,7 +300,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -319,14 +319,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -334,7 +334,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -346,14 +346,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -361,7 +361,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
index 289a90a..08da101 100644
--- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
+++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
@@ -269,7 +269,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   attribute bitmap8 options = 15;
   attribute nullable int8u onLevel = 17;
   readonly attribute bitmap32 featureMap = 65532;
@@ -277,14 +277,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -292,7 +292,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -304,14 +304,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -319,7 +319,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/bridge-app/bridge-common/bridge-app.matter b/examples/bridge-app/bridge-common/bridge-app.matter
index b97f8df..c09e67b 100644
--- a/examples/bridge-app/bridge-common/bridge-app.matter
+++ b/examples/bridge-app/bridge-common/bridge-app.matter
@@ -105,7 +105,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -124,14 +124,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -139,7 +139,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -151,14 +151,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -166,7 +166,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter
index 930a4fc..6536ff2 100644
--- a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter
+++ b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter
@@ -285,7 +285,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -300,14 +300,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -315,7 +315,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -327,14 +327,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -342,7 +342,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter
index 197b64a..3d026fe 100644
--- a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter
+++ b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter
@@ -285,7 +285,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -300,14 +300,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -315,7 +315,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -327,14 +327,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -342,7 +342,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter
index f57ba3e..4c852fb 100644
--- a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter
+++ b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter
@@ -285,7 +285,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -300,14 +300,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -315,7 +315,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -327,14 +327,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -342,7 +342,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
index 5539552..e6acbb0 100644
--- a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
+++ b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
@@ -281,7 +281,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
   attribute nullable int8u onLevel = 17;
@@ -293,14 +293,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -308,7 +308,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -320,14 +320,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -335,7 +335,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter
index 148a9e6..1b93cf2 100644
--- a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter
+++ b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter
@@ -285,7 +285,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -300,14 +300,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -315,7 +315,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -327,14 +327,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -342,7 +342,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter
index 44ac62d..31f5199 100644
--- a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter
+++ b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter
@@ -167,7 +167,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
   attribute bitmap8 options = 15;
@@ -180,14 +180,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -195,7 +195,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -207,14 +207,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -222,7 +222,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/lighting-app/lighting-common/lighting-app.matter b/examples/lighting-app/lighting-common/lighting-app.matter
index 2529e41..e29e9a6 100644
--- a/examples/lighting-app/lighting-common/lighting-app.matter
+++ b/examples/lighting-app/lighting-common/lighting-app.matter
@@ -185,7 +185,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -204,14 +204,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -219,7 +219,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -231,14 +231,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -246,7 +246,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/placeholder/linux/apps/app1/config.matter b/examples/placeholder/linux/apps/app1/config.matter
index d0c5617..98fc49f 100644
--- a/examples/placeholder/linux/apps/app1/config.matter
+++ b/examples/placeholder/linux/apps/app1/config.matter
@@ -343,20 +343,20 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute bitmap32 featureMap = 65532;
   readonly attribute int16u clusterRevision = 65533;
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -364,7 +364,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -376,14 +376,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -391,7 +391,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/placeholder/linux/apps/app2/config.matter b/examples/placeholder/linux/apps/app2/config.matter
index d0c5617..98fc49f 100644
--- a/examples/placeholder/linux/apps/app2/config.matter
+++ b/examples/placeholder/linux/apps/app2/config.matter
@@ -343,20 +343,20 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute bitmap32 featureMap = 65532;
   readonly attribute int16u clusterRevision = 65533;
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -364,7 +364,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -376,14 +376,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -391,7 +391,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/pump-app/pump-common/pump-app.matter b/examples/pump-app/pump-common/pump-app.matter
index 39ceb10..16a476f 100644
--- a/examples/pump-app/pump-common/pump-app.matter
+++ b/examples/pump-app/pump-common/pump-app.matter
@@ -102,7 +102,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
   attribute bitmap8 options = 15;
@@ -115,14 +115,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -130,7 +130,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -142,14 +142,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -157,7 +157,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/tv-app/linux/include/level-control/LevelControl.cpp b/examples/tv-app/linux/include/level-control/LevelControl.cpp
index 2b53d45..78da6a1 100644
--- a/examples/tv-app/linux/include/level-control/LevelControl.cpp
+++ b/examples/tv-app/linux/include/level-control/LevelControl.cpp
@@ -44,24 +44,33 @@
     return (ep == 0xFF ? NULL : &stateTable[ep]);
 }
 
-static void stepHandler(CommandId commandId, uint8_t stepMode, uint8_t stepSize, uint16_t transitionTimeDs, uint8_t optionMask,
-                        uint8_t optionOverride)
+static void stepHandler(CommandId commandId, uint8_t stepMode, uint8_t stepSize, pp::DataModel::Nullable<uint16_t> transitionTimeDs,
+                        uint8_t optionMask, uint8_t optionOverride)
 {
 
     EndpointId endpoint              = emberAfCurrentEndpoint();
     EmberAfLevelControlState * state = getState(endpoint);
     EmberAfStatus status;
+    app::DataModel::Nullable<uint8_t> nullableCurrentLevel;
     uint8_t currentLevel;
 
-    status = emberAfReadServerAttribute(endpoint, ZCL_LEVEL_CONTROL_CLUSTER_ID, ZCL_CURRENT_LEVEL_ATTRIBUTE_ID,
-                                        (uint8_t *) &currentLevel, sizeof(currentLevel));
-
+    status = Attributes::CurrentLevel::Get(endpoint, nullableCurrentLevel);
     if (status != EMBER_ZCL_STATUS_SUCCESS)
     {
         emberAfLevelControlClusterPrintln("ERR: reading current level %x", status);
         goto send_default_response;
     }
 
+    if (nullableCurrentLevel.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("ERR: Current Level is null");
+        status = EMBER_ZCL_STATUS_FAILURE;
+
+        goto send_default_response;
+    }
+
+    currentLevel = nullableCurrentLevel.Value();
+
     switch (stepMode)
     {
     case EMBER_ZCL_STEP_MODE_UP:
@@ -99,8 +108,10 @@
                 // TODO: Insert your code here to send volume down command
             }
         }
-        status             = emberAfWriteServerAttribute(endpoint, ZCL_LEVEL_CONTROL_CLUSTER_ID, ZCL_CURRENT_LEVEL_ATTRIBUTE_ID,
-                                             (uint8_t *) &currentLevel, ZCL_INT8U_ATTRIBUTE_TYPE);
+
+        nullableCurrentLevel.SetNonNull(currentLevel);
+        status = Attributes::CurrentLevel::Set(endpoint, nullableCurrentLevel);
+
         state->storedLevel = currentLevel;
         ChipLogProgress(Zcl, "Setting volume to new level %d", state->storedLevel);
     }
@@ -112,8 +123,8 @@
     }
 }
 
-bool emberAfLevelControlClusterStepCallback(uint8_t stepMode, uint8_t stepSize, uint16_t transitionTime, uint8_t optionMask,
-                                            uint8_t optionOverride)
+bool emberAfLevelControlClusterStepCallback(uint8_t stepMode, uint8_t stepSize, pp::DataModel::Nullable<uint8_t> transitionTime,
+                                            uint8_t optionMask, uint8_t optionOverride)
 {
     stepHandler(ZCL_STEP_COMMAND_ID, stepMode, stepSize, transitionTime, optionMask, optionOverride);
     return true;
diff --git a/examples/tv-app/tv-common/tv-app.matter b/examples/tv-app/tv-common/tv-app.matter
index de3026b..469dd9f 100644
--- a/examples/tv-app/tv-common/tv-app.matter
+++ b/examples/tv-app/tv-common/tv-app.matter
@@ -66,7 +66,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -85,14 +85,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -100,7 +100,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -112,14 +112,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -127,7 +127,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/examples/tv-casting-app/tv-casting-common/include/LevelControl.h b/examples/tv-casting-app/tv-casting-common/include/LevelControl.h
index fb670e4..d431e3b 100644
--- a/examples/tv-casting-app/tv-casting-common/include/LevelControl.h
+++ b/examples/tv-casting-app/tv-casting-common/include/LevelControl.h
@@ -27,8 +27,9 @@
 public:
     StepCommand() : MediaCommandBase(chip::app::Clusters::LevelControl::Id) {}
 
-    CHIP_ERROR Invoke(chip::app::Clusters::LevelControl::StepMode stepMode, uint8_t stepSize, uint16_t transitionTime,
-                      uint8_t optionMask, uint8_t optionOverride, std::function<void(CHIP_ERROR)> responseCallback);
+    CHIP_ERROR Invoke(chip::app::Clusters::LevelControl::StepMode stepMode, uint8_t stepSize,
+                      chip::app::DataModel::Nullable<uint16_t> transitionTime, uint8_t optionMask, uint8_t optionOverride,
+                      std::function<void(CHIP_ERROR)> responseCallback);
 };
 
 class MoveToLevelCommand
@@ -37,6 +38,6 @@
 public:
     MoveToLevelCommand() : MediaCommandBase(chip::app::Clusters::LevelControl::Id) {}
 
-    CHIP_ERROR Invoke(uint8_t level, uint16_t transitionTime, uint8_t optionMask, uint8_t optionOverride,
-                      std::function<void(CHIP_ERROR)> responseCallback);
+    CHIP_ERROR Invoke(uint8_t level, chip::app::DataModel::Nullable<uint16_t> transitionTime, uint8_t optionMask,
+                      uint8_t optionOverride, std::function<void(CHIP_ERROR)> responseCallback);
 };
diff --git a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp
index 91793a9..548f45c 100644
--- a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp
+++ b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp
@@ -303,14 +303,22 @@
                                             std::function<void(CHIP_ERROR)> responseCallback)
 {
     ReturnErrorOnFailure(mStepCommand.SetTarget(mTargetVideoPlayerInfo, kTvEndpoint));
-    return mStepCommand.Invoke(stepMode, stepSize, transitionTime, optionMask, optionOverride, responseCallback);
+
+    app::DataModel::Nullable<uint16_t> nullableTransitionTime;
+    nullableTransitionTime.SetNonNull(transitionTime);
+
+    return mStepCommand.Invoke(stepMode, stepSize, nullableTransitionTime, optionMask, optionOverride, responseCallback);
 }
 
 CHIP_ERROR CastingServer::LevelControl_MoveToLevel(uint8_t level, uint16_t transitionTime, uint8_t optionMask,
                                                    uint8_t optionOverride, std::function<void(CHIP_ERROR)> responseCallback)
 {
     ReturnErrorOnFailure(mMoveToLevelCommand.SetTarget(mTargetVideoPlayerInfo, kTvEndpoint));
-    return mMoveToLevelCommand.Invoke(level, transitionTime, optionMask, optionOverride, responseCallback);
+
+    app::DataModel::Nullable<uint16_t> nullableTransitionTime;
+    nullableTransitionTime.SetNonNull(transitionTime);
+
+    return mMoveToLevelCommand.Invoke(level, nullableTransitionTime, optionMask, optionOverride, responseCallback);
 }
 
 CHIP_ERROR CastingServer::MediaPlayback_Play(std::function<void(CHIP_ERROR)> responseCallback)
diff --git a/examples/tv-casting-app/tv-casting-common/src/LevelControl.cpp b/examples/tv-casting-app/tv-casting-common/src/LevelControl.cpp
index d55ae63..48de522 100644
--- a/examples/tv-casting-app/tv-casting-common/src/LevelControl.cpp
+++ b/examples/tv-casting-app/tv-casting-common/src/LevelControl.cpp
@@ -21,8 +21,8 @@
 using namespace chip;
 using namespace chip::app::Clusters;
 
-CHIP_ERROR StepCommand::Invoke(LevelControl::StepMode stepMode, uint8_t stepSize, uint16_t transitionTime, uint8_t optionMask,
-                               uint8_t optionOverride, std::function<void(CHIP_ERROR)> responseCallback)
+CHIP_ERROR StepCommand::Invoke(LevelControl::StepMode stepMode, uint8_t stepSize, app::DataModel::Nullable<uint16_t> transitionTime,
+                               uint8_t optionMask, uint8_t optionOverride, std::function<void(CHIP_ERROR)> responseCallback)
 {
     LevelControl::Commands::Step::Type request;
     request.stepMode        = stepMode;
@@ -33,8 +33,8 @@
     return MediaCommandBase::Invoke(request, responseCallback);
 }
 
-CHIP_ERROR MoveToLevelCommand::Invoke(uint8_t level, uint16_t transitionTime, uint8_t optionMask, uint8_t optionOverride,
-                                      std::function<void(CHIP_ERROR)> responseCallback)
+CHIP_ERROR MoveToLevelCommand::Invoke(uint8_t level, app::DataModel::Nullable<uint16_t> transitionTime, uint8_t optionMask,
+                                      uint8_t optionOverride, std::function<void(CHIP_ERROR)> responseCallback)
 {
     LevelControl::Commands::MoveToLevel::Type request;
     request.level           = level;
diff --git a/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter b/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter
index 57aab94..4fe3ada 100644
--- a/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter
+++ b/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter
@@ -320,7 +320,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -339,14 +339,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -354,7 +354,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -366,14 +366,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -381,7 +381,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -418,7 +418,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -437,14 +437,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -452,7 +452,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -464,14 +464,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -479,7 +479,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/src/app/clusters/color-control-server/color-control-server.cpp b/src/app/clusters/color-control-server/color-control-server.cpp
index acbe509..ec61efd 100644
--- a/src/app/clusters/color-control-server/color-control-server.cpp
+++ b/src/app/clusters/color-control-server/color-control-server.cpp
@@ -2415,8 +2415,13 @@
     {
         uint16_t tempCoupleMin = getTemperatureCoupleToLevelMin(endpoint);
 
-        uint8_t currentLevel = 0x7F;
-        LevelControl::Attributes::CurrentLevel::Get(endpoint, &currentLevel);
+        app::DataModel::Nullable<uint8_t> currentLevel;
+        EmberAfStatus status = LevelControl::Attributes::CurrentLevel::Get(endpoint, currentLevel);
+
+        if (status != EMBER_ZCL_STATUS_SUCCESS || currentLevel.IsNull())
+        {
+            currentLevel.SetNonNull((uint8_t) 0x7F);
+        }
 
         uint16_t tempPhysMax = MAX_TEMPERATURE_VALUE;
         Attributes::ColorTempPhysicalMaxMireds::Get(endpoint, &tempPhysMax);
@@ -2425,17 +2430,17 @@
         // Note that mireds varies inversely with level: low level -> high mireds.
         // Peg min/MAX level to MAX/min mireds, otherwise interpolate.
         uint16_t newColorTemp;
-        if (currentLevel <= MIN_CURRENT_LEVEL)
+        if (currentLevel.Value() <= MIN_CURRENT_LEVEL)
         {
             newColorTemp = tempPhysMax;
         }
-        else if (currentLevel >= MAX_CURRENT_LEVEL)
+        else if (currentLevel.Value() >= MAX_CURRENT_LEVEL)
         {
             newColorTemp = tempCoupleMin;
         }
         else
         {
-            uint32_t tempDelta = (((uint32_t) tempPhysMax - (uint32_t) tempCoupleMin) * currentLevel) /
+            uint32_t tempDelta = (((uint32_t) tempPhysMax - (uint32_t) tempCoupleMin) * currentLevel.Value()) /
                 (uint32_t)(MAX_CURRENT_LEVEL - MIN_CURRENT_LEVEL + 1);
             newColorTemp = (uint16_t)((uint32_t) tempPhysMax - tempDelta);
         }
diff --git a/src/app/clusters/level-control/level-control.cpp b/src/app/clusters/level-control/level-control.cpp
index 2035997..c6c236b 100644
--- a/src/app/clusters/level-control/level-control.cpp
+++ b/src/app/clusters/level-control/level-control.cpp
@@ -112,12 +112,13 @@
 
 static EmberAfLevelControlState * getState(EndpointId endpoint);
 
-static EmberAfStatus moveToLevelHandler(EndpointId endpoint, CommandId commandId, uint8_t level, uint16_t transitionTimeDs,
-                                        uint8_t optionsMask, uint8_t optionsOverride, uint16_t storedLevel);
-static void moveHandler(EndpointId endpoint, CommandId commandId, uint8_t moveMode, uint8_t rate, uint8_t optionsMask,
-                        uint8_t optionsOverride);
-static void stepHandler(EndpointId endpoint, CommandId commandId, uint8_t stepMode, uint8_t stepSize, uint16_t transitionTimeDs,
+static EmberAfStatus moveToLevelHandler(EndpointId endpoint, CommandId commandId, uint8_t level,
+                                        app::DataModel::Nullable<uint16_t> transitionTimeDs, uint8_t optionsMask,
+                                        uint8_t optionsOverride, uint16_t storedLevel);
+static void moveHandler(EndpointId endpoint, CommandId commandId, uint8_t moveMode, app::DataModel::Nullable<uint8_t> rate,
                         uint8_t optionsMask, uint8_t optionsOverride);
+static void stepHandler(EndpointId endpoint, CommandId commandId, uint8_t stepMode, uint8_t stepSize,
+                        app::DataModel::Nullable<uint16_t> transitionTimeDs, uint8_t optionsMask, uint8_t optionsOverride);
 static void stopHandler(EndpointId endpoint, CommandId commandId, uint8_t optionsMask, uint8_t optionsOverride);
 
 static void setOnOffValue(EndpointId endpoint, bool onOff);
@@ -180,7 +181,7 @@
 {
     EmberAfLevelControlState * state = getState(endpoint);
     EmberAfStatus status;
-    uint8_t currentLevel;
+    app::DataModel::Nullable<uint8_t> currentLevel;
 
     if (state == nullptr)
     {
@@ -190,36 +191,37 @@
     state->elapsedTimeMs += state->eventDurationMs;
 
     // Read the attribute; print error message and return if it can't be read
-    status = Attributes::CurrentLevel::Get(endpoint, &currentLevel);
-    if (status != EMBER_ZCL_STATUS_SUCCESS)
+    status = LevelControl::Attributes::CurrentLevel::Get(endpoint, currentLevel);
+
+    if (status != EMBER_ZCL_STATUS_SUCCESS || currentLevel.IsNull())
     {
         emberAfLevelControlClusterPrintln("ERR: reading current level %x", status);
         writeRemainingTime(endpoint, 0);
         return;
     }
 
-    emberAfLevelControlClusterPrint("Event: move from %d", currentLevel);
+    emberAfLevelControlClusterPrint("Event: move from %d", currentLevel.Value());
 
     // adjust by the proper amount, either up or down
     if (state->transitionTimeMs == 0)
     {
         // Immediate, not over a time interval.
-        currentLevel = state->moveToLevel;
+        currentLevel.SetNonNull(state->moveToLevel);
     }
     else if (state->increasing)
     {
-        assert(currentLevel < state->maxLevel);
-        assert(currentLevel < state->moveToLevel);
-        currentLevel++;
+        assert(currentLevel.Value() < state->maxLevel);
+        assert(currentLevel.Value() < state->moveToLevel);
+        currentLevel.SetNonNull(static_cast<uint8_t>(currentLevel.Value() + 1));
     }
     else
     {
-        assert(state->minLevel < currentLevel);
-        assert(state->moveToLevel < currentLevel);
-        currentLevel--;
+        assert(state->minLevel < currentLevel.Value());
+        assert(state->moveToLevel < currentLevel.Value());
+        currentLevel.SetNonNull(static_cast<uint8_t>(currentLevel.Value() - 1));
     }
 
-    emberAfLevelControlClusterPrint(" to %d ", currentLevel);
+    emberAfLevelControlClusterPrint(" to %d ", currentLevel.Value());
     emberAfLevelControlClusterPrintln("(diff %c1)", state->increasing ? '+' : '-');
 
     status = Attributes::CurrentLevel::Set(endpoint, currentLevel);
@@ -241,12 +243,12 @@
 #endif // EMBER_AF_PLUGIN_SCENES
 
     // Are we at the requested level?
-    if (currentLevel == state->moveToLevel)
+    if (currentLevel.Value() == state->moveToLevel)
     {
         if (state->commandId == Commands::MoveToLevelWithOnOff::Id || state->commandId == Commands::MoveWithOnOff::Id ||
             state->commandId == Commands::StepWithOnOff::Id)
         {
-            setOnOffValue(endpoint, (currentLevel != state->minLevel));
+            setOnOffValue(endpoint, (currentLevel.Value() != state->minLevel));
         }
         else
         {
@@ -408,8 +410,17 @@
     auto & optionsMask     = commandData.optionsMask;
     auto & optionsOverride = commandData.optionsOverride;
 
-    emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL %x %2x %x %x", "RX level-control:", level, transitionTime, optionsMask,
-                                      optionsOverride);
+    if (transitionTime.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL %x null %x %x", "RX level-control:", level, optionsMask,
+                                          optionsOverride);
+    }
+    else
+    {
+        emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL %x %2x %x %x", "RX level-control:", level, transitionTime.Value(),
+                                          optionsMask, optionsOverride);
+    }
+
     EmberAfStatus status =
         moveToLevelHandler(commandPath.mEndpointId, Commands::MoveToLevel::Id, level, transitionTime, optionsMask, optionsOverride,
                            INVALID_STORED_LEVEL); // Don't revert to the stored level
@@ -428,7 +439,17 @@
     auto & optionsMask     = commandData.optionsMask;
     auto & optionsOverride = commandData.optionsOverride;
 
-    emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL_WITH_ON_OFF %x %2x", "RX level-control:", level, transitionTime);
+    if (transitionTime.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL_WITH_ON_OFF %x null %x %x", "RX level-control:", level, optionsMask,
+                                          optionsOverride);
+    }
+    else
+    {
+        emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL_WITH_ON_OFF %x %2x %x %x", "RX level-control:", level,
+                                          transitionTime.Value(), optionsMask, optionsOverride);
+    }
+
     EmberAfStatus status = moveToLevelHandler(commandPath.mEndpointId, Commands::MoveToLevelWithOnOff::Id, level, transitionTime,
                                               optionsMask, optionsOverride,
                                               INVALID_STORED_LEVEL); // Don't revert to the stored level
@@ -446,7 +467,16 @@
     auto & optionsMask     = commandData.optionsMask;
     auto & optionsOverride = commandData.optionsOverride;
 
-    emberAfLevelControlClusterPrintln("%pMOVE %x %x", "RX level-control:", moveMode, rate);
+    if (rate.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("%pMOVE %x null %x %x", "RX level-control:", moveMode, optionsMask, optionsOverride);
+    }
+    else
+    {
+        emberAfLevelControlClusterPrintln("%pMOVE %x %u %x %x", "RX level-control:", moveMode, rate.Value(), optionsMask,
+                                          optionsOverride);
+    }
+
     moveHandler(commandPath.mEndpointId, Commands::Move::Id, moveMode, rate, optionsMask, optionsOverride);
     return true;
 }
@@ -459,7 +489,17 @@
     auto & optionsMask     = commandData.optionsMask;
     auto & optionsOverride = commandData.optionsOverride;
 
-    emberAfLevelControlClusterPrintln("%pMOVE_WITH_ON_OFF %x %x", "RX level-control:", moveMode, rate);
+    if (rate.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("%pMOVE_WITH_ON_OFF %x null %x %x", "RX level-control:", moveMode, optionsMask,
+                                          optionsOverride);
+    }
+    else
+    {
+        emberAfLevelControlClusterPrintln("%pMOVE_WITH_ON_OFF %u %2x %x %x", "RX level-control:", moveMode, rate.Value(),
+                                          optionsMask, optionsOverride);
+    }
+
     moveHandler(commandPath.mEndpointId, Commands::MoveWithOnOff::Id, moveMode, rate, optionsMask, optionsOverride);
     return true;
 }
@@ -473,7 +513,17 @@
     auto & optionsMask     = commandData.optionsMask;
     auto & optionsOverride = commandData.optionsOverride;
 
-    emberAfLevelControlClusterPrintln("%pSTEP %x %x %2x", "RX level-control:", stepMode, stepSize, transitionTime);
+    if (transitionTime.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("%pSTEP %x %x null %x %x", "RX level-control:", stepMode, stepSize, optionsMask,
+                                          optionsOverride);
+    }
+    else
+    {
+        emberAfLevelControlClusterPrintln("%pSTEP %x %x %2x %x %x", "RX level-control:", stepMode, stepSize, transitionTime.Value(),
+                                          optionsMask, optionsOverride);
+    }
+
     stepHandler(commandPath.mEndpointId, Commands::Step::Id, stepMode, stepSize, transitionTime, optionsMask, optionsOverride);
     return true;
 }
@@ -487,7 +537,17 @@
     auto & optionsMask     = commandData.optionsMask;
     auto & optionsOverride = commandData.optionsOverride;
 
-    emberAfLevelControlClusterPrintln("%pSTEP_WITH_ON_OFF %x %x %2x", "RX level-control:", stepMode, stepSize, transitionTime);
+    if (transitionTime.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("%pSTEP_WITH_ON_OFF %x %x null %x %x", "RX level-control:", stepMode, stepSize,
+                                          optionsMask, optionsOverride);
+    }
+    else
+    {
+        emberAfLevelControlClusterPrintln("%pSTEP_WITH_ON_OFF %x %x %2x %x %x", "RX level-control:", stepMode, stepSize,
+                                          transitionTime.Value(), optionsMask, optionsOverride);
+    }
+
     stepHandler(commandPath.mEndpointId, Commands::StepWithOnOff::Id, stepMode, stepSize, transitionTime, optionsMask,
                 optionsOverride);
     return true;
@@ -514,12 +574,13 @@
     return true;
 }
 
-static EmberAfStatus moveToLevelHandler(EndpointId endpoint, CommandId commandId, uint8_t level, uint16_t transitionTimeDs,
-                                        uint8_t optionsMask, uint8_t optionsOverride, uint16_t storedLevel)
+static EmberAfStatus moveToLevelHandler(EndpointId endpoint, CommandId commandId, uint8_t level,
+                                        app::DataModel::Nullable<uint16_t> transitionTimeDs, uint8_t optionsMask,
+                                        uint8_t optionsOverride, uint16_t storedLevel)
 {
     EmberAfLevelControlState * state = getState(endpoint);
     EmberAfStatus status;
-    uint8_t currentLevel;
+    app::DataModel::Nullable<uint8_t> currentLevel;
     uint8_t actualStepSize;
 
     if (state == nullptr)
@@ -540,13 +601,19 @@
     // Cancel any currently active command before fiddling with the state.
     deactivate(endpoint);
 
-    status = Attributes::CurrentLevel::Get(endpoint, &currentLevel);
+    status = Attributes::CurrentLevel::Get(endpoint, currentLevel);
     if (status != EMBER_ZCL_STATUS_SUCCESS)
     {
         emberAfLevelControlClusterPrintln("ERR: reading current level %x", status);
         return status;
     }
 
+    if (currentLevel.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("ERR: Current Level is null");
+        return EMBER_ZCL_STATUS_FAILURE;
+    }
+
     state->commandId = commandId;
 
     // Move To Level commands cause the device to move from its current level to
@@ -568,36 +635,37 @@
     // logic is to prevent a light from transitioning from off to bright to dim.
     // Instead, a light that is off will stay off until the target level is
     // reached.
-    if (currentLevel <= state->moveToLevel)
+    if (currentLevel.Value() <= state->moveToLevel)
     {
         if (commandId == Commands::MoveToLevelWithOnOff::Id)
         {
             setOnOffValue(endpoint, (state->moveToLevel != state->minLevel));
         }
-        if (currentLevel == state->moveToLevel)
+        if (currentLevel.Value() == state->moveToLevel)
         {
             return EMBER_ZCL_STATUS_SUCCESS;
         }
         state->increasing = true;
-        actualStepSize    = static_cast<uint8_t>(state->moveToLevel - currentLevel);
+        actualStepSize    = static_cast<uint8_t>(state->moveToLevel - currentLevel.Value());
     }
     else
     {
         state->increasing = false;
-        actualStepSize    = static_cast<uint8_t>(currentLevel - state->moveToLevel);
+        actualStepSize    = static_cast<uint8_t>(currentLevel.Value() - state->moveToLevel);
     }
 
-    // If the Transition time field takes the value 0xFFFF, then the time taken
+    // If the Transition time field takes the value null, then the time taken
     // to move to the new level shall instead be determined by the On/Off
     // Transition Time attribute.  If On/Off Transition Time, which is an
     // optional attribute, is not present, the device shall move to its new level
     // as fast as it is able.
-    if (transitionTimeDs == 0xFFFF)
+    if (transitionTimeDs.IsNull())
     {
 #ifndef IGNORE_LEVEL_CONTROL_CLUSTER_ON_OFF_TRANSITION_TIME
         if (emberAfContainsAttribute(endpoint, LevelControl::Id, Attributes::OnOffTransitionTime::Id))
         {
-            status = Attributes::OnOffTransitionTime::Get(endpoint, &transitionTimeDs);
+            uint16_t onOffTransitionTime = 0;
+            status                       = Attributes::OnOffTransitionTime::Get(endpoint, &onOffTransitionTime);
             if (status != EMBER_ZCL_STATUS_SUCCESS)
             {
                 emberAfLevelControlClusterPrintln("ERR: reading on/off transition time %x", status);
@@ -606,7 +674,7 @@
 
             // Transition time comes in (or is stored, in the case of On/Off Transition
             // Time) as tenths of a second, but we work in milliseconds.
-            state->transitionTimeMs = (transitionTimeDs * MILLISECOND_TICKS_PER_SECOND / 10);
+            state->transitionTimeMs = (onOffTransitionTime * MILLISECOND_TICKS_PER_SECOND / 10);
         }
         else
         {
@@ -623,7 +691,7 @@
     {
         // Transition time comes in (or is stored, in the case of On/Off Transition
         // Time) as tenths of a second, but we work in milliseconds.
-        state->transitionTimeMs = (transitionTimeDs * MILLISECOND_TICKS_PER_SECOND / 10);
+        state->transitionTimeMs = (transitionTimeDs.Value() * MILLISECOND_TICKS_PER_SECOND / 10);
     }
 
     // The duration between events will be the transition time divided by the
@@ -650,12 +718,12 @@
     return status;
 }
 
-static void moveHandler(EndpointId endpoint, CommandId commandId, uint8_t moveMode, uint8_t rate, uint8_t optionsMask,
-                        uint8_t optionsOverride)
+static void moveHandler(EndpointId endpoint, CommandId commandId, uint8_t moveMode, app::DataModel::Nullable<uint8_t> rate,
+                        uint8_t optionsMask, uint8_t optionsOverride)
 {
     EmberAfLevelControlState * state = getState(endpoint);
     EmberAfStatus status;
-    uint8_t currentLevel;
+    app::DataModel::Nullable<uint8_t> currentLevel;
     uint8_t difference;
 
     if (state == nullptr)
@@ -664,7 +732,7 @@
         goto send_default_response;
     }
 
-    if (rate == 0 || !shouldExecuteIfOff(endpoint, commandId, optionsMask, optionsOverride))
+    if (!shouldExecuteIfOff(endpoint, commandId, optionsMask, optionsOverride))
     {
         status = EMBER_ZCL_STATUS_SUCCESS;
         goto send_default_response;
@@ -673,13 +741,21 @@
     // Cancel any currently active command before fiddling with the state.
     deactivate(endpoint);
 
-    status = Attributes::CurrentLevel::Get(endpoint, &currentLevel);
+    status = Attributes::CurrentLevel::Get(endpoint, currentLevel);
     if (status != EMBER_ZCL_STATUS_SUCCESS)
     {
         emberAfLevelControlClusterPrintln("ERR: reading current level %x", status);
         goto send_default_response;
     }
 
+    if (currentLevel.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("ERR: Current Level is null");
+        status = EMBER_ZCL_STATUS_FAILURE;
+
+        goto send_default_response;
+    }
+
     state->commandId = commandId;
 
     // Move commands cause the device to move from its current level to either
@@ -689,12 +765,12 @@
     case EMBER_ZCL_MOVE_MODE_UP:
         state->increasing  = true;
         state->moveToLevel = state->maxLevel;
-        difference         = static_cast<uint8_t>(state->maxLevel - currentLevel);
+        difference         = static_cast<uint8_t>(state->maxLevel - currentLevel.Value());
         break;
     case EMBER_ZCL_MOVE_MODE_DOWN:
         state->increasing  = false;
         state->moveToLevel = state->minLevel;
-        difference         = static_cast<uint8_t>(currentLevel - state->minLevel);
+        difference         = static_cast<uint8_t>(currentLevel.Value() - state->minLevel);
         break;
     default:
         status = EMBER_ZCL_STATUS_INVALID_FIELD;
@@ -705,22 +781,22 @@
     // logic is to prevent a light from transitioning from off to bright to dim.
     // Instead, a light that is off will stay off until the target level is
     // reached.
-    if (currentLevel <= state->moveToLevel)
+    if (currentLevel.Value() <= state->moveToLevel)
     {
         if (commandId == Commands::MoveWithOnOff::Id)
         {
             setOnOffValue(endpoint, (state->moveToLevel != state->minLevel));
         }
-        if (currentLevel == state->moveToLevel)
+        if (currentLevel.Value() == state->moveToLevel)
         {
             status = EMBER_ZCL_STATUS_SUCCESS;
             goto send_default_response;
         }
     }
 
-    // If the Rate field is 0xFF, the device should move at the default move rate, if available,
+    // If the Rate field is null, the device should move at the default move rate, if available,
     // Otherwise, move as fast as possible
-    if (rate == 0xFF)
+    if (rate.IsNull())
     {
         app::DataModel::Nullable<uint8_t> defaultMoveRate;
         status = Attributes::DefaultMoveRate::Get(endpoint, defaultMoveRate);
@@ -742,7 +818,7 @@
     }
     else
     {
-        state->eventDurationMs = MILLISECOND_TICKS_PER_SECOND / rate;
+        state->eventDurationMs = MILLISECOND_TICKS_PER_SECOND / rate.Value();
     }
 
     state->transitionTimeMs = difference * state->eventDurationMs;
@@ -759,12 +835,12 @@
     emberAfSendImmediateDefaultResponse(status);
 }
 
-static void stepHandler(EndpointId endpoint, CommandId commandId, uint8_t stepMode, uint8_t stepSize, uint16_t transitionTimeDs,
-                        uint8_t optionsMask, uint8_t optionsOverride)
+static void stepHandler(EndpointId endpoint, CommandId commandId, uint8_t stepMode, uint8_t stepSize,
+                        app::DataModel::Nullable<uint16_t> transitionTimeDs, uint8_t optionsMask, uint8_t optionsOverride)
 {
     EmberAfLevelControlState * state = getState(endpoint);
     EmberAfStatus status;
-    uint8_t currentLevel;
+    app::DataModel::Nullable<uint8_t> currentLevel;
     uint8_t actualStepSize = stepSize;
 
     if (state == nullptr)
@@ -782,13 +858,21 @@
     // Cancel any currently active command before fiddling with the state.
     deactivate(endpoint);
 
-    status = Attributes::CurrentLevel::Get(endpoint, &currentLevel);
+    status = Attributes::CurrentLevel::Get(endpoint, currentLevel);
     if (status != EMBER_ZCL_STATUS_SUCCESS)
     {
         emberAfLevelControlClusterPrintln("ERR: reading current level %x", status);
         goto send_default_response;
     }
 
+    if (currentLevel.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("ERR: Current Level is null");
+        status = EMBER_ZCL_STATUS_FAILURE;
+
+        goto send_default_response;
+    }
+
     state->commandId = commandId;
 
     // Step commands cause the device to move from its current level to a new
@@ -797,26 +881,26 @@
     {
     case EMBER_ZCL_STEP_MODE_UP:
         state->increasing = true;
-        if (state->maxLevel - currentLevel < stepSize)
+        if (state->maxLevel - currentLevel.Value() < stepSize)
         {
             state->moveToLevel = state->maxLevel;
-            actualStepSize     = static_cast<uint8_t>(state->maxLevel - currentLevel);
+            actualStepSize     = static_cast<uint8_t>(state->maxLevel - currentLevel.Value());
         }
         else
         {
-            state->moveToLevel = static_cast<uint8_t>(currentLevel + stepSize);
+            state->moveToLevel = static_cast<uint8_t>(currentLevel.Value() + stepSize);
         }
         break;
     case EMBER_ZCL_STEP_MODE_DOWN:
         state->increasing = false;
-        if (currentLevel - state->minLevel < stepSize)
+        if (currentLevel.Value() - state->minLevel < stepSize)
         {
             state->moveToLevel = state->minLevel;
-            actualStepSize     = static_cast<uint8_t>(currentLevel - state->minLevel);
+            actualStepSize     = static_cast<uint8_t>(currentLevel.Value() - state->minLevel);
         }
         else
         {
-            state->moveToLevel = static_cast<uint8_t>(currentLevel - stepSize);
+            state->moveToLevel = static_cast<uint8_t>(currentLevel.Value() - stepSize);
         }
         break;
     default:
@@ -828,22 +912,22 @@
     // logic is to prevent a light from transitioning from off to bright to dim.
     // Instead, a light that is off will stay off until the target level is
     // reached.
-    if (currentLevel <= state->moveToLevel)
+    if (currentLevel.Value() <= state->moveToLevel)
     {
         if (commandId == Commands::StepWithOnOff::Id)
         {
             setOnOffValue(endpoint, (state->moveToLevel != state->minLevel));
         }
-        if (currentLevel == state->moveToLevel)
+        if (currentLevel.Value() == state->moveToLevel)
         {
             status = EMBER_ZCL_STATUS_SUCCESS;
             goto send_default_response;
         }
     }
 
-    // If the Transition Time field is 0xFFFF, the device should move as fast as
+    // If the Transition Time field is null, the device should move as fast as
     // it is able.
-    if (transitionTimeDs == 0xFFFF)
+    if (transitionTimeDs.IsNull())
     {
         state->transitionTimeMs = FASTEST_TRANSITION_TIME_MS;
     }
@@ -851,7 +935,7 @@
     {
         // Transition time comes in as tenths of a second, but we work in
         // milliseconds.
-        state->transitionTimeMs = (transitionTimeDs * MILLISECOND_TICKS_PER_SECOND / 10);
+        state->transitionTimeMs = (transitionTimeDs.Value() * MILLISECOND_TICKS_PER_SECOND / 10);
         // If the new level was pegged at the minimum level, the transition time
         // shall be proportionally reduced.  This is done after the conversion to
         // milliseconds to reduce rounding errors in integer division.
@@ -908,7 +992,8 @@
 void emberAfOnOffClusterLevelControlEffectCallback(EndpointId endpoint, bool newValue)
 {
     app::DataModel::Nullable<uint8_t> resolvedLevel;
-    uint8_t temporaryCurrentLevelCache;
+    app::DataModel::Nullable<uint8_t> temporaryCurrentLevelCache;
+
     uint16_t currentOnOffTransitionTime;
     EmberAfStatus status;
     bool useOnLevel = false;
@@ -923,13 +1008,19 @@
     uint8_t minimumLevelAllowedForTheDevice = state->minLevel;
 
     // "Temporarily store CurrentLevel."
-    status = Attributes::CurrentLevel::Get(endpoint, &temporaryCurrentLevelCache);
+    status = Attributes::CurrentLevel::Get(endpoint, temporaryCurrentLevelCache);
     if (status != EMBER_ZCL_STATUS_SUCCESS)
     {
         emberAfLevelControlClusterPrintln("ERR: reading current level %x", status);
         return;
     }
 
+    if (temporaryCurrentLevelCache.IsNull())
+    {
+        emberAfLevelControlClusterPrintln("ERR: Current Level is null");
+        return;
+    }
+
 #ifndef IGNORE_LEVEL_CONTROL_CLUSTER_ON_LEVEL_ATTRIBUTE
     if (emberAfContainsAttribute(endpoint, LevelControl::Id, Attributes::OnLevel::Id))
     {
@@ -943,7 +1034,7 @@
         if (resolvedLevel.IsNull())
         {
             // OnLevel has undefined value; fall back to CurrentLevel.
-            resolvedLevel.SetNonNull(temporaryCurrentLevelCache);
+            resolvedLevel.SetNonNull(temporaryCurrentLevelCache.Value());
         }
         else
         {
@@ -952,10 +1043,10 @@
     }
     else
     {
-        resolvedLevel.SetNonNull(temporaryCurrentLevelCache);
+        resolvedLevel.SetNonNull(temporaryCurrentLevelCache.Value());
     }
 #else
-    resolvedLevel.SetNonNull(temporaryCurrentLevelCache);
+    resolvedLevel.SetNonNull(temporaryCurrentLevelCache.Value());
 #endif // IGNORE_LEVEL_CONTROL_CLUSTER_ON_LEVEL_ATTRIBUTE
 
     // Read the OnOffTransitionTime attribute.
@@ -977,6 +1068,9 @@
     currentOnOffTransitionTime = 0xFFFF;
 #endif // IGNORE_LEVEL_CONTROL_CLUSTER_ON_OFF_TRANSITION_TIME
 
+    app::DataModel::Nullable<uint16_t> transitionTime;
+    transitionTime.SetNonNull(currentOnOffTransitionTime);
+
     if (newValue)
     {
         // If newValue is OnOff::Commands::On::Id...
@@ -990,7 +1084,7 @@
 
         // "Move CurrentLevel to OnLevel, or to the stored level if OnLevel is not
         // defined, over the time period OnOffTransitionTime."
-        moveToLevelHandler(endpoint, Commands::MoveToLevel::Id, resolvedLevel.Value(), currentOnOffTransitionTime, 0xFF, 0xFF,
+        moveToLevelHandler(endpoint, Commands::MoveToLevel::Id, resolvedLevel.Value(), transitionTime, 0xFF, 0xFF,
                            INVALID_STORED_LEVEL); // Don't revert to stored level
     }
     else
@@ -1000,15 +1094,16 @@
         // time period OnOffTransitionTime."
         if (useOnLevel)
         {
+
             // If OnLevel is defined, don't revert to stored level.
-            moveToLevelHandler(endpoint, Commands::MoveToLevel::Id, minimumLevelAllowedForTheDevice, currentOnOffTransitionTime,
-                               0xFF, 0xFF, INVALID_STORED_LEVEL);
+            moveToLevelHandler(endpoint, Commands::MoveToLevel::Id, minimumLevelAllowedForTheDevice, transitionTime, 0xFF, 0xFF,
+                               INVALID_STORED_LEVEL);
         }
         else
         {
             // If OnLevel is not defined, set the CurrentLevel to the stored level.
-            moveToLevelHandler(endpoint, Commands::MoveToLevel::Id, minimumLevelAllowedForTheDevice, currentOnOffTransitionTime,
-                               0xFF, 0xFF, temporaryCurrentLevelCache);
+            moveToLevelHandler(endpoint, Commands::MoveToLevel::Id, minimumLevelAllowedForTheDevice, transitionTime, 0xFF, 0xFF,
+                               temporaryCurrentLevelCache.Value());
         }
     }
 }
@@ -1046,8 +1141,8 @@
         }
     }
 
-    uint8_t currentLevel = 0;
-    EmberAfStatus status = Attributes::CurrentLevel::Get(endpoint, &currentLevel);
+    app::DataModel::Nullable<uint8_t> currentLevel;
+    EmberAfStatus status = Attributes::CurrentLevel::Get(endpoint, currentLevel);
     if (status == EMBER_ZCL_STATUS_SUCCESS)
     {
 #ifndef IGNORE_LEVEL_CONTROL_CLUSTER_START_UP_CURRENT_LEVEL
@@ -1075,7 +1170,7 @@
                 {
                     if (startUpCurrentLevel.Value() == STARTUP_CURRENT_LEVEL_USE_DEVICE_MINIMUM)
                     {
-                        currentLevel = state->minLevel;
+                        currentLevel.SetNonNull(state->minLevel);
                     }
                     else
                     {
@@ -1084,15 +1179,15 @@
                         // Spec doesn't mention this.
                         if (startUpCurrentLevel.Value() < state->minLevel)
                         {
-                            currentLevel = state->minLevel;
+                            currentLevel.SetNonNull(state->minLevel);
                         }
                         else if (startUpCurrentLevel.Value() > state->maxLevel)
                         {
-                            currentLevel = state->maxLevel;
+                            currentLevel.SetNonNull(state->maxLevel);
                         }
                         else
                         {
-                            currentLevel = startUpCurrentLevel.Value();
+                            currentLevel.SetNonNull(startUpCurrentLevel.Value());
                         }
                     }
                 }
@@ -1103,11 +1198,11 @@
         }
 #endif // IGNORE_LEVEL_CONTROL_CLUSTER_START_UP_CURRENT_LEVEL
        // In any case, we make sure that the respects min/max
-        if (currentLevel < state->minLevel)
+        if (currentLevel.IsNull() || currentLevel.Value() < state->minLevel)
         {
             Attributes::CurrentLevel::Set(endpoint, state->minLevel);
         }
-        else if (currentLevel > state->maxLevel)
+        else if (currentLevel.Value() > state->maxLevel)
         {
             Attributes::CurrentLevel::Set(endpoint, state->maxLevel);
         }
diff --git a/src/app/tests/suites/TestLevelControlWithOnOffDependency.yaml b/src/app/tests/suites/TestLevelControlWithOnOffDependency.yaml
index 6a3f63b..69323b7 100644
--- a/src/app/tests/suites/TestLevelControlWithOnOffDependency.yaml
+++ b/src/app/tests/suites/TestLevelControlWithOnOffDependency.yaml
@@ -28,7 +28,7 @@
               - name: "nodeId"
                 value: nodeId
 
-    - label: "Sends a MoveToLevel command to set current level to min value"
+    - label: "Sends a MoveToLevel command to set CurrentLevel to min value"
       command: "MoveToLevel"
       arguments:
           values:
@@ -51,13 +51,13 @@
 
     - label: "Reads CurrentLevel attribute from DUT"
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 1
 
     - label: "Write OnOffTransitionTime attribute"
       command: "writeAttribute"
-      attribute: "on off transition time"
+      attribute: "OnOffTransitionTime"
       arguments:
           value: 0
 
@@ -71,13 +71,13 @@
 
     - label: "Read OnOffTransitionTime attribute"
       command: "readAttribute"
-      attribute: "on off transition time"
+      attribute: "OnOffTransitionTime"
       response:
           value: 0
 
     - label: "Write OnLevel attribute"
       command: "writeAttribute"
-      attribute: "on level"
+      attribute: "OnLevel"
       arguments:
           value: 254
 
@@ -91,13 +91,13 @@
 
     - label: "Read OnLevel attribute"
       command: "readAttribute"
-      attribute: "on level"
+      attribute: "OnLevel"
       response:
           value: 254
 
     - label: "Read MinValue attribute"
       command: "readAttribute"
-      attribute: "min level"
+      attribute: "MinLevel"
       response:
           value: 1
 
@@ -122,7 +122,7 @@
 
     - label: "If OnLevel is defined, check CurrentLevel is OnLevel value"
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 254
 
@@ -147,11 +147,11 @@
 
     - label: "If OnLevel is defined, check CurrentLevel is min value"
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 1
 
-    - label: "Sends a MoveToLevel command to set current level to a mid value"
+    - label: "Sends a MoveToLevel command to set CurrentLevel to a mid value"
       command: "MoveToLevel"
       arguments:
           values:
@@ -174,13 +174,13 @@
 
     - label: "Reads CurrentLevel attribute from DUT"
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 127
 
     - label: "Set OnLevel attribute to null"
       command: "writeAttribute"
-      attribute: "on level"
+      attribute: "OnLevel"
       arguments:
           value: null
 
@@ -194,7 +194,7 @@
 
     - label: "Read OnLevel attribute"
       command: "readAttribute"
-      attribute: "on level"
+      attribute: "OnLevel"
       response:
           value: null
 
@@ -219,7 +219,7 @@
 
     - label: "If OnLevel is not defined, check CurrentLevel is restored"
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 127
 
@@ -244,6 +244,6 @@
 
     - label: "If OnLevel is not defined, check CurrentLevel is restored"
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 127
diff --git a/src/app/tests/suites/certification/Test_TC_LVL_2_1.yaml b/src/app/tests/suites/certification/Test_TC_LVL_2_1.yaml
index 179ba1b..86a9e2e 100644
--- a/src/app/tests/suites/certification/Test_TC_LVL_2_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_LVL_2_1.yaml
@@ -31,7 +31,7 @@
     - label: "Reads the CurrentLevel attribute"
       PICS: LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           saveAs: CurrentLevelValue
           constraints:
@@ -42,7 +42,7 @@
     - label: "Reads the RemainingTime attribute"
       PICS: LVL.S.A0001
       command: "readAttribute"
-      attribute: "remaining time"
+      attribute: "RemainingTime"
       response:
           constraints:
               type: int16u
@@ -52,7 +52,7 @@
     - label: "Reads the MinLevel attribute"
       PICS: LVL.S.A0002 && LVL.S.F01
       command: "readAttribute"
-      attribute: "min level"
+      attribute: "MinLevel"
       response:
           value: 1
           saveAs: MinLevelValue
@@ -62,7 +62,7 @@
     - label: "Reads the MinLevel attribute"
       PICS: LVL.S.A0002 && !LVL.S.F01
       command: "readAttribute"
-      attribute: "min level"
+      attribute: "MinLevel"
       response:
           saveAs: MinLevelFeatureMapNotSupportedValue
           constraints:
@@ -73,7 +73,7 @@
     - label: "Reads the MaxLevel attribute"
       PICS: LVL.S.A0003 && LVL.S.F01
       command: "readAttribute"
-      attribute: "max level"
+      attribute: "MaxLevel"
       response:
           value: 254
           saveAs: MaxLevelValue
@@ -84,7 +84,7 @@
     - label: "Reads the MaxLevel attribute"
       PICS: LVL.S.A0003 && !LVL.S.F01
       command: "readAttribute"
-      attribute: "max level"
+      attribute: "MaxLevel"
       response:
           saveAs: MaxLevelFeatureMapNotSupportedValue
           constraints:
@@ -95,7 +95,7 @@
     - label: "Step 4b & 4C Reads the CurrentLevel attribute"
       PICS: LVL.S.F01 && LVL.S.A0002 && LVL.S.A0003
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           constraints:
               type: int8u
@@ -105,7 +105,7 @@
     - label: "Step 4b & 4C Reads the CurrentLevel attribute"
       PICS: LVL.S.A0002 && LVL.S.A0003 && !LVL.S.F01
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           constraints:
               type: int8u
@@ -115,7 +115,7 @@
     - label: "Reads the CurrentFrequency attribute"
       PICS: LVL.S.A0004
       command: "readAttribute"
-      attribute: "current frequency"
+      attribute: "CurrentFrequency"
       response:
           constraints:
               type: int16u
@@ -125,7 +125,7 @@
     - label: "Reads the MinFrequency attribute"
       PICS: LVL.S.A0005
       command: "readAttribute"
-      attribute: "min frequency"
+      attribute: "MinFrequency"
       response:
           saveAs: MinFrequencyValue
           constraints:
@@ -136,7 +136,7 @@
     - label: "Reads the MaxFrequency attribute"
       PICS: LVL.S.A0006
       command: "readAttribute"
-      attribute: "max frequency"
+      attribute: "MaxFrequency"
       response:
           saveAs: MaxFrequencyValue
           constraints:
@@ -147,7 +147,7 @@
     - label: "Step 7b & 7C Reads the CurrentFrequency attribute"
       PICS: LVL.S.A0004 && LVL.S.A0005 && LVL.S.A0006
       command: "readAttribute"
-      attribute: "current frequency"
+      attribute: "CurrentFrequency"
       response:
           constraints:
               type: int16u
@@ -157,7 +157,7 @@
     - label: "Reads the OnOffTransitionTime attribute"
       PICS: LVL.S.A0010
       command: "readAttribute"
-      attribute: "on off transition time"
+      attribute: "OnOffTransitionTime"
       response:
           constraints:
               type: int16u
@@ -167,7 +167,7 @@
     - label: "Reads the OnLevel attribute "
       PICS: LVL.S.F01 && LVL.S.A0011
       command: "readAttribute"
-      attribute: "on level"
+      attribute: "OnLevel"
       response:
           constraints:
               type: int8u
@@ -177,7 +177,7 @@
     - label: "Reads the OnLevel attribute "
       PICS: LVL.S.A0011 && !LVL.S.F01
       command: "readAttribute"
-      attribute: "on level"
+      attribute: "OnLevel"
       response:
           constraints:
               type: int8u
@@ -187,7 +187,7 @@
     - label: "Reads the OnTransitionTime attribute "
       PICS: LVL.S.A0012
       command: "readAttribute"
-      attribute: "on transition time"
+      attribute: "OnTransitionTime"
       response:
           constraints:
               type: int16u
@@ -197,7 +197,7 @@
     - label: "Reads the OffTransitionTime attribute "
       PICS: LVL.S.A0013
       command: "readAttribute"
-      attribute: "off transition time"
+      attribute: "OffTransitionTime"
       response:
           constraints:
               type: int16u
@@ -207,7 +207,7 @@
     - label: "Reads the DefaultMoveRate attribute "
       PICS: LVL.S.A0014
       command: "readAttribute"
-      attribute: "default move rate"
+      attribute: "DefaultMoveRate"
       response:
           constraints:
               type: int8u
@@ -217,7 +217,7 @@
     - label: "Reads the Options attribute "
       PICS: LVL.S.A000f
       command: "readAttribute"
-      attribute: "options"
+      attribute: "Options"
       response:
           value: 0
           constraints:
@@ -226,7 +226,7 @@
     - label: "Reads the StartUpCurrentLevel attribute "
       PICS: LVL.S.A4000
       command: "readAttribute"
-      attribute: "start up current level"
+      attribute: "StartUpCurrentLevel"
       response:
           constraints:
               type: int8u
diff --git a/src/app/tests/suites/certification/Test_TC_LVL_2_2.yaml b/src/app/tests/suites/certification/Test_TC_LVL_2_2.yaml
index d6a3ae0..2fe9697 100644
--- a/src/app/tests/suites/certification/Test_TC_LVL_2_2.yaml
+++ b/src/app/tests/suites/certification/Test_TC_LVL_2_2.yaml
@@ -49,7 +49,7 @@
     - label: "Reads the OnOffTransitionTime attribute from the DUT"
       PICS: LVL.S.A0010
       command: "readAttribute"
-      attribute: "on off transition time"
+      attribute: "OnOffTransitionTime"
       response:
           saveAs: OnOffTransitionTimeValue
           constraints:
@@ -60,14 +60,14 @@
     - label: "writes the OnOffTransitionTime attribute on the DUT"
       PICS: LVL.S.A0010
       command: "writeAttribute"
-      attribute: "on off transition time"
+      attribute: "OnOffTransitionTime"
       arguments:
           value: OnOffTransitionTimeConfigValue
 
     - label: "Reads the OnOffTransitionTime attribute from the DUT"
       PICS: LVL.S.A0010
       command: "readAttribute"
-      attribute: "on off transition time"
+      attribute: "OnOffTransitionTime"
       response:
           value: OnOffTransitionTimeConfigValue
           constraints:
@@ -77,7 +77,7 @@
     - label: "Reads the OnLevel attribute from the DUT"
       PICS: LVL.S.A0011
       command: "readAttribute"
-      attribute: "on level"
+      attribute: "OnLevel"
       response:
           saveAs: OnLevelValue
           constraints:
@@ -88,14 +88,14 @@
     - label: "writes the OnLevel attribute on the DUT"
       PICS: LVL.S.A0011
       command: "writeAttribute"
-      attribute: "on level"
+      attribute: "OnLevel"
       arguments:
           value: OnLevelConfigValue
 
     - label: "Reads the OnLevel attribute from the DUT"
       PICS: LVL.S.A0011
       command: "readAttribute"
-      attribute: "on level"
+      attribute: "OnLevel"
       response:
           value: OnLevelConfigValue
           constraints:
@@ -105,7 +105,7 @@
     - label: "Reads the OnTransitionTime attribute from the DUT"
       PICS: LVL.S.A0012
       command: "readAttribute"
-      attribute: "on transition time"
+      attribute: "OnTransitionTime"
       response:
           saveAs: OnTransitionTimeValue
           constraints:
@@ -116,14 +116,14 @@
     - label: "Writes the OnTransitionTime attribute on the DUT"
       PICS: LVL.S.A0012
       command: "writeAttribute"
-      attribute: "on transition time"
+      attribute: "OnTransitionTime"
       arguments:
           value: OnTransitionTimeConfigValue
 
     - label: "Reads the OnTransitionTime attribute from the DUT"
       PICS: LVL.S.A0012
       command: "readAttribute"
-      attribute: "on transition time"
+      attribute: "OnTransitionTime"
       response:
           value: OnTransitionTimeConfigValue
           constraints:
@@ -133,7 +133,7 @@
     - label: "Reads the OffTransitionTime attribute from the DUT"
       PICS: LVL.S.A0013
       command: "readAttribute"
-      attribute: "off transition time"
+      attribute: "OffTransitionTime"
       response:
           saveAs: OffTransitionTimeValue
           constraints:
@@ -144,14 +144,14 @@
     - label: "Writes the OffTransitionTime attribute on the DUT"
       PICS: LVL.S.A0013
       command: "writeAttribute"
-      attribute: "off transition time"
+      attribute: "OffTransitionTime"
       arguments:
           value: OffTransitionTimeConfigValue
 
     - label: "Reads the OffTransitionTime attribute from the DUT"
       PICS: LVL.S.A0013
       command: "readAttribute"
-      attribute: "off transition time"
+      attribute: "OffTransitionTime"
       response:
           value: OffTransitionTimeConfigValue
           constraints:
@@ -161,7 +161,7 @@
     - label: "Reads the DefaultMoveRate attribute from the DUT"
       PICS: LVL.S.A0014
       command: "readAttribute"
-      attribute: "default move rate"
+      attribute: "DefaultMoveRate"
       response:
           saveAs: DefaultMoveRatevalue
           constraints:
@@ -172,14 +172,14 @@
     - label: "Writes the DefaultMoveRate attribute on the DUT"
       PICS: LVL.S.A0014
       command: "writeAttribute"
-      attribute: "default move rate"
+      attribute: "DefaultMoveRate"
       arguments:
           value: DefaultMoveRateConfigValue
 
     - label: "Reads the DefaultMoveRate attribute from the DUT"
       PICS: LVL.S.A0014
       command: "readAttribute"
-      attribute: "default move rate"
+      attribute: "DefaultMoveRate"
       response:
           value: DefaultMoveRateConfigValue
           constraints:
@@ -189,7 +189,7 @@
     - label: "Reads the StartUpCurrentLevel attribute from the DUT"
       PICS: LVL.S.A4000
       command: "readAttribute"
-      attribute: "start up current level"
+      attribute: "StartUpCurrentLevel"
       response:
           saveAs: StartUpCurrentLevelValue
           constraints:
@@ -200,14 +200,14 @@
     - label: "writes the StartUpCurrentLevel attribute on the DUT"
       PICS: LVL.S.A4000
       command: "writeAttribute"
-      attribute: "start up current level"
+      attribute: "StartUpCurrentLevel"
       arguments:
           value: StartUpCurrentLevelConfigValue
 
     - label: "reads the StartUpCurrentLevel attribute from the DUT"
       PICS: LVL.S.A4000
       command: "readAttribute"
-      attribute: "start up current level"
+      attribute: "StartUpCurrentLevel"
       response:
           value: StartUpCurrentLevelConfigValue
           constraints:
@@ -218,6 +218,6 @@
     - label: "writes back default value of OnOffTransitionTime attribute"
       PICS: LVL.S.A0010
       command: "writeAttribute"
-      attribute: "on off transition time"
+      attribute: "OnOffTransitionTime"
       arguments:
           value: 0
diff --git a/src/app/tests/suites/certification/Test_TC_LVL_3_1.yaml b/src/app/tests/suites/certification/Test_TC_LVL_3_1.yaml
index 9917d05..d2447c8 100644
--- a/src/app/tests/suites/certification/Test_TC_LVL_3_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_LVL_3_1.yaml
@@ -51,7 +51,7 @@
     - label: "Reads the MinLevel attribute"
       PICS: LVL.S.A0002
       command: "readAttribute"
-      attribute: "min level"
+      attribute: "MinLevel"
       response:
           constraints:
               type: int8u
@@ -61,7 +61,7 @@
     - label: "Reads the MaxLevel attribute"
       PICS: LVL.S.A0003
       command: "readAttribute"
-      attribute: "max level"
+      attribute: "MaxLevel"
       response:
           constraints:
               type: int8u
@@ -93,7 +93,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C04.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 64
 
@@ -122,7 +122,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 100
 
@@ -151,21 +151,20 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 128
 
     - label: "Reads the OnOffTransitionTime attribute from the DUT"
       PICS: LVL.S.A0010
       command: "readAttribute"
-      attribute: "on off transition time"
+      attribute: "OnOffTransitionTime"
       response:
           constraints:
               type: int16u
               minValue: 0
               maxValue: 65535
 
-    # Null is not supported here 0xFFFF is considerd as Null
     - label: "sends a Move to level command"
       PICS: LVL.S.C00.Rsp && LVL.S.A0010
       command: "MoveToLevel"
@@ -174,7 +173,7 @@
               - name: "level"
                 value: 64
               - name: "transitionTime"
-                value: 0xFFFF
+                value: null
               - name: "OptionsMask"
                 value: 0
               - name: "OptionsOverride"
@@ -191,7 +190,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0010 && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 64
 
@@ -239,7 +238,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 100
 
@@ -273,7 +272,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 100
 
@@ -302,7 +301,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 100
 
@@ -331,7 +330,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 160
 
@@ -379,7 +378,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 100
 
@@ -413,7 +412,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 120
 
@@ -442,7 +441,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 120
 
@@ -471,7 +470,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C00.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 160
 
diff --git a/src/app/tests/suites/certification/Test_TC_LVL_4_1.yaml b/src/app/tests/suites/certification/Test_TC_LVL_4_1.yaml
index f03caa2..3e2b090 100644
--- a/src/app/tests/suites/certification/Test_TC_LVL_4_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_LVL_4_1.yaml
@@ -51,9 +51,9 @@
     - label: "Reads Minlevel attribute from DUT"
       PICS: LVL.S.A0002
       command: "readAttribute"
-      attribute: "min level"
+      attribute: "MinLevel"
       response:
-          saveAs: MinlevelValue
+          saveAs: MinimumLevelValue
           constraints:
               type: int8u
               minValue: 0
@@ -73,12 +73,12 @@
               - name: "OptionsOverride"
                 value: 1
 
-    - label: "reads max level attribute from DUT"
+    - label: "reads MaxLevel attribute from DUT"
       PICS: LVL.S.A0003
       command: "readAttribute"
-      attribute: "max level"
+      attribute: "MaxLevel"
       response:
-          saveAs: MaxlevelValue
+          saveAs: MaximumLevelValue
           constraints:
               type: int8u
               minValue: 0
@@ -123,9 +123,12 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C01.Rsp && LVL.S.A0000 && LVL.S.A0003
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
-          value: MaxlevelValue
+          value: MaximumLevelValue
+          constraints:
+              minValue: 0
+              maxValue: 255
 
     - label: "sends a Move command"
       PICS: LVL.S.C05.Rsp
@@ -166,17 +169,17 @@
     - label: "reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C05.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
-          value: MinlevelValue
+          value: MinimumLevelValue
           constraints:
               minValue: 0
               maxValue: 255
 
-    - label: "reads default move rate attribute from DUT"
+    - label: "reads DefaultMoveRate attribute from DUT"
       PICS: LVL.S.A0014
       command: "readAttribute"
-      attribute: "default move rate"
+      attribute: "DefaultMoveRate"
       response:
           saveAs: DefaultMoveRateValue
           constraints:
@@ -184,7 +187,7 @@
               minValue: 0
               maxValue: 255
 
-    - label: "sends a Move up command at default move rate"
+    - label: "sends a Move up command at DefaultMoveRate"
       PICS: LVL.S.C05.Rsp && LVL.S.A0014
       command: "Move"
       arguments:
@@ -192,7 +195,7 @@
               - name: "moveMode"
                 value: 0
               - name: "rate"
-                value: 255
+                value: null
               - name: "OptionsMask"
                 value: 1
               - name: "OptionsOverride"
diff --git a/src/app/tests/suites/certification/Test_TC_LVL_5_1.yaml b/src/app/tests/suites/certification/Test_TC_LVL_5_1.yaml
index 600b487..e39fe03 100644
--- a/src/app/tests/suites/certification/Test_TC_LVL_5_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_LVL_5_1.yaml
@@ -51,7 +51,7 @@
     - label: "Reads Minlevel attribute from DUT"
       PICS: LVL.S.A0002
       command: "readAttribute"
-      attribute: "min level"
+      attribute: "MinLevel"
       response:
           saveAs: MinlevelValue
           constraints:
@@ -87,10 +87,10 @@
               - name: "OptionsOverride"
                 value: 0
 
-    - label: "Reads current level attribute from DUT"
+    - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.A0000 && LVL.S.C04.Rsp
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: MinlevelValue + 1
           saveAs: CurrentlevelValue
@@ -99,10 +99,10 @@
               minValue: 0
               maxValue: 254
 
-    - label: "Reads current level attribute from DUT"
+    - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.A0000 && !LVL.S.A0002 && LVL.S.C04.Rsp
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 2
           constraints:
@@ -150,19 +150,19 @@
               - name: "ms"
                 value: 2500
 
-    - label: "Reads current level attribute from DUT"
+    - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.A0000 && LVL.S.C02.Rsp && LVL.S.M.VarRate
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 66
           constraints:
               type: int8u
 
-    - label: "Reads current level attribute from DUT"
+    - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.A0000 && LVL.S.C02.Rsp && !LVL.S.M.VarRate
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 66
           constraints:
@@ -208,31 +208,31 @@
               - name: "ms"
                 value: 2500
 
-    - label: "Reads current level attribute from DUT"
+    - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C06.Rsp && LVL.S.A0000 && LVL.S.M.VarRate
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: CurrentlevelValue
 
-    - label: "Reads current level attribute from DUT"
+    - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C06.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: CurrentlevelValue
 
-    - label: "Reads current level attribute from DUT"
+    - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C06.Rsp && LVL.S.A0000 && !LVL.S.A0002 && LVL.S.M.VarRate
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 2
 
-    - label: "Reads current level attribute from DUT"
+    - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C06.Rsp && LVL.S.A0000 && !LVL.S.A0002 && !LVL.S.M.VarRate
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           value: 2
 
diff --git a/src/app/tests/suites/certification/Test_TC_LVL_6_1.yaml b/src/app/tests/suites/certification/Test_TC_LVL_6_1.yaml
index f68f33e..8273608 100644
--- a/src/app/tests/suites/certification/Test_TC_LVL_6_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_LVL_6_1.yaml
@@ -51,7 +51,7 @@
     - label: "Reads Minlevel attribute from DUT"
       PICS: LVL.S.A0002
       command: "readAttribute"
-      attribute: "min level"
+      attribute: "MinLevel"
       response:
           saveAs: MinlevelValue
           constraints:
@@ -76,7 +76,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.A0000 && LVL.S.C04.Rsp
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           saveAs: CurrentLevelValue
           constraints:
@@ -129,7 +129,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C01.Rsp && LVL.S.C03.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           constraints:
               minValue: 21
@@ -182,7 +182,7 @@
     - label: "Reads CurrentLevel attribute from DUT"
       PICS: LVL.S.C01.Rsp && LVL.S.C07.Rsp && LVL.S.A0000
       command: "readAttribute"
-      attribute: "current level"
+      attribute: "CurrentLevel"
       response:
           constraints:
               minValue: 43
diff --git a/src/app/tests/suites/certification/Test_TC_LVL_7_1.yaml b/src/app/tests/suites/certification/Test_TC_LVL_7_1.yaml
index 96fcf15..363764d 100644
--- a/src/app/tests/suites/certification/Test_TC_LVL_7_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_LVL_7_1.yaml
@@ -31,7 +31,7 @@
            ./chip-tool levelcontrol read min-level 1 1
 
           [1654065563.003862][10039:10044] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0008 Attribute 0x0000_0002 DataVersion: 540248549
-          [1654065563.003916][10039:10044] CHIP:TOO:   min level: 0
+          [1654065563.003916][10039:10044] CHIP:TOO:   MinLevel: 0
           [1654065563.003992][10039:10044] CHIP:EM: Sending Standalone Ack for MessageCounter:10228121 on exchange 38337i
       disabled: true
 
@@ -44,7 +44,7 @@
 
 
           [1654065684.869569][10048:10053] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0008 Attribute 0x0000_0003 DataVersion: 540248549
-          [1654065684.869621][10048:10053] CHIP:TOO:   max level: 254
+          [1654065684.869621][10048:10053] CHIP:TOO:   MaxLevel: 254
           [1654065684.869737][10048:10053] CHIP:EM: Sending Standalone Ack for MessageCounter:9018536 on exchange 12814i
       disabled: true
 
@@ -99,7 +99,7 @@
           ./chip-tool levelcontrol read current-level 1 1
 
           [1654065859.401140][10188:10193] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0008 Attribute 0x0000_0000 DataVersion: 540248551
-          [1654065859.401197][10188:10193] CHIP:TOO:   current level: 253
+          [1654065859.401197][10188:10193] CHIP:TOO:   CurrentLevel: 253
           [1654065859.401268][10188:10193] CHIP:EM: Sending Standalone Ack for MessageCounter:2942065 on exchange 21982i
       disabled: true
 
diff --git a/src/app/zap-templates/zcl/data-model/silabs/general.xml b/src/app/zap-templates/zcl/data-model/silabs/general.xml
index aa19355..85049e7 100644
--- a/src/app/zap-templates/zcl/data-model/silabs/general.xml
+++ b/src/app/zap-templates/zcl/data-model/silabs/general.xml
@@ -191,22 +191,22 @@
     <client tick="false" init="false">true</client>
     <server tick="false" init="false">true</server>
     <globalAttribute side="either" code="0xFFFD" value="5"/>
-    <attribute side="server" code="0x0000" define="CURRENT_LEVEL" type="INT8U" min="0x00" max="0xFF" writable="false" reportable="true" default="0x00" optional="false">current level</attribute>
-    <attribute side="server" code="0x0001" define="LEVEL_CONTROL_REMAINING_TIME" type="INT16U" min="0x0000" max="0xFFFF" writable="false" default="0x0000" optional="true">remaining time</attribute>
-    <attribute side="server" code="0x0002" define="MINIMUM_LEVEL" type="INT8U" min="0x00" max="0xFF" writable="false" default="0x00" optional="true">min level</attribute>
-    <attribute side="server" code="0x0003" define="MAXIMUM_LEVEL" type="INT8U" min="0x00" max="0xFF" writable="false" default="0xFE" optional="true">max level</attribute>
-    <attribute side="server" code="0x0004" define="CURRENT_FREQUENCY" type="INT16U" min="0x0000" max="0xFFFF" writable="false" default="0x0000" optional="true">current frequency</attribute>
-    <attribute side="server" code="0x0005" define="MIN_FREQUENCY" type="INT16U" min="0x0000" max="0xFFFF" writable="false" default="0x0000" optional="true">min frequency</attribute>
-    <attribute side="server" code="0x0006" define="MAX_FREQUENCY" type="INT16U" min="0x0000" max="0xFFFF" writable="false" default="0x0000" optional="true">max frequency</attribute>
+    <attribute side="server" code="0x0000" define="CURRENT_LEVEL"                 type="INT8U"  isNullable="true"           writable="false" default="0x00"   optional="false">CurrentLevel</attribute>
+    <attribute side="server" code="0x0001" define="LEVEL_CONTROL_REMAINING_TIME"  type="INT16U" min="0x0000"  max="0xFFFF"  writable="false" default="0x0000" optional="true">RemainingTime</attribute>
+    <attribute side="server" code="0x0002" define="MINIMUM_LEVEL"                 type="INT8U"  min="0x00"    max="0xFF"    writable="false" default="0x00"   optional="true">MinLevel</attribute>
+    <attribute side="server" code="0x0003" define="MAXIMUM_LEVEL"                 type="INT8U"  min="0x00"    max="0xFF"    writable="false" default="0xFE"   optional="true">MaxLevel</attribute>
+    <attribute side="server" code="0x0004" define="CURRENT_FREQUENCY"             type="INT16U" min="0x0000"  max="0xFFFF"  writable="false" default="0x0000" optional="true">CurrentFrequency</attribute>
+    <attribute side="server" code="0x0005" define="MIN_FREQUENCY"                 type="INT16U" min="0x0000"  max="0xFFFF"  writable="false" default="0x0000" optional="true">MinFrequency</attribute>
+    <attribute side="server" code="0x0006" define="MAX_FREQUENCY"                 type="INT16U" min="0x0000"  max="0xFFFF"  writable="false" default="0x0000" optional="true">MaxFrequency</attribute>
     
-    <attribute side="server" code="0x0010" define="ON_OFF_TRANSITION_TIME" type="INT16U" writable="true" default="0x0000" optional="true">on off transition time</attribute>
-    <attribute side="server" code="0x0011" define="ON_LEVEL" type="INT8U" isNullable="true" writable="true" optional="false">on level</attribute>
-    <attribute side="server" code="0x0012" define="ON_TRANSITION_TIME" type="INT16U" isNullable="true" writable="true" optional="true" introducedIn="ha-1.2-05-3520-29">on transition time</attribute>
-    <attribute side="server" code="0x0013" define="OFF_TRANSITION_TIME" type="INT16U" isNullable="true" writable="true" optional="true" introducedIn="ha-1.2-05-3520-29">off transition time</attribute>
-    <attribute side="server" code="0x0014" define="DEFAULT_MOVE_RATE" type="INT8U" isNullable="true" writable="true" optional="true" introducedIn="ha-1.2-05-3520-29">default move rate</attribute>
-    <attribute side="server" code="0x000F" define="OPTIONS" type="BITMAP8" min="0x00" max="0x03" writable="true" default="0x00" optional="false" introducedIn="l&amp;o-1.0-15-0014-04">options</attribute>
-    <attribute side="server" code="0x4000" define="START_UP_CURRENT_LEVEL" type="INT8U" isNullable="true" writable="true" optional="true" introducedIn="l&amp;o-1.0-15-0014-04">
-      <description>start up current level</description>
+    <attribute side="server" code="0x0010" define="ON_OFF_TRANSITION_TIME"        type="INT16U"                             writable="true"  default="0x0000" optional="true">OnOffTransitionTime</attribute>
+    <attribute side="server" code="0x0011" define="ON_LEVEL"                      type="INT8U"    isNullable="true"         writable="true"                   optional="false">OnLevel</attribute>
+    <attribute side="server" code="0x0012" define="ON_TRANSITION_TIME"            type="INT16U"   isNullable="true"         writable="true"                   optional="true">OnTransitionTime</attribute>
+    <attribute side="server" code="0x0013" define="OFF_TRANSITION_TIME"           type="INT16U"   isNullable="true"         writable="true"                   optional="true">OffTransitionTime</attribute>
+    <attribute side="server" code="0x0014" define="DEFAULT_MOVE_RATE"             type="INT8U"    isNullable="true"         writable="true"                   optional="true">DefaultMoveRate</attribute>
+    <attribute side="server" code="0x000F" define="OPTIONS"                       type="BITMAP8"  min="0x00" max="0x03"     writable="true"  default="0x00"   optional="false">Options</attribute>
+    <attribute side="server" code="0x4000" define="START_UP_CURRENT_LEVEL"        type="INT8U"    isNullable="true"         writable="true"                   optional="true">
+      <description>StartUpCurrentLevel</description>
       <access op="read" role="view"/>
       <access op="write" role="manage"/>
     </attribute>
@@ -214,17 +214,17 @@
       <description>
         Command description for MoveToLevel
       </description>
-      <arg name="level" type="INT8U"/>
-      <arg name="transitionTime" type="INT16U"/>
-      <arg name="OptionsMask" type="BITMAP8"/>
+      <arg name="Level"           type="INT8U"/>
+      <arg name="TransitionTime"  type="INT16U" isNullable="true"/>
+      <arg name="OptionsMask"     type="BITMAP8"/>
       <arg name="OptionsOverride" type="BITMAP8"/>
     </command>
     <command source="client" code="0x01" name="Move" optional="false" cli="zcl level-control move">
       <description>
         Command description for Move
       </description>
-      <arg name="moveMode" type="MoveMode"/>
-      <arg name="rate" type="INT8U"/>
+      <arg name="MoveMode" type="MoveMode"/>
+      <arg name="Rate" type="INT8U" isNullable="true"/>
       <arg name="OptionsMask" type="BITMAP8"/>
       <arg name="OptionsOverride" type="BITMAP8"/>
     </command>
@@ -232,9 +232,9 @@
       <description>
         Command description for Step
       </description>
-      <arg name="stepMode" type="StepMode"/>
-      <arg name="stepSize" type="INT8U"/>
-      <arg name="transitionTime" type="INT16U"/>
+      <arg name="StepMode" type="StepMode"/>
+      <arg name="StepSize" type="INT8U"/>
+      <arg name="TransitionTime" type="INT16U" isNullable="true"/>
       <arg name="OptionsMask" type="BITMAP8"/>
       <arg name="OptionsOverride" type="BITMAP8"/>
     </command>
@@ -249,17 +249,17 @@
       <description>
         Command description for MoveToLevelWithOnOff
       </description>
-      <arg name="level" type="INT8U"/>
-      <arg name="transitionTime" type="INT16U"/>
-      <arg name="OptionsMask" type="BITMAP8"/>
+      <arg name="Level"           type="INT8U"/>
+      <arg name="TransitionTime"  type="INT16U" isNullable="true"/>
+      <arg name="OptionsMask"     type="BITMAP8"/>
       <arg name="OptionsOverride" type="BITMAP8"/>
     </command>
     <command source="client" code="0x05" name="MoveWithOnOff" optional="false" cli="zcl level-control o-move">
       <description>
         Command description for MoveWithOnOff
       </description>
-      <arg name="moveMode" type="MoveMode"/>
-      <arg name="rate" type="INT8U"/>
+      <arg name="MoveMode" type="MoveMode"/>
+      <arg name="Rate" type="INT8U" isNullable="true"/>
       <arg name="OptionsMask" type="BITMAP8"/>
       <arg name="OptionsOverride" type="BITMAP8"/>
     </command>
@@ -267,9 +267,9 @@
       <description>
         Command description for StepWithOnOff
       </description>
-      <arg name="stepMode" type="StepMode"/>
-      <arg name="stepSize" type="INT8U"/>
-      <arg name="transitionTime" type="INT16U"/>
+      <arg name="StepMode" type="StepMode"/>
+      <arg name="StepSize" type="INT8U"/>
+      <arg name="TransitionTime" type="INT16U" isNullable="true"/>
       <arg name="OptionsMask" type="BITMAP8"/>
       <arg name="OptionsOverride" type="BITMAP8"/>
     </command>
@@ -285,7 +285,7 @@
         Change the currrent frequency to the provided one, or a close
         approximation if the exact provided one is not possible.
       </description>
-      <arg name="Frequency" type="int16u"/>
+      <arg name="Frequency" type="INT16U"/>
     </command>
   </cluster>
   <cluster>
diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter
index 9c71252..eee66f2 100644
--- a/src/controller/data_model/controller-clusters.matter
+++ b/src/controller/data_model/controller-clusters.matter
@@ -315,7 +315,7 @@
     kFrequency = 0x4;
   }
 
-  readonly attribute int8u currentLevel = 0;
+  readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -337,14 +337,14 @@
 
   request struct MoveToLevelRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -352,7 +352,7 @@
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
@@ -364,14 +364,14 @@
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
-    INT16U transitionTime = 1;
+    nullable INT16U transitionTime = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
-    INT8U rate = 1;
+    nullable INT8U rate = 1;
     BITMAP8 optionsMask = 2;
     BITMAP8 optionsOverride = 3;
   }
@@ -379,7 +379,7 @@
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
-    INT16U transitionTime = 2;
+    nullable INT16U transitionTime = 2;
     BITMAP8 optionsMask = 3;
     BITMAP8 optionsOverride = 4;
   }
diff --git a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
index 3936870..826d7f3 100644
--- a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
+++ b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
@@ -842,10 +842,17 @@
                 return nullptr;
             }
             jobject value;
-            std::string valueClassName     = "java/lang/Integer";
-            std::string valueCtorSignature = "(I)V";
-            chip::JniReferences::GetInstance().CreateBoxedObject<uint8_t>(valueClassName.c_str(), valueCtorSignature.c_str(),
-                                                                          cppValue, value);
+            if (cppValue.IsNull())
+            {
+                value = nullptr;
+            }
+            else
+            {
+                std::string valueClassName     = "java/lang/Integer";
+                std::string valueCtorSignature = "(I)V";
+                chip::JniReferences::GetInstance().CreateBoxedObject<uint8_t>(valueClassName.c_str(), valueCtorSignature.c_str(),
+                                                                              cppValue.Value(), value);
+            }
             return value;
         }
         case Attributes::RemainingTime::Id: {
diff --git a/src/controller/java/zap-generated/CHIPReadCallbacks.cpp b/src/controller/java/zap-generated/CHIPReadCallbacks.cpp
index f961ba0..0e12319 100644
--- a/src/controller/java/zap-generated/CHIPReadCallbacks.cpp
+++ b/src/controller/java/zap-generated/CHIPReadCallbacks.cpp
@@ -1851,6 +1851,71 @@
     env->CallVoidMethod(javaCallbackRef, javaMethod, arrayListObj);
 }
 
+CHIPLevelControlCurrentLevelAttributeCallback::CHIPLevelControlCurrentLevelAttributeCallback(jobject javaCallback, bool keepAlive) :
+    chip::Callback::Callback<CHIPLevelControlClusterCurrentLevelAttributeCallbackType>(CallbackFn, this), keepAlive(keepAlive)
+{
+    JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread();
+    if (env == nullptr)
+    {
+        ChipLogError(Zcl, "Could not create global reference for Java callback");
+        return;
+    }
+
+    javaCallbackRef = env->NewGlobalRef(javaCallback);
+    if (javaCallbackRef == nullptr)
+    {
+        ChipLogError(Zcl, "Could not create global reference for Java callback");
+    }
+}
+
+CHIPLevelControlCurrentLevelAttributeCallback::~CHIPLevelControlCurrentLevelAttributeCallback()
+{
+    JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread();
+    if (env == nullptr)
+    {
+        ChipLogError(Zcl, "Could not delete global reference for Java callback");
+        return;
+    }
+    env->DeleteGlobalRef(javaCallbackRef);
+}
+
+void CHIPLevelControlCurrentLevelAttributeCallback::CallbackFn(void * context,
+                                                               const chip::app::DataModel::Nullable<uint8_t> & value)
+{
+    chip::DeviceLayer::StackUnlock unlock;
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    JNIEnv * env   = chip::JniReferences::GetInstance().GetEnvForCurrentThread();
+    jobject javaCallbackRef;
+
+    VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Could not get JNI env"));
+    std::unique_ptr<CHIPLevelControlCurrentLevelAttributeCallback, decltype(&maybeDestroy)> cppCallback(
+        reinterpret_cast<CHIPLevelControlCurrentLevelAttributeCallback *>(context), maybeDestroy);
+
+    // It's valid for javaCallbackRef to be nullptr if the Java code passed in a null callback.
+    javaCallbackRef = cppCallback.get()->javaCallbackRef;
+    VerifyOrReturn(javaCallbackRef != nullptr,
+                   ChipLogProgress(Zcl, "Early return from attribute callback since Java callback is null"));
+
+    jmethodID javaMethod;
+    err = chip::JniReferences::GetInstance().FindMethod(env, javaCallbackRef, "onSuccess", "(Ljava/lang/Integer;)V", &javaMethod);
+    VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Zcl, "Could not find onSuccess() method"));
+
+    jobject javaValue;
+    if (value.IsNull())
+    {
+        javaValue = nullptr;
+    }
+    else
+    {
+        std::string javaValueClassName     = "java/lang/Integer";
+        std::string javaValueCtorSignature = "(I)V";
+        chip::JniReferences::GetInstance().CreateBoxedObject<uint8_t>(javaValueClassName.c_str(), javaValueCtorSignature.c_str(),
+                                                                      value.Value(), javaValue);
+    }
+
+    env->CallVoidMethod(javaCallbackRef, javaMethod, javaValue);
+}
+
 CHIPLevelControlOnLevelAttributeCallback::CHIPLevelControlOnLevelAttributeCallback(jobject javaCallback, bool keepAlive) :
     chip::Callback::Callback<CHIPLevelControlClusterOnLevelAttributeCallbackType>(CallbackFn, this), keepAlive(keepAlive)
 {
diff --git a/src/controller/java/zap-generated/CHIPReadCallbacks.h b/src/controller/java/zap-generated/CHIPReadCallbacks.h
index e42488c..f4c48ca 100644
--- a/src/controller/java/zap-generated/CHIPReadCallbacks.h
+++ b/src/controller/java/zap-generated/CHIPReadCallbacks.h
@@ -897,6 +897,36 @@
     bool keepAlive;
 };
 
+class CHIPLevelControlCurrentLevelAttributeCallback
+    : public chip::Callback::Callback<CHIPLevelControlClusterCurrentLevelAttributeCallbackType>
+{
+public:
+    CHIPLevelControlCurrentLevelAttributeCallback(jobject javaCallback, bool keepAlive = false);
+
+    ~CHIPLevelControlCurrentLevelAttributeCallback();
+
+    static void maybeDestroy(CHIPLevelControlCurrentLevelAttributeCallback * callback)
+    {
+        if (!callback->keepAlive)
+        {
+            callback->Cancel();
+            chip::Platform::Delete<CHIPLevelControlCurrentLevelAttributeCallback>(callback);
+        }
+    }
+
+    static void CallbackFn(void * context, const chip::app::DataModel::Nullable<uint8_t> & value);
+    static void OnSubscriptionEstablished(void * context)
+    {
+        CHIP_ERROR err = chip::JniReferences::GetInstance().CallSubscriptionEstablished(
+            reinterpret_cast<CHIPLevelControlCurrentLevelAttributeCallback *>(context)->javaCallbackRef);
+        VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Zcl, "Error calling onSubscriptionEstablished: %s", ErrorStr(err)));
+    };
+
+private:
+    jobject javaCallbackRef;
+    bool keepAlive;
+};
+
 class CHIPLevelControlOnLevelAttributeCallback
     : public chip::Callback::Callback<CHIPLevelControlClusterOnLevelAttributeCallbackType>
 {
diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java b/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java
index 78c06ce..a0643ba 100644
--- a/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java
+++ b/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java
@@ -1509,7 +1509,7 @@
     public void moveToLevel(
         DefaultClusterCallback callback,
         Integer level,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride) {
       moveToLevel(
@@ -1519,7 +1519,7 @@
     public void moveToLevel(
         DefaultClusterCallback callback,
         Integer level,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride,
         int timedInvokeTimeoutMs) {
@@ -1536,7 +1536,7 @@
     public void move(
         DefaultClusterCallback callback,
         Integer moveMode,
-        Integer rate,
+        @Nullable Integer rate,
         Integer optionsMask,
         Integer optionsOverride) {
       move(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
@@ -1545,7 +1545,7 @@
     public void move(
         DefaultClusterCallback callback,
         Integer moveMode,
-        Integer rate,
+        @Nullable Integer rate,
         Integer optionsMask,
         Integer optionsOverride,
         int timedInvokeTimeoutMs) {
@@ -1563,7 +1563,7 @@
         DefaultClusterCallback callback,
         Integer stepMode,
         Integer stepSize,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride) {
       step(
@@ -1581,7 +1581,7 @@
         DefaultClusterCallback callback,
         Integer stepMode,
         Integer stepSize,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride,
         int timedInvokeTimeoutMs) {
@@ -1612,7 +1612,7 @@
     public void moveToLevelWithOnOff(
         DefaultClusterCallback callback,
         Integer level,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride) {
       moveToLevelWithOnOff(
@@ -1622,7 +1622,7 @@
     public void moveToLevelWithOnOff(
         DefaultClusterCallback callback,
         Integer level,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride,
         int timedInvokeTimeoutMs) {
@@ -1639,7 +1639,7 @@
     public void moveWithOnOff(
         DefaultClusterCallback callback,
         Integer moveMode,
-        Integer rate,
+        @Nullable Integer rate,
         Integer optionsMask,
         Integer optionsOverride) {
       moveWithOnOff(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
@@ -1648,7 +1648,7 @@
     public void moveWithOnOff(
         DefaultClusterCallback callback,
         Integer moveMode,
-        Integer rate,
+        @Nullable Integer rate,
         Integer optionsMask,
         Integer optionsOverride,
         int timedInvokeTimeoutMs) {
@@ -1666,7 +1666,7 @@
         DefaultClusterCallback callback,
         Integer stepMode,
         Integer stepSize,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride) {
       stepWithOnOff(
@@ -1684,7 +1684,7 @@
         DefaultClusterCallback callback,
         Integer stepMode,
         Integer stepSize,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride,
         int timedInvokeTimeoutMs) {
@@ -1716,7 +1716,7 @@
         long chipClusterPtr,
         DefaultClusterCallback Callback,
         Integer level,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride,
         @Nullable Integer timedInvokeTimeoutMs);
@@ -1725,7 +1725,7 @@
         long chipClusterPtr,
         DefaultClusterCallback Callback,
         Integer moveMode,
-        Integer rate,
+        @Nullable Integer rate,
         Integer optionsMask,
         Integer optionsOverride,
         @Nullable Integer timedInvokeTimeoutMs);
@@ -1735,7 +1735,7 @@
         DefaultClusterCallback Callback,
         Integer stepMode,
         Integer stepSize,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride,
         @Nullable Integer timedInvokeTimeoutMs);
@@ -1751,7 +1751,7 @@
         long chipClusterPtr,
         DefaultClusterCallback Callback,
         Integer level,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride,
         @Nullable Integer timedInvokeTimeoutMs);
@@ -1760,7 +1760,7 @@
         long chipClusterPtr,
         DefaultClusterCallback Callback,
         Integer moveMode,
-        Integer rate,
+        @Nullable Integer rate,
         Integer optionsMask,
         Integer optionsOverride,
         @Nullable Integer timedInvokeTimeoutMs);
@@ -1770,7 +1770,7 @@
         DefaultClusterCallback Callback,
         Integer stepMode,
         Integer stepSize,
-        Integer transitionTime,
+        @Nullable Integer transitionTime,
         Integer optionsMask,
         Integer optionsOverride,
         @Nullable Integer timedInvokeTimeoutMs);
@@ -1782,6 +1782,14 @@
         Integer optionsOverride,
         @Nullable Integer timedInvokeTimeoutMs);
 
+    public interface CurrentLevelAttributeCallback {
+      void onSuccess(@Nullable Integer value);
+
+      void onError(Exception ex);
+
+      default void onSubscriptionEstablished() {}
+    }
+
     public interface OnLevelAttributeCallback {
       void onSuccess(@Nullable Integer value);
 
@@ -1846,12 +1854,12 @@
       default void onSubscriptionEstablished() {}
     }
 
-    public void readCurrentLevelAttribute(IntegerAttributeCallback callback) {
+    public void readCurrentLevelAttribute(CurrentLevelAttributeCallback callback) {
       readCurrentLevelAttribute(chipClusterPtr, callback);
     }
 
     public void subscribeCurrentLevelAttribute(
-        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
+        CurrentLevelAttributeCallback callback, int minInterval, int maxInterval) {
       subscribeCurrentLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
     }
 
@@ -2081,10 +2089,13 @@
     }
 
     private native void readCurrentLevelAttribute(
-        long chipClusterPtr, IntegerAttributeCallback callback);
+        long chipClusterPtr, CurrentLevelAttributeCallback callback);
 
     private native void subscribeCurrentLevelAttribute(
-        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
+        long chipClusterPtr,
+        CurrentLevelAttributeCallback callback,
+        int minInterval,
+        int maxInterval);
 
     private native void readRemainingTimeAttribute(
         long chipClusterPtr, IntegerAttributeCallback callback);
diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ClusterReadMapping.java b/src/controller/java/zap-generated/chip/devicecontroller/ClusterReadMapping.java
index fb45642..469216c 100644
--- a/src/controller/java/zap-generated/chip/devicecontroller/ClusterReadMapping.java
+++ b/src/controller/java/zap-generated/chip/devicecontroller/ClusterReadMapping.java
@@ -577,7 +577,8 @@
         new InteractionInfo(
             (cluster, callback, commandArguments) -> {
               ((ChipClusters.LevelControlCluster) cluster)
-                  .readCurrentLevelAttribute((ChipClusters.IntegerAttributeCallback) callback);
+                  .readCurrentLevelAttribute(
+                      (ChipClusters.LevelControlCluster.CurrentLevelAttributeCallback) callback);
             },
             () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
             readLevelControlCurrentLevelCommandParams);
diff --git a/src/controller/python/chip/clusters/Objects.py b/src/controller/python/chip/clusters/Objects.py
index 54c5651..e1830f2 100644
--- a/src/controller/python/chip/clusters/Objects.py
+++ b/src/controller/python/chip/clusters/Objects.py
@@ -1584,7 +1584,7 @@
     def descriptor(cls) -> ClusterObjectDescriptor:
         return ClusterObjectDescriptor(
             Fields = [
-                ClusterObjectFieldDescriptor(Label="currentLevel", Tag=0x00000000, Type=uint),
+                ClusterObjectFieldDescriptor(Label="currentLevel", Tag=0x00000000, Type=typing.Union[Nullable, uint]),
                 ClusterObjectFieldDescriptor(Label="remainingTime", Tag=0x00000001, Type=typing.Optional[uint]),
                 ClusterObjectFieldDescriptor(Label="minLevel", Tag=0x00000002, Type=typing.Optional[uint]),
                 ClusterObjectFieldDescriptor(Label="maxLevel", Tag=0x00000003, Type=typing.Optional[uint]),
@@ -1605,7 +1605,7 @@
                 ClusterObjectFieldDescriptor(Label="clusterRevision", Tag=0x0000FFFD, Type=uint),
             ])
 
-    currentLevel: 'uint' = None
+    currentLevel: 'typing.Union[Nullable, uint]' = None
     remainingTime: 'typing.Optional[uint]' = None
     minLevel: 'typing.Optional[uint]' = None
     maxLevel: 'typing.Optional[uint]' = None
@@ -1648,13 +1648,13 @@
                 return ClusterObjectDescriptor(
                     Fields = [
                             ClusterObjectFieldDescriptor(Label="level", Tag=0, Type=uint),
-                            ClusterObjectFieldDescriptor(Label="transitionTime", Tag=1, Type=uint),
+                            ClusterObjectFieldDescriptor(Label="transitionTime", Tag=1, Type=typing.Union[Nullable, uint]),
                             ClusterObjectFieldDescriptor(Label="optionsMask", Tag=2, Type=uint),
                             ClusterObjectFieldDescriptor(Label="optionsOverride", Tag=3, Type=uint),
                     ])
 
             level: 'uint' = 0
-            transitionTime: 'uint' = 0
+            transitionTime: 'typing.Union[Nullable, uint]' = NullValue
             optionsMask: 'uint' = 0
             optionsOverride: 'uint' = 0
 
@@ -1669,13 +1669,13 @@
                 return ClusterObjectDescriptor(
                     Fields = [
                             ClusterObjectFieldDescriptor(Label="moveMode", Tag=0, Type=LevelControl.Enums.MoveMode),
-                            ClusterObjectFieldDescriptor(Label="rate", Tag=1, Type=uint),
+                            ClusterObjectFieldDescriptor(Label="rate", Tag=1, Type=typing.Union[Nullable, uint]),
                             ClusterObjectFieldDescriptor(Label="optionsMask", Tag=2, Type=uint),
                             ClusterObjectFieldDescriptor(Label="optionsOverride", Tag=3, Type=uint),
                     ])
 
             moveMode: 'LevelControl.Enums.MoveMode' = 0
-            rate: 'uint' = 0
+            rate: 'typing.Union[Nullable, uint]' = NullValue
             optionsMask: 'uint' = 0
             optionsOverride: 'uint' = 0
 
@@ -1691,14 +1691,14 @@
                     Fields = [
                             ClusterObjectFieldDescriptor(Label="stepMode", Tag=0, Type=LevelControl.Enums.StepMode),
                             ClusterObjectFieldDescriptor(Label="stepSize", Tag=1, Type=uint),
-                            ClusterObjectFieldDescriptor(Label="transitionTime", Tag=2, Type=uint),
+                            ClusterObjectFieldDescriptor(Label="transitionTime", Tag=2, Type=typing.Union[Nullable, uint]),
                             ClusterObjectFieldDescriptor(Label="optionsMask", Tag=3, Type=uint),
                             ClusterObjectFieldDescriptor(Label="optionsOverride", Tag=4, Type=uint),
                     ])
 
             stepMode: 'LevelControl.Enums.StepMode' = 0
             stepSize: 'uint' = 0
-            transitionTime: 'uint' = 0
+            transitionTime: 'typing.Union[Nullable, uint]' = NullValue
             optionsMask: 'uint' = 0
             optionsOverride: 'uint' = 0
 
@@ -1730,13 +1730,13 @@
                 return ClusterObjectDescriptor(
                     Fields = [
                             ClusterObjectFieldDescriptor(Label="level", Tag=0, Type=uint),
-                            ClusterObjectFieldDescriptor(Label="transitionTime", Tag=1, Type=uint),
+                            ClusterObjectFieldDescriptor(Label="transitionTime", Tag=1, Type=typing.Union[Nullable, uint]),
                             ClusterObjectFieldDescriptor(Label="optionsMask", Tag=2, Type=uint),
                             ClusterObjectFieldDescriptor(Label="optionsOverride", Tag=3, Type=uint),
                     ])
 
             level: 'uint' = 0
-            transitionTime: 'uint' = 0
+            transitionTime: 'typing.Union[Nullable, uint]' = NullValue
             optionsMask: 'uint' = 0
             optionsOverride: 'uint' = 0
 
@@ -1751,13 +1751,13 @@
                 return ClusterObjectDescriptor(
                     Fields = [
                             ClusterObjectFieldDescriptor(Label="moveMode", Tag=0, Type=LevelControl.Enums.MoveMode),
-                            ClusterObjectFieldDescriptor(Label="rate", Tag=1, Type=uint),
+                            ClusterObjectFieldDescriptor(Label="rate", Tag=1, Type=typing.Union[Nullable, uint]),
                             ClusterObjectFieldDescriptor(Label="optionsMask", Tag=2, Type=uint),
                             ClusterObjectFieldDescriptor(Label="optionsOverride", Tag=3, Type=uint),
                     ])
 
             moveMode: 'LevelControl.Enums.MoveMode' = 0
-            rate: 'uint' = 0
+            rate: 'typing.Union[Nullable, uint]' = NullValue
             optionsMask: 'uint' = 0
             optionsOverride: 'uint' = 0
 
@@ -1773,14 +1773,14 @@
                     Fields = [
                             ClusterObjectFieldDescriptor(Label="stepMode", Tag=0, Type=LevelControl.Enums.StepMode),
                             ClusterObjectFieldDescriptor(Label="stepSize", Tag=1, Type=uint),
-                            ClusterObjectFieldDescriptor(Label="transitionTime", Tag=2, Type=uint),
+                            ClusterObjectFieldDescriptor(Label="transitionTime", Tag=2, Type=typing.Union[Nullable, uint]),
                             ClusterObjectFieldDescriptor(Label="optionsMask", Tag=3, Type=uint),
                             ClusterObjectFieldDescriptor(Label="optionsOverride", Tag=4, Type=uint),
                     ])
 
             stepMode: 'LevelControl.Enums.StepMode' = 0
             stepSize: 'uint' = 0
-            transitionTime: 'uint' = 0
+            transitionTime: 'typing.Union[Nullable, uint]' = NullValue
             optionsMask: 'uint' = 0
             optionsOverride: 'uint' = 0
 
@@ -1830,9 +1830,9 @@
 
             @ChipUtility.classproperty
             def attribute_type(cls) -> ClusterObjectFieldDescriptor:
-                return ClusterObjectFieldDescriptor(Type=uint)
+                return ClusterObjectFieldDescriptor(Type=typing.Union[Nullable, uint])
 
-            value: 'uint' = 0
+            value: 'typing.Union[Nullable, uint]' = NullValue
 
         @dataclass
         class RemainingTime(ClusterAttributeDescriptor):
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
index 2bacad5..39bc7a4 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
@@ -773,8 +773,12 @@
             if (*aError != CHIP_NO_ERROR) {
                 return nil;
             }
-            NSNumber * _Nonnull value;
-            value = [NSNumber numberWithUnsignedChar:cppValue];
+            NSNumber * _Nullable value;
+            if (cppValue.IsNull()) {
+                value = nil;
+            } else {
+                value = [NSNumber numberWithUnsignedChar:cppValue.Value()];
+            }
             return value;
         }
         case Attributes::RemainingTime::Id: {
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
index fc64b9b..cb7ca86 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
@@ -4058,7 +4058,12 @@
                 }
             }
             request.level = params.level.unsignedCharValue;
-            request.transitionTime = params.transitionTime.unsignedShortValue;
+            if (params.transitionTime == nil) {
+                request.transitionTime.SetNull();
+            } else {
+                auto & nonNullValue_0 = request.transitionTime.SetNonNull();
+                nonNullValue_0 = params.transitionTime.unsignedShortValue;
+            }
             request.optionsMask = params.optionsMask.unsignedCharValue;
             request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -4088,7 +4093,12 @@
                 }
             }
             request.moveMode = static_cast<std::remove_reference_t<decltype(request.moveMode)>>(params.moveMode.unsignedCharValue);
-            request.rate = params.rate.unsignedCharValue;
+            if (params.rate == nil) {
+                request.rate.SetNull();
+            } else {
+                auto & nonNullValue_0 = request.rate.SetNonNull();
+                nonNullValue_0 = params.rate.unsignedCharValue;
+            }
             request.optionsMask = params.optionsMask.unsignedCharValue;
             request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -4119,7 +4129,12 @@
             }
             request.stepMode = static_cast<std::remove_reference_t<decltype(request.stepMode)>>(params.stepMode.unsignedCharValue);
             request.stepSize = params.stepSize.unsignedCharValue;
-            request.transitionTime = params.transitionTime.unsignedShortValue;
+            if (params.transitionTime == nil) {
+                request.transitionTime.SetNull();
+            } else {
+                auto & nonNullValue_0 = request.transitionTime.SetNonNull();
+                nonNullValue_0 = params.transitionTime.unsignedShortValue;
+            }
             request.optionsMask = params.optionsMask.unsignedCharValue;
             request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -4178,7 +4193,12 @@
                 }
             }
             request.level = params.level.unsignedCharValue;
-            request.transitionTime = params.transitionTime.unsignedShortValue;
+            if (params.transitionTime == nil) {
+                request.transitionTime.SetNull();
+            } else {
+                auto & nonNullValue_0 = request.transitionTime.SetNonNull();
+                nonNullValue_0 = params.transitionTime.unsignedShortValue;
+            }
             request.optionsMask = params.optionsMask.unsignedCharValue;
             request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -4209,7 +4229,12 @@
                 }
             }
             request.moveMode = static_cast<std::remove_reference_t<decltype(request.moveMode)>>(params.moveMode.unsignedCharValue);
-            request.rate = params.rate.unsignedCharValue;
+            if (params.rate == nil) {
+                request.rate.SetNull();
+            } else {
+                auto & nonNullValue_0 = request.rate.SetNonNull();
+                nonNullValue_0 = params.rate.unsignedCharValue;
+            }
             request.optionsMask = params.optionsMask.unsignedCharValue;
             request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -4241,7 +4266,12 @@
             }
             request.stepMode = static_cast<std::remove_reference_t<decltype(request.stepMode)>>(params.stepMode.unsignedCharValue);
             request.stepSize = params.stepSize.unsignedCharValue;
-            request.transitionTime = params.transitionTime.unsignedShortValue;
+            if (params.transitionTime == nil) {
+                request.transitionTime.SetNull();
+            } else {
+                auto & nonNullValue_0 = request.transitionTime.SetNonNull();
+                nonNullValue_0 = params.transitionTime.unsignedShortValue;
+            }
             request.optionsMask = params.optionsMask.unsignedCharValue;
             request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -4312,10 +4342,10 @@
 - (void)readAttributeCurrentLevelWithCompletionHandler:(void (^)(
                                                            NSNumber * _Nullable value, NSError * _Nullable error))completionHandler
 {
-    new MTRInt8uAttributeCallbackBridge(self.callbackQueue, self.device, completionHandler,
+    new MTRNullableInt8uAttributeCallbackBridge(self.callbackQueue, self.device, completionHandler,
         ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) {
             using TypeInfo = LevelControl::Attributes::CurrentLevel::TypeInfo;
-            auto successFn = Callback<Int8uAttributeCallback>::FromCancelable(success);
+            auto successFn = Callback<NullableInt8uAttributeCallback>::FromCancelable(success);
             auto failureFn = Callback<DefaultFailureCallbackType>::FromCancelable(failure);
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
             return cppCluster.ReadAttribute<TypeInfo>(successFn->mContext, successFn->mCall, failureFn->mCall);
@@ -4332,7 +4362,7 @@
     minInterval = [minInterval copy];
     maxInterval = [maxInterval copy];
     params = [params copy];
-    new MTRInt8uAttributeCallbackSubscriptionBridge(
+    new MTRNullableInt8uAttributeCallbackSubscriptionBridge(
         self.callbackQueue, self.device, reportHandler,
         ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) {
             if (params != nil && params.autoResubscribe != nil && ![params.autoResubscribe boolValue]) {
@@ -4340,13 +4370,13 @@
                 return CHIP_ERROR_INVALID_ARGUMENT;
             }
             using TypeInfo = LevelControl::Attributes::CurrentLevel::TypeInfo;
-            auto successFn = Callback<Int8uAttributeCallback>::FromCancelable(success);
+            auto successFn = Callback<NullableInt8uAttributeCallback>::FromCancelable(success);
             auto failureFn = Callback<DefaultFailureCallbackType>::FromCancelable(failure);
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
             return cppCluster.SubscribeAttribute<TypeInfo>(successFn->mContext, successFn->mCall, failureFn->mCall,
                 [minInterval unsignedShortValue], [maxInterval unsignedShortValue],
-                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
+                MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params == nil || params.fabricFiltered == nil || [params.fabricFiltered boolValue],
                 params != nil && params.keepPreviousSubscriptions != nil && [params.keepPreviousSubscriptions boolValue]);
         },
@@ -4359,7 +4389,7 @@
                                   completionHandler:
                                       (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completionHandler
 {
-    new MTRInt8uAttributeCallbackBridge(queue, completionHandler, ^(Cancelable * success, Cancelable * failure) {
+    new MTRNullableInt8uAttributeCallbackBridge(queue, completionHandler, ^(Cancelable * success, Cancelable * failure) {
         if (attributeCacheContainer.cppAttributeCache) {
             chip::app::ConcreteAttributePath path;
             using TypeInfo = LevelControl::Attributes::CurrentLevel::TypeInfo;
@@ -4368,7 +4398,7 @@
             path.mAttributeId = TypeInfo::GetAttributeId();
             TypeInfo::DecodableType value;
             CHIP_ERROR err = attributeCacheContainer.cppAttributeCache->Get<TypeInfo>(path, value);
-            auto successFn = Callback<Int8uAttributeCallback>::FromCancelable(success);
+            auto successFn = Callback<NullableInt8uAttributeCallback>::FromCancelable(success);
             if (err == CHIP_NO_ERROR) {
                 successFn->mCall(successFn->mContext, value);
             }
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
index 5b8c4d7..3a5fa5f 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
@@ -1632,7 +1632,12 @@
                     }
                 }
                 request.level = params.level.unsignedCharValue;
-                request.transitionTime = params.transitionTime.unsignedShortValue;
+                if (params.transitionTime == nil) {
+                    request.transitionTime.SetNull();
+                } else {
+                    auto & nonNullValue_0 = request.transitionTime.SetNonNull();
+                    nonNullValue_0 = params.transitionTime.unsignedShortValue;
+                }
                 request.optionsMask = params.optionsMask.unsignedCharValue;
                 request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -1671,7 +1676,12 @@
                 }
                 request.moveMode
                     = static_cast<std::remove_reference_t<decltype(request.moveMode)>>(params.moveMode.unsignedCharValue);
-                request.rate = params.rate.unsignedCharValue;
+                if (params.rate == nil) {
+                    request.rate.SetNull();
+                } else {
+                    auto & nonNullValue_0 = request.rate.SetNonNull();
+                    nonNullValue_0 = params.rate.unsignedCharValue;
+                }
                 request.optionsMask = params.optionsMask.unsignedCharValue;
                 request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -1711,7 +1721,12 @@
                 request.stepMode
                     = static_cast<std::remove_reference_t<decltype(request.stepMode)>>(params.stepMode.unsignedCharValue);
                 request.stepSize = params.stepSize.unsignedCharValue;
-                request.transitionTime = params.transitionTime.unsignedShortValue;
+                if (params.transitionTime == nil) {
+                    request.transitionTime.SetNull();
+                } else {
+                    auto & nonNullValue_0 = request.transitionTime.SetNonNull();
+                    nonNullValue_0 = params.transitionTime.unsignedShortValue;
+                }
                 request.optionsMask = params.optionsMask.unsignedCharValue;
                 request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -1785,7 +1800,12 @@
                     }
                 }
                 request.level = params.level.unsignedCharValue;
-                request.transitionTime = params.transitionTime.unsignedShortValue;
+                if (params.transitionTime == nil) {
+                    request.transitionTime.SetNull();
+                } else {
+                    auto & nonNullValue_0 = request.transitionTime.SetNonNull();
+                    nonNullValue_0 = params.transitionTime.unsignedShortValue;
+                }
                 request.optionsMask = params.optionsMask.unsignedCharValue;
                 request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -1824,7 +1844,12 @@
                 }
                 request.moveMode
                     = static_cast<std::remove_reference_t<decltype(request.moveMode)>>(params.moveMode.unsignedCharValue);
-                request.rate = params.rate.unsignedCharValue;
+                if (params.rate == nil) {
+                    request.rate.SetNull();
+                } else {
+                    auto & nonNullValue_0 = request.rate.SetNonNull();
+                    nonNullValue_0 = params.rate.unsignedCharValue;
+                }
                 request.optionsMask = params.optionsMask.unsignedCharValue;
                 request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
@@ -1864,7 +1889,12 @@
                 request.stepMode
                     = static_cast<std::remove_reference_t<decltype(request.stepMode)>>(params.stepMode.unsignedCharValue);
                 request.stepSize = params.stepSize.unsignedCharValue;
-                request.transitionTime = params.transitionTime.unsignedShortValue;
+                if (params.transitionTime == nil) {
+                    request.transitionTime.SetNull();
+                } else {
+                    auto & nonNullValue_0 = request.transitionTime.SetNonNull();
+                    nonNullValue_0 = params.transitionTime.unsignedShortValue;
+                }
                 request.optionsMask = params.optionsMask.unsignedCharValue;
                 request.optionsOverride = params.optionsOverride.unsignedCharValue;
 
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h
index bb4e315..239779a 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h
@@ -936,7 +936,7 @@
 
 @property (nonatomic, copy) NSNumber * _Nonnull level;
 
-@property (nonatomic, copy) NSNumber * _Nonnull transitionTime;
+@property (nonatomic, copy) NSNumber * _Nullable transitionTime;
 
 @property (nonatomic, copy) NSNumber * _Nonnull optionsMask;
 
@@ -964,7 +964,7 @@
 
 @property (nonatomic, copy) NSNumber * _Nonnull moveMode;
 
-@property (nonatomic, copy) NSNumber * _Nonnull rate;
+@property (nonatomic, copy) NSNumber * _Nullable rate;
 
 @property (nonatomic, copy) NSNumber * _Nonnull optionsMask;
 
@@ -994,7 +994,7 @@
 
 @property (nonatomic, copy) NSNumber * _Nonnull stepSize;
 
-@property (nonatomic, copy) NSNumber * _Nonnull transitionTime;
+@property (nonatomic, copy) NSNumber * _Nullable transitionTime;
 
 @property (nonatomic, copy) NSNumber * _Nonnull optionsMask;
 
@@ -1046,7 +1046,7 @@
 
 @property (nonatomic, copy) NSNumber * _Nonnull level;
 
-@property (nonatomic, copy) NSNumber * _Nonnull transitionTime;
+@property (nonatomic, copy) NSNumber * _Nullable transitionTime;
 
 @property (nonatomic, copy) NSNumber * _Nonnull optionsMask;
 
@@ -1074,7 +1074,7 @@
 
 @property (nonatomic, copy) NSNumber * _Nonnull moveMode;
 
-@property (nonatomic, copy) NSNumber * _Nonnull rate;
+@property (nonatomic, copy) NSNumber * _Nullable rate;
 
 @property (nonatomic, copy) NSNumber * _Nonnull optionsMask;
 
@@ -1104,7 +1104,7 @@
 
 @property (nonatomic, copy) NSNumber * _Nonnull stepSize;
 
-@property (nonatomic, copy) NSNumber * _Nonnull transitionTime;
+@property (nonatomic, copy) NSNumber * _Nullable transitionTime;
 
 @property (nonatomic, copy) NSNumber * _Nonnull optionsMask;
 
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
index 2884401..941a8c9 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
@@ -1240,7 +1240,7 @@
 
         _level = @(0);
 
-        _transitionTime = @(0);
+        _transitionTime = nil;
 
         _optionsMask = @(0);
 
@@ -1279,7 +1279,7 @@
 
         _moveMode = @(0);
 
-        _rate = @(0);
+        _rate = nil;
 
         _optionsMask = @(0);
 
@@ -1319,7 +1319,7 @@
 
         _stepSize = @(0);
 
-        _transitionTime = @(0);
+        _transitionTime = nil;
 
         _optionsMask = @(0);
 
@@ -1391,7 +1391,7 @@
 
         _level = @(0);
 
-        _transitionTime = @(0);
+        _transitionTime = nil;
 
         _optionsMask = @(0);
 
@@ -1430,7 +1430,7 @@
 
         _moveMode = @(0);
 
-        _rate = @(0);
+        _rate = nil;
 
         _optionsMask = @(0);
 
@@ -1470,7 +1470,7 @@
 
         _stepSize = @(0);
 
-        _transitionTime = @(0);
+        _transitionTime = nil;
 
         _optionsMask = @(0);
 
diff --git a/zzz_generated/all-clusters-app/zap-generated/access.h b/zzz_generated/all-clusters-app/zap-generated/access.h
index 62a93c3..14751b3 100644
--- a/zzz_generated/all-clusters-app/zap-generated/access.h
+++ b/zzz_generated/all-clusters-app/zap-generated/access.h
@@ -30,7 +30,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__CLUSTER { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -93,7 +93,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__ATTRIBUTE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -156,7 +156,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__PRIVILEGE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -221,7 +221,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__CLUSTER { \
     6, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    8, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    8, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     40, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -275,7 +275,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__ATTRIBUTE { \
     16387, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    16384, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    16384, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     5, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -329,7 +329,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__PRIVILEGE { \
     kMatterAccessPrivilegeManage, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     kMatterAccessPrivilegeManage, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
diff --git a/zzz_generated/all-clusters-app/zap-generated/endpoint_config.h b/zzz_generated/all-clusters-app/zap-generated/endpoint_config.h
index 0debc14..e699d6c 100644
--- a/zzz_generated/all-clusters-app/zap-generated/endpoint_config.h
+++ b/zzz_generated/all-clusters-app/zap-generated/endpoint_config.h
@@ -303,7 +303,7 @@
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x2 }, /* switch actions */                                               \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* options */                                                      \
+            { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* Options */                                                      \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Binary Input (Basic) (server) */                                                              \
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x1 }, /* out of service */                                               \
@@ -797,28 +797,29 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(1) },   /* ClusterRevision */                                 \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE), ZAP_SIMPLE_DEFAULT(0xFE) }, /* current level */        \
-            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* remaining time */       \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },                            /* min level */            \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },                            /* max level */            \
-            { 0x00000004, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* current frequency */    \
-            { 0x00000005, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* min frequency */        \
-            { 0x00000006, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* max frequency */        \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
+              ZAP_SIMPLE_DEFAULT(0xFE) },                                       /* CurrentLevel */                                 \
+            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* RemainingTime */                                \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* MinLevel */                                     \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },    /* MaxLevel */                                     \
+            { 0x00000004, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* CurrentFrequency */                             \
+            { 0x00000005, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* MinFrequency */                                 \
+            { 0x00000006, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* MaxFrequency */                                 \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(4) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(4) }, /* Options */                                                                       \
             { 0x00000010, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE),                                                       \
-              ZAP_SIMPLE_DEFAULT(0x0000) }, /* on off transition time */                                                           \
+              ZAP_SIMPLE_DEFAULT(0x0000) }, /* OnOffTransitionTime */                                                              \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFF) }, /* on level */                                                                           \
+              ZAP_SIMPLE_DEFAULT(0xFF) }, /* OnLevel */                                                                            \
             { 0x00000012, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                        \
-              ZAP_EMPTY_DEFAULT() }, /* on transition time */                                                                      \
+              ZAP_EMPTY_DEFAULT() }, /* OnTransitionTime */                                                                        \
             { 0x00000013, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                        \
-              ZAP_EMPTY_DEFAULT() }, /* off transition time */                                                                     \
+              ZAP_EMPTY_DEFAULT() }, /* OffTransitionTime */                                                                       \
             { 0x00000014, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(50) }, /* default move rate */                                                                    \
+              ZAP_SIMPLE_DEFAULT(50) }, /* DefaultMoveRate */                                                                      \
             { 0x00004000, ZAP_TYPE(INT8U), 1,                                                                                      \
               ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                          \
-              ZAP_SIMPLE_DEFAULT(255) },                                     /* start up current level */                          \
+              ZAP_SIMPLE_DEFAULT(255) },                                     /* StartUpCurrentLevel */                             \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(3) }, /* FeatureMap */                                      \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
                                                                                                                                    \
diff --git a/zzz_generated/all-clusters-minimal-app/zap-generated/endpoint_config.h b/zzz_generated/all-clusters-minimal-app/zap-generated/endpoint_config.h
index 71b0dae..7f67548 100644
--- a/zzz_generated/all-clusters-minimal-app/zap-generated/endpoint_config.h
+++ b/zzz_generated/all-clusters-minimal-app/zap-generated/endpoint_config.h
@@ -256,7 +256,7 @@
         { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x1 }, /* HourFormat */                                                       \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* options */                                                      \
+            { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* Options */                                                      \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Door Lock (server) */                                                                         \
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x4 }, /* OperatingMode */                                                \
@@ -589,11 +589,12 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },                                /* ClusterRevision */    \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE), ZAP_SIMPLE_DEFAULT(0xFE) }, /* current level */        \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
+              ZAP_SIMPLE_DEFAULT(0xFE) }, /* CurrentLevel */                                                                       \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(1) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(1) }, /* Options */                                                                       \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFF) },                                    /* on level */                                        \
+              ZAP_SIMPLE_DEFAULT(0xFF) },                                    /* OnLevel */                                         \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(0) }, /* FeatureMap */                                      \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
                                                                                                                                    \
diff --git a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
index f1a5cb0..ed59a1f 100644
--- a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
+++ b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
@@ -921,24 +921,27 @@
 
 namespace CurrentLevel {
 
-EmberAfStatus Get(chip::EndpointId endpoint, uint8_t * value)
+EmberAfStatus Get(chip::EndpointId endpoint, DataModel::Nullable<uint8_t> & value)
 {
     using Traits = NumericAttributeTraits<uint8_t>;
     Traits::StorageType temp;
     uint8_t * readable   = Traits::ToAttributeStoreRepresentation(temp);
     EmberAfStatus status = emberAfReadServerAttribute(endpoint, Clusters::LevelControl::Id, Id, readable, sizeof(temp));
     VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, status);
-    if (!Traits::CanRepresentValue(/* isNullable = */ false, temp))
+    if (Traits::IsNullValue(temp))
     {
-        return EMBER_ZCL_STATUS_CONSTRAINT_ERROR;
+        value.SetNull();
     }
-    *value = Traits::StorageToWorking(temp);
+    else
+    {
+        value.SetNonNull() = Traits::StorageToWorking(temp);
+    }
     return status;
 }
 EmberAfStatus Set(chip::EndpointId endpoint, uint8_t value)
 {
     using Traits = NumericAttributeTraits<uint8_t>;
-    if (!Traits::CanRepresentValue(/* isNullable = */ false, value))
+    if (!Traits::CanRepresentValue(/* isNullable = */ true, value))
     {
         return EMBER_ZCL_STATUS_CONSTRAINT_ERROR;
     }
@@ -948,6 +951,25 @@
     return emberAfWriteServerAttribute(endpoint, Clusters::LevelControl::Id, Id, writable, ZCL_INT8U_ATTRIBUTE_TYPE);
 }
 
+EmberAfStatus SetNull(chip::EndpointId endpoint)
+{
+    using Traits = NumericAttributeTraits<uint8_t>;
+    Traits::StorageType value;
+    Traits::SetNull(value);
+    uint8_t * writable = Traits::ToAttributeStoreRepresentation(value);
+    return emberAfWriteServerAttribute(endpoint, Clusters::LevelControl::Id, Id, writable, ZCL_INT8U_ATTRIBUTE_TYPE);
+}
+
+EmberAfStatus Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullable<uint8_t> & value)
+{
+    if (value.IsNull())
+    {
+        return SetNull(endpoint);
+    }
+
+    return Set(endpoint, value.Value());
+}
+
 } // namespace CurrentLevel
 
 namespace RemainingTime {
diff --git a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
index 0effd1e..e7d47e4 100644
--- a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
+++ b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
@@ -203,8 +203,10 @@
 namespace Attributes {
 
 namespace CurrentLevel {
-EmberAfStatus Get(chip::EndpointId endpoint, uint8_t * value); // int8u
+EmberAfStatus Get(chip::EndpointId endpoint, DataModel::Nullable<uint8_t> & value); // int8u
 EmberAfStatus Set(chip::EndpointId endpoint, uint8_t value);
+EmberAfStatus SetNull(chip::EndpointId endpoint);
+EmberAfStatus Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullable<uint8_t> & value);
 } // namespace CurrentLevel
 
 namespace RemainingTime {
diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
index 7987a67..e2528fe 100644
--- a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
+++ b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
@@ -2273,8 +2273,8 @@
     static constexpr CommandId GetCommandId() { return Commands::MoveToLevel::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    uint8_t level           = static_cast<uint8_t>(0);
-    uint16_t transitionTime = static_cast<uint16_t>(0);
+    uint8_t level = static_cast<uint8_t>(0);
+    DataModel::Nullable<uint16_t> transitionTime;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
 
@@ -2291,8 +2291,8 @@
     static constexpr CommandId GetCommandId() { return Commands::MoveToLevel::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    uint8_t level           = static_cast<uint8_t>(0);
-    uint16_t transitionTime = static_cast<uint16_t>(0);
+    uint8_t level = static_cast<uint8_t>(0);
+    DataModel::Nullable<uint16_t> transitionTime;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
@@ -2314,8 +2314,8 @@
     static constexpr CommandId GetCommandId() { return Commands::Move::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    MoveMode moveMode       = static_cast<MoveMode>(0);
-    uint8_t rate            = static_cast<uint8_t>(0);
+    MoveMode moveMode = static_cast<MoveMode>(0);
+    DataModel::Nullable<uint8_t> rate;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
 
@@ -2332,8 +2332,8 @@
     static constexpr CommandId GetCommandId() { return Commands::Move::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    MoveMode moveMode       = static_cast<MoveMode>(0);
-    uint8_t rate            = static_cast<uint8_t>(0);
+    MoveMode moveMode = static_cast<MoveMode>(0);
+    DataModel::Nullable<uint8_t> rate;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
@@ -2356,9 +2356,9 @@
     static constexpr CommandId GetCommandId() { return Commands::Step::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    StepMode stepMode       = static_cast<StepMode>(0);
-    uint8_t stepSize        = static_cast<uint8_t>(0);
-    uint16_t transitionTime = static_cast<uint16_t>(0);
+    StepMode stepMode = static_cast<StepMode>(0);
+    uint8_t stepSize  = static_cast<uint8_t>(0);
+    DataModel::Nullable<uint16_t> transitionTime;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
 
@@ -2375,9 +2375,9 @@
     static constexpr CommandId GetCommandId() { return Commands::Step::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    StepMode stepMode       = static_cast<StepMode>(0);
-    uint8_t stepSize        = static_cast<uint8_t>(0);
-    uint16_t transitionTime = static_cast<uint16_t>(0);
+    StepMode stepMode = static_cast<StepMode>(0);
+    uint8_t stepSize  = static_cast<uint8_t>(0);
+    DataModel::Nullable<uint16_t> transitionTime;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
@@ -2434,8 +2434,8 @@
     static constexpr CommandId GetCommandId() { return Commands::MoveToLevelWithOnOff::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    uint8_t level           = static_cast<uint8_t>(0);
-    uint16_t transitionTime = static_cast<uint16_t>(0);
+    uint8_t level = static_cast<uint8_t>(0);
+    DataModel::Nullable<uint16_t> transitionTime;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
 
@@ -2452,8 +2452,8 @@
     static constexpr CommandId GetCommandId() { return Commands::MoveToLevelWithOnOff::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    uint8_t level           = static_cast<uint8_t>(0);
-    uint16_t transitionTime = static_cast<uint16_t>(0);
+    uint8_t level = static_cast<uint8_t>(0);
+    DataModel::Nullable<uint16_t> transitionTime;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
@@ -2475,8 +2475,8 @@
     static constexpr CommandId GetCommandId() { return Commands::MoveWithOnOff::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    MoveMode moveMode       = static_cast<MoveMode>(0);
-    uint8_t rate            = static_cast<uint8_t>(0);
+    MoveMode moveMode = static_cast<MoveMode>(0);
+    DataModel::Nullable<uint8_t> rate;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
 
@@ -2493,8 +2493,8 @@
     static constexpr CommandId GetCommandId() { return Commands::MoveWithOnOff::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    MoveMode moveMode       = static_cast<MoveMode>(0);
-    uint8_t rate            = static_cast<uint8_t>(0);
+    MoveMode moveMode = static_cast<MoveMode>(0);
+    DataModel::Nullable<uint8_t> rate;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
@@ -2517,9 +2517,9 @@
     static constexpr CommandId GetCommandId() { return Commands::StepWithOnOff::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    StepMode stepMode       = static_cast<StepMode>(0);
-    uint8_t stepSize        = static_cast<uint8_t>(0);
-    uint16_t transitionTime = static_cast<uint16_t>(0);
+    StepMode stepMode = static_cast<StepMode>(0);
+    uint8_t stepSize  = static_cast<uint8_t>(0);
+    DataModel::Nullable<uint16_t> transitionTime;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
 
@@ -2536,9 +2536,9 @@
     static constexpr CommandId GetCommandId() { return Commands::StepWithOnOff::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    StepMode stepMode       = static_cast<StepMode>(0);
-    uint8_t stepSize        = static_cast<uint8_t>(0);
-    uint16_t transitionTime = static_cast<uint16_t>(0);
+    StepMode stepMode = static_cast<StepMode>(0);
+    uint8_t stepSize  = static_cast<uint8_t>(0);
+    DataModel::Nullable<uint16_t> transitionTime;
     uint8_t optionsMask     = static_cast<uint8_t>(0);
     uint8_t optionsOverride = static_cast<uint8_t>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
@@ -2618,9 +2618,9 @@
 namespace CurrentLevel {
 struct TypeInfo
 {
-    using Type             = uint8_t;
-    using DecodableType    = uint8_t;
-    using DecodableArgType = uint8_t;
+    using Type             = chip::app::DataModel::Nullable<uint8_t>;
+    using DecodableType    = chip::app::DataModel::Nullable<uint8_t>;
+    using DecodableArgType = const chip::app::DataModel::Nullable<uint8_t> &;
 
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
     static constexpr AttributeId GetAttributeId() { return Attributes::CurrentLevel::Id; }
@@ -2822,7 +2822,7 @@
 
         CHIP_ERROR Decode(TLV::TLVReader & reader, const ConcreteAttributePath & path);
 
-        Attributes::CurrentLevel::TypeInfo::DecodableType currentLevel               = static_cast<uint8_t>(0);
+        Attributes::CurrentLevel::TypeInfo::DecodableType currentLevel;
         Attributes::RemainingTime::TypeInfo::DecodableType remainingTime             = static_cast<uint16_t>(0);
         Attributes::MinLevel::TypeInfo::DecodableType minLevel                       = static_cast<uint8_t>(0);
         Attributes::MaxLevel::TypeInfo::DecodableType maxLevel                       = static_cast<uint8_t>(0);
diff --git a/zzz_generated/bridge-app/zap-generated/access.h b/zzz_generated/bridge-app/zap-generated/access.h
index 2cd7b17..398e4e7 100644
--- a/zzz_generated/bridge-app/zap-generated/access.h
+++ b/zzz_generated/bridge-app/zap-generated/access.h
@@ -29,7 +29,7 @@
 
 // Parallel array data (*cluster*, attribute, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__CLUSTER { \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -52,7 +52,7 @@
 
 // Parallel array data (cluster, *attribute*, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__ATTRIBUTE { \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -75,7 +75,7 @@
 
 // Parallel array data (cluster, attribute, *privilege*) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__PRIVILEGE { \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -100,7 +100,7 @@
 
 // Parallel array data (*cluster*, attribute, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__CLUSTER { \
-    8, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    8, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     40, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -114,7 +114,7 @@
 
 // Parallel array data (cluster, *attribute*, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__ATTRIBUTE { \
-    16384, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    16384, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     5, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -128,7 +128,7 @@
 
 // Parallel array data (cluster, attribute, *privilege*) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__PRIVILEGE { \
-    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     kMatterAccessPrivilegeManage, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
diff --git a/zzz_generated/bridge-app/zap-generated/endpoint_config.h b/zzz_generated/bridge-app/zap-generated/endpoint_config.h
index 0d077e9..7853c8b 100644
--- a/zzz_generated/bridge-app/zap-generated/endpoint_config.h
+++ b/zzz_generated/bridge-app/zap-generated/endpoint_config.h
@@ -98,7 +98,7 @@
             /* Endpoint: 0, Cluster: Unit Localization (server) */                                                                 \
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x2 }, /* TemperatureUnit */                                              \
                                                                                                                                    \
-        /* Endpoint: 2, Cluster: Level Control (server) */ { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 } /* options */        \
+        /* Endpoint: 2, Cluster: Level Control (server) */ { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 } /* Options */        \
     }
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
@@ -464,28 +464,29 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },     /* ClusterRevision */                               \
                                                                                                                                    \
             /* Endpoint: 2, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE), ZAP_SIMPLE_DEFAULT(0x00) }, /* current level */        \
-            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* remaining time */       \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },                            /* min level */            \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },                            /* max level */            \
-            { 0x00000004, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* current frequency */    \
-            { 0x00000005, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* min frequency */        \
-            { 0x00000006, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* max frequency */        \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
+              ZAP_SIMPLE_DEFAULT(0x00) },                                       /* CurrentLevel */                                 \
+            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* RemainingTime */                                \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* MinLevel */                                     \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },    /* MaxLevel */                                     \
+            { 0x00000004, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* CurrentFrequency */                             \
+            { 0x00000005, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* MinFrequency */                                 \
+            { 0x00000006, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* MaxFrequency */                                 \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* Options */                                                                       \
             { 0x00000010, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE),                                                       \
-              ZAP_SIMPLE_DEFAULT(0x0000) }, /* on off transition time */                                                           \
+              ZAP_SIMPLE_DEFAULT(0x0000) }, /* OnOffTransitionTime */                                                              \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFE) }, /* on level */                                                                           \
+              ZAP_SIMPLE_DEFAULT(0xFE) }, /* OnLevel */                                                                            \
             { 0x00000012, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                        \
-              ZAP_EMPTY_DEFAULT() }, /* on transition time */                                                                      \
+              ZAP_EMPTY_DEFAULT() }, /* OnTransitionTime */                                                                        \
             { 0x00000013, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                        \
-              ZAP_EMPTY_DEFAULT() }, /* off transition time */                                                                     \
+              ZAP_EMPTY_DEFAULT() }, /* OffTransitionTime */                                                                       \
             { 0x00000014, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_EMPTY_DEFAULT() }, /* default move rate */                                                                       \
+              ZAP_EMPTY_DEFAULT() }, /* DefaultMoveRate */                                                                         \
             { 0x00004000, ZAP_TYPE(INT8U), 1,                                                                                      \
               ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                          \
-              ZAP_SIMPLE_DEFAULT(255) },                                     /* start up current level */                          \
+              ZAP_SIMPLE_DEFAULT(255) },                                     /* StartUpCurrentLevel */                             \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(3) }, /* FeatureMap */                                      \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
                                                                                                                                    \
diff --git a/zzz_generated/chef-noip_rootnode_dimmablelight_bCwGYSDpoe/zap-generated/access.h b/zzz_generated/chef-noip_rootnode_dimmablelight_bCwGYSDpoe/zap-generated/access.h
index 928e3f5..3c8b8b3 100644
--- a/zzz_generated/chef-noip_rootnode_dimmablelight_bCwGYSDpoe/zap-generated/access.h
+++ b/zzz_generated/chef-noip_rootnode_dimmablelight_bCwGYSDpoe/zap-generated/access.h
@@ -30,7 +30,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__CLUSTER { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -45,7 +45,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__ATTRIBUTE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -60,7 +60,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__PRIVILEGE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -77,7 +77,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__CLUSTER { \
     6, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    8, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    8, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     40, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -91,7 +91,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__ATTRIBUTE { \
     16387, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    16384, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    16384, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     5, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -105,7 +105,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__PRIVILEGE { \
     kMatterAccessPrivilegeManage, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     kMatterAccessPrivilegeManage, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
diff --git a/zzz_generated/chef-noip_rootnode_dimmablelight_bCwGYSDpoe/zap-generated/endpoint_config.h b/zzz_generated/chef-noip_rootnode_dimmablelight_bCwGYSDpoe/zap-generated/endpoint_config.h
index ce75db3..6f0fc74 100644
--- a/zzz_generated/chef-noip_rootnode_dimmablelight_bCwGYSDpoe/zap-generated/endpoint_config.h
+++ b/zzz_generated/chef-noip_rootnode_dimmablelight_bCwGYSDpoe/zap-generated/endpoint_config.h
@@ -78,7 +78,7 @@
             /* Endpoint: 1, Cluster: On/Off (server) */                                                                            \
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x2 }, /* StartUpOnOff */                                                 \
                                                                                                                                    \
-        /* Endpoint: 1, Cluster: Level Control (server) */ { (uint16_t) 0x3, (uint16_t) 0x0, (uint16_t) 0x3 } /* options */        \
+        /* Endpoint: 1, Cluster: Level Control (server) */ { (uint16_t) 0x3, (uint16_t) 0x0, (uint16_t) 0x3 } /* Options */        \
     }
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
@@ -442,16 +442,16 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },     /* ClusterRevision */                               \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* current level */                                \
-            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* remaining time */                               \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* min level */                                    \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },    /* max level */                                    \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(NULLABLE), ZAP_SIMPLE_DEFAULT(0x01) }, /* CurrentLevel */         \
+            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* RemainingTime */        \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },                            /* MinLevel */             \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },                            /* MaxLevel */             \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* Options */                                                                       \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFE) }, /* on level */                                                                           \
+              ZAP_SIMPLE_DEFAULT(0xFE) }, /* OnLevel */                                                                            \
             { 0x00004000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0x00) },                                       /* start up current level */                       \
+              ZAP_SIMPLE_DEFAULT(0x00) },                                       /* StartUpCurrentLevel */                          \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(0x03) }, /* FeatureMap */                                   \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },      /* ClusterRevision */                              \
                                                                                                                                    \
diff --git a/zzz_generated/chef-rootnode_dimmablelight_bCwGYSDpoe/zap-generated/access.h b/zzz_generated/chef-rootnode_dimmablelight_bCwGYSDpoe/zap-generated/access.h
index fe61bee..d57ea86 100644
--- a/zzz_generated/chef-rootnode_dimmablelight_bCwGYSDpoe/zap-generated/access.h
+++ b/zzz_generated/chef-rootnode_dimmablelight_bCwGYSDpoe/zap-generated/access.h
@@ -30,7 +30,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__CLUSTER { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -51,7 +51,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__ATTRIBUTE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -72,7 +72,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__PRIVILEGE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -95,7 +95,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__CLUSTER { \
     6, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    8, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    8, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     40, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -110,7 +110,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__ATTRIBUTE { \
     16387, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    16384, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    16384, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     5, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -125,7 +125,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__PRIVILEGE { \
     kMatterAccessPrivilegeManage, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     kMatterAccessPrivilegeManage, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
diff --git a/zzz_generated/chef-rootnode_dimmablelight_bCwGYSDpoe/zap-generated/endpoint_config.h b/zzz_generated/chef-rootnode_dimmablelight_bCwGYSDpoe/zap-generated/endpoint_config.h
index 1debabe..96932d5 100644
--- a/zzz_generated/chef-rootnode_dimmablelight_bCwGYSDpoe/zap-generated/endpoint_config.h
+++ b/zzz_generated/chef-rootnode_dimmablelight_bCwGYSDpoe/zap-generated/endpoint_config.h
@@ -78,7 +78,7 @@
             /* Endpoint: 1, Cluster: On/Off (server) */                                                                            \
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x2 }, /* StartUpOnOff */                                                 \
                                                                                                                                    \
-        /* Endpoint: 1, Cluster: Level Control (server) */ { (uint16_t) 0x3, (uint16_t) 0x0, (uint16_t) 0x3 } /* options */        \
+        /* Endpoint: 1, Cluster: Level Control (server) */ { (uint16_t) 0x3, (uint16_t) 0x0, (uint16_t) 0x3 } /* Options */        \
     }
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
@@ -454,16 +454,16 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },     /* ClusterRevision */                               \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* current level */                                \
-            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* remaining time */                               \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* min level */                                    \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },    /* max level */                                    \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(NULLABLE), ZAP_SIMPLE_DEFAULT(0x01) }, /* CurrentLevel */         \
+            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* RemainingTime */        \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },                            /* MinLevel */             \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },                            /* MaxLevel */             \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* Options */                                                                       \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFE) }, /* on level */                                                                           \
+              ZAP_SIMPLE_DEFAULT(0xFE) }, /* OnLevel */                                                                            \
             { 0x00004000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0x00) },                                       /* start up current level */                       \
+              ZAP_SIMPLE_DEFAULT(0x00) },                                       /* StartUpCurrentLevel */                          \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(0x03) }, /* FeatureMap */                                   \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },      /* ClusterRevision */                              \
                                                                                                                                    \
diff --git a/zzz_generated/chef-rootnode_extendedcolorlight_8lcaaYJVAa/zap-generated/access.h b/zzz_generated/chef-rootnode_extendedcolorlight_8lcaaYJVAa/zap-generated/access.h
index c9a7000..91df455 100644
--- a/zzz_generated/chef-rootnode_extendedcolorlight_8lcaaYJVAa/zap-generated/access.h
+++ b/zzz_generated/chef-rootnode_extendedcolorlight_8lcaaYJVAa/zap-generated/access.h
@@ -30,7 +30,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__CLUSTER { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -52,7 +52,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__ATTRIBUTE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -74,7 +74,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__PRIVILEGE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -98,7 +98,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__CLUSTER { \
     6, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    8, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    8, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     40, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -114,7 +114,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__ATTRIBUTE { \
     16387, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    16384, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    16384, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     5, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -130,7 +130,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__PRIVILEGE { \
     kMatterAccessPrivilegeManage, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     kMatterAccessPrivilegeManage, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
diff --git a/zzz_generated/chef-rootnode_extendedcolorlight_8lcaaYJVAa/zap-generated/endpoint_config.h b/zzz_generated/chef-rootnode_extendedcolorlight_8lcaaYJVAa/zap-generated/endpoint_config.h
index f100a4a..ae7d94a 100644
--- a/zzz_generated/chef-rootnode_extendedcolorlight_8lcaaYJVAa/zap-generated/endpoint_config.h
+++ b/zzz_generated/chef-rootnode_extendedcolorlight_8lcaaYJVAa/zap-generated/endpoint_config.h
@@ -79,7 +79,7 @@
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x2 }, /* StartUpOnOff */                                                 \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { (uint16_t) 0x3, (uint16_t) 0x0, (uint16_t) 0x3 }, /* options */                                                      \
+            { (uint16_t) 0x3, (uint16_t) 0x0, (uint16_t) 0x3 }, /* Options */                                                      \
                                                                                                                                    \
         /* Endpoint: 1, Cluster: Color Control (server) */                                                                         \
         {                                                                                                                          \
@@ -460,16 +460,16 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },     /* ClusterRevision */                               \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* current level */                                \
-            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* remaining time */                               \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* min level */                                    \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },    /* max level */                                    \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(NULLABLE), ZAP_SIMPLE_DEFAULT(0x01) }, /* CurrentLevel */         \
+            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* RemainingTime */        \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },                            /* MinLevel */             \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },                            /* MaxLevel */             \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* Options */                                                                       \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFE) }, /* on level */                                                                           \
+              ZAP_SIMPLE_DEFAULT(0xFE) }, /* OnLevel */                                                                            \
             { 0x00004000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0x00) },                                       /* start up current level */                       \
+              ZAP_SIMPLE_DEFAULT(0x00) },                                       /* StartUpCurrentLevel */                          \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(0x03) }, /* FeatureMap */                                   \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },      /* ClusterRevision */                              \
                                                                                                                                    \
diff --git a/zzz_generated/chef-rootnode_heatingcoolingunit_ncdGai1E5a/zap-generated/endpoint_config.h b/zzz_generated/chef-rootnode_heatingcoolingunit_ncdGai1E5a/zap-generated/endpoint_config.h
index b256769..e9876e7 100644
--- a/zzz_generated/chef-rootnode_heatingcoolingunit_ncdGai1E5a/zap-generated/endpoint_config.h
+++ b/zzz_generated/chef-rootnode_heatingcoolingunit_ncdGai1E5a/zap-generated/endpoint_config.h
@@ -451,11 +451,11 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },   /* ClusterRevision */                                 \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0) },    /* current level */                                   \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0) },    /* min level */                                       \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) }, /* max level */                                       \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(NULLABLE), ZAP_SIMPLE_DEFAULT(0) }, /* CurrentLevel */            \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0) },                            /* MinLevel */                \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },                         /* MaxLevel */                \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFE) },                                    /* on level */                                        \
+              ZAP_SIMPLE_DEFAULT(0xFE) },                                    /* OnLevel */                                         \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(1) }, /* FeatureMap */                                      \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
                                                                                                                                    \
diff --git a/zzz_generated/chef-rootnode_onofflight_bbs1b7IaOV/zap-generated/access.h b/zzz_generated/chef-rootnode_onofflight_bbs1b7IaOV/zap-generated/access.h
index fe61bee..d57ea86 100644
--- a/zzz_generated/chef-rootnode_onofflight_bbs1b7IaOV/zap-generated/access.h
+++ b/zzz_generated/chef-rootnode_onofflight_bbs1b7IaOV/zap-generated/access.h
@@ -30,7 +30,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__CLUSTER { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -51,7 +51,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__ATTRIBUTE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -72,7 +72,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__PRIVILEGE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Basic, Attribute: NodeLabel, Privilege: view */ \
@@ -95,7 +95,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__CLUSTER { \
     6, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    8, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    8, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     40, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -110,7 +110,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__ATTRIBUTE { \
     16387, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    16384, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    16384, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     5, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -125,7 +125,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__PRIVILEGE { \
     kMatterAccessPrivilegeManage, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     kMatterAccessPrivilegeManage, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
diff --git a/zzz_generated/chef-rootnode_onofflight_bbs1b7IaOV/zap-generated/endpoint_config.h b/zzz_generated/chef-rootnode_onofflight_bbs1b7IaOV/zap-generated/endpoint_config.h
index 2d023c8..1732a3b 100644
--- a/zzz_generated/chef-rootnode_onofflight_bbs1b7IaOV/zap-generated/endpoint_config.h
+++ b/zzz_generated/chef-rootnode_onofflight_bbs1b7IaOV/zap-generated/endpoint_config.h
@@ -78,7 +78,7 @@
             /* Endpoint: 1, Cluster: On/Off (server) */                                                                            \
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x2 }, /* StartUpOnOff */                                                 \
                                                                                                                                    \
-        /* Endpoint: 1, Cluster: Level Control (server) */ { (uint16_t) 0x1, (uint16_t) 0x0, (uint16_t) 0x3 } /* options */        \
+        /* Endpoint: 1, Cluster: Level Control (server) */ { (uint16_t) 0x1, (uint16_t) 0x0, (uint16_t) 0x3 } /* Options */        \
     }
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
@@ -454,16 +454,16 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },   /* ClusterRevision */                                 \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* current level */                                \
-            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* remaining time */                               \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* min level */                                    \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },    /* max level */                                    \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(NULLABLE), ZAP_SIMPLE_DEFAULT(0x01) }, /* CurrentLevel */         \
+            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* RemainingTime */        \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },                            /* MinLevel */             \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },                            /* MaxLevel */             \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* Options */                                                                       \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFE) }, /* on level */                                                                           \
+              ZAP_SIMPLE_DEFAULT(0xFE) }, /* OnLevel */                                                                            \
             { 0x00004000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0x01) },                                    /* start up current level */                          \
+              ZAP_SIMPLE_DEFAULT(0x01) },                                    /* StartUpCurrentLevel */                             \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(3) }, /* FeatureMap */                                      \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
                                                                                                                                    \
diff --git a/zzz_generated/chef-rootnode_speaker_RpzeXdimqA/zap-generated/endpoint_config.h b/zzz_generated/chef-rootnode_speaker_RpzeXdimqA/zap-generated/endpoint_config.h
index a448a67..1de78f3 100644
--- a/zzz_generated/chef-rootnode_speaker_RpzeXdimqA/zap-generated/endpoint_config.h
+++ b/zzz_generated/chef-rootnode_speaker_RpzeXdimqA/zap-generated/endpoint_config.h
@@ -75,7 +75,7 @@
         /* Endpoint: 0, Cluster: Time Format Localization (server) */                                                              \
         { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x1 }, /* HourFormat */                                                       \
                                                                                                                                    \
-        /* Endpoint: 1, Cluster: Level Control (server) */ { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 } /* options */        \
+        /* Endpoint: 1, Cluster: Level Control (server) */ { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 } /* Options */        \
     }
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
@@ -431,13 +431,13 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },     /* ClusterRevision */                               \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* current level */                                   \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* min level */                                       \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) }, /* max level */                                       \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(NULLABLE), ZAP_SIMPLE_DEFAULT(0x00) }, /* CurrentLevel */         \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) },                            /* MinLevel */             \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },                            /* MaxLevel */             \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(1) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(1) }, /* Options */                                                                       \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFE) },                                      /* on level */                                      \
+              ZAP_SIMPLE_DEFAULT(0xFE) },                                      /* OnLevel */                                       \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(0x1) }, /* FeatureMap */                                    \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },     /* ClusterRevision */                               \
                                                                                                                                    \
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
index ac3947d..27145a0 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
+++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
@@ -4338,74 +4338,74 @@
         switch (path.mAttributeId)
         {
         case LevelControl::Attributes::CurrentLevel::Id: {
-            uint8_t value;
+            chip::app::DataModel::Nullable<uint8_t> value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("current level", 1, value);
+            return DataModelLogger::LogValue("CurrentLevel", 1, value);
         }
         case LevelControl::Attributes::RemainingTime::Id: {
             uint16_t value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("remaining time", 1, value);
+            return DataModelLogger::LogValue("RemainingTime", 1, value);
         }
         case LevelControl::Attributes::MinLevel::Id: {
             uint8_t value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("min level", 1, value);
+            return DataModelLogger::LogValue("MinLevel", 1, value);
         }
         case LevelControl::Attributes::MaxLevel::Id: {
             uint8_t value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("max level", 1, value);
+            return DataModelLogger::LogValue("MaxLevel", 1, value);
         }
         case LevelControl::Attributes::CurrentFrequency::Id: {
             uint16_t value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("current frequency", 1, value);
+            return DataModelLogger::LogValue("CurrentFrequency", 1, value);
         }
         case LevelControl::Attributes::MinFrequency::Id: {
             uint16_t value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("min frequency", 1, value);
+            return DataModelLogger::LogValue("MinFrequency", 1, value);
         }
         case LevelControl::Attributes::MaxFrequency::Id: {
             uint16_t value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("max frequency", 1, value);
+            return DataModelLogger::LogValue("MaxFrequency", 1, value);
         }
         case LevelControl::Attributes::Options::Id: {
             uint8_t value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("options", 1, value);
+            return DataModelLogger::LogValue("Options", 1, value);
         }
         case LevelControl::Attributes::OnOffTransitionTime::Id: {
             uint16_t value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("on off transition time", 1, value);
+            return DataModelLogger::LogValue("OnOffTransitionTime", 1, value);
         }
         case LevelControl::Attributes::OnLevel::Id: {
             chip::app::DataModel::Nullable<uint8_t> value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("on level", 1, value);
+            return DataModelLogger::LogValue("OnLevel", 1, value);
         }
         case LevelControl::Attributes::OnTransitionTime::Id: {
             chip::app::DataModel::Nullable<uint16_t> value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("on transition time", 1, value);
+            return DataModelLogger::LogValue("OnTransitionTime", 1, value);
         }
         case LevelControl::Attributes::OffTransitionTime::Id: {
             chip::app::DataModel::Nullable<uint16_t> value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("off transition time", 1, value);
+            return DataModelLogger::LogValue("OffTransitionTime", 1, value);
         }
         case LevelControl::Attributes::DefaultMoveRate::Id: {
             chip::app::DataModel::Nullable<uint8_t> value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("default move rate", 1, value);
+            return DataModelLogger::LogValue("DefaultMoveRate", 1, value);
         }
         case LevelControl::Attributes::StartUpCurrentLevel::Id: {
             chip::app::DataModel::Nullable<uint8_t> value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("start up current level", 1, value);
+            return DataModelLogger::LogValue("StartUpCurrentLevel", 1, value);
         }
         case LevelControl::Attributes::GeneratedCommandList::Id: {
             chip::app::DataModel::DecodableList<chip::CommandId> value;
diff --git a/zzz_generated/chip-tool/zap-generated/test/Commands.h b/zzz_generated/chip-tool/zap-generated/test/Commands.h
index 0837376..469bd16 100644
--- a/zzz_generated/chip-tool/zap-generated/test/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/test/Commands.h
@@ -14135,7 +14135,7 @@
     chip::Optional<chip::EndpointId> mEndpoint;
     chip::Optional<uint16_t> mTimeout;
 
-    uint8_t CurrentLevelValue;
+    chip::app::DataModel::Nullable<uint8_t> CurrentLevelValue;
     uint8_t MinLevelValue;
     uint8_t MinLevelFeatureMapNotSupportedValue;
     uint8_t MaxLevelValue;
@@ -14162,7 +14162,7 @@
         case 1:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                 VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
@@ -14226,7 +14226,7 @@
         case 7:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                 VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelValue));
@@ -14236,7 +14236,7 @@
         case 8:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                 VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelFeatureMapNotSupportedValue));
@@ -14981,9 +14981,10 @@
         case 8:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 64U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 64U));
             }
             break;
         case 9:
@@ -14996,9 +14997,10 @@
         case 11:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 100U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
             }
             break;
         case 12:
@@ -15011,9 +15013,10 @@
         case 14:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 128U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 128U));
             }
             break;
         case 15:
@@ -15036,9 +15039,10 @@
         case 18:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 64U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 64U));
             }
             break;
         case 19:
@@ -15065,9 +15069,10 @@
         case 24:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 100U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
             }
             break;
         case 25:
@@ -15083,9 +15088,10 @@
         case 28:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 100U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
             }
             break;
         case 29:
@@ -15098,9 +15104,10 @@
         case 31:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 100U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
             }
             break;
         case 32:
@@ -15113,9 +15120,10 @@
         case 34:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 160U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 160U));
             }
             break;
         case 35:
@@ -15142,9 +15150,10 @@
         case 40:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 100U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
             }
             break;
         case 41:
@@ -15160,9 +15169,10 @@
         case 44:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 120U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 120U));
             }
             break;
         case 45:
@@ -15175,9 +15185,10 @@
         case 47:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 120U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 120U));
             }
             break;
         case 48:
@@ -15190,9 +15201,10 @@
         case 50:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 160U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 160U));
             }
             break;
         case 51:
@@ -15268,10 +15280,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
-            value.level           = 64U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.level = 64U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
                                value, chip::NullOptional
 
@@ -15295,10 +15308,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 100U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.level = 100U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -15322,10 +15336,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.M.VarRate"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 128U;
-            value.transitionTime  = 100U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.level = 128U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 100U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -15356,8 +15371,8 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 64U;
-            value.transitionTime  = 65535U;
+            value.level = 64U;
+            value.transitionTime.SetNull();
             value.optionsMask     = 0U;
             value.optionsOverride = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
@@ -15407,10 +15422,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 100U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.level = 100U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -15443,10 +15459,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 120U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.level = 120U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -15470,10 +15487,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 140U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 1U;
-            value.optionsOverride = 0U;
+            value.level = 140U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 1U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -15497,10 +15515,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 160U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 1U;
-            value.optionsOverride = 1U;
+            value.level = 160U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 1U;
+            value.optionsOverride        = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -15548,10 +15567,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 100U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.level = 100U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -15584,10 +15604,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 120U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.level = 120U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -15611,10 +15632,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 140U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 1U;
-            value.optionsOverride = 0U;
+            value.level = 140U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 1U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -15638,10 +15660,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 160U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 1U;
-            value.optionsOverride = 1U;
+            value.level = 160U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 1U;
+            value.optionsOverride        = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -15703,8 +15726,8 @@
     chip::Optional<chip::EndpointId> mEndpoint;
     chip::Optional<uint16_t> mTimeout;
 
-    uint8_t MinlevelValue;
-    uint8_t MaxlevelValue;
+    uint8_t MinimumLevelValue;
+    uint8_t MaximumLevelValue;
     chip::app::DataModel::Nullable<uint8_t> DefaultMoveRateValue;
 
     chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }
@@ -15745,7 +15768,7 @@
                 VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                 VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
-                MinlevelValue = value;
+                MinimumLevelValue = value;
             }
             break;
         case 5:
@@ -15759,7 +15782,7 @@
                 VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                 VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
-                MaxlevelValue = value;
+                MaximumLevelValue = value;
             }
             break;
         case 7:
@@ -15776,9 +15799,12 @@
         case 10:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, MaxlevelValue));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), MaximumLevelValue));
+                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
+                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
             }
             break;
         case 11:
@@ -15795,9 +15821,10 @@
         case 14:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, MinlevelValue));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), MinimumLevelValue));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                 VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
             }
@@ -15891,17 +15918,18 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
-            value.level           = 1U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 1U;
-            value.optionsOverride = 1U;
+            value.level = 1U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 1U;
+            value.optionsOverride        = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
                                value, chip::NullOptional
 
             );
         }
         case 6: {
-            LogStep(6, "reads max level attribute from DUT");
+            LogStep(6, "reads MaxLevel attribute from DUT");
             VerifyOrDo(!ShouldSkip("LVL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MaxLevel::Id, true,
                                  chip::NullOptional);
@@ -15911,8 +15939,9 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::Move::Type value;
-            value.moveMode        = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
-            value.rate            = 32U;
+            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
+            value.rate.SetNonNull();
+            value.rate.Value()    = 32U;
             value.optionsMask     = 1U;
             value.optionsOverride = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
@@ -15950,8 +15979,9 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::Move::Type value;
-            value.moveMode        = static_cast<chip::app::Clusters::LevelControl::MoveMode>(1);
-            value.rate            = 64U;
+            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(1);
+            value.rate.SetNonNull();
+            value.rate.Value()    = 64U;
             value.optionsMask     = 1U;
             value.optionsOverride = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
@@ -15985,18 +16015,18 @@
                                  chip::NullOptional);
         }
         case 15: {
-            LogStep(15, "reads default move rate attribute from DUT");
+            LogStep(15, "reads DefaultMoveRate attribute from DUT");
             VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::DefaultMoveRate::Id,
                                  true, chip::NullOptional);
         }
         case 16: {
-            LogStep(16, "sends a Move up command at default move rate");
+            LogStep(16, "sends a Move up command at DefaultMoveRate");
             VerifyOrDo(!ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::Move::Type value;
-            value.moveMode        = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
-            value.rate            = 255U;
+            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
+            value.rate.SetNull();
             value.optionsMask     = 1U;
             value.optionsOverride = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
@@ -16068,7 +16098,7 @@
     chip::Optional<uint16_t> mTimeout;
 
     uint8_t MinlevelValue;
-    uint8_t CurrentlevelValue;
+    chip::app::DataModel::Nullable<uint8_t> CurrentlevelValue;
 
     chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }
 
@@ -16120,9 +16150,10 @@
         case 7:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, static_cast<uint8_t>(MinlevelValue + 1)));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), static_cast<uint8_t>(MinlevelValue + 1)));
                 VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                 VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
@@ -16132,9 +16163,10 @@
         case 8:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 2U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 2U));
                 VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                 VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
@@ -16153,18 +16185,20 @@
         case 12:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 66U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 66U));
                 VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
             }
             break;
         case 13:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 66U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 66U));
                 VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
             }
             break;
@@ -16181,33 +16215,51 @@
         case 17:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, CurrentlevelValue));
+                if (CurrentlevelValue.IsNull())
+                {
+                    VerifyOrReturn(CheckValueNull("currentLevel", value));
+                }
+                else
+                {
+                    VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                    VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), CurrentlevelValue.Value()));
+                }
             }
             break;
         case 18:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, CurrentlevelValue));
+                if (CurrentlevelValue.IsNull())
+                {
+                    VerifyOrReturn(CheckValueNull("currentLevel", value));
+                }
+                else
+                {
+                    VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                    VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), CurrentlevelValue.Value()));
+                }
             }
             break;
         case 19:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 2U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 2U));
             }
             break;
         case 20:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 2U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 2U));
             }
             break;
         case 21:
@@ -16277,10 +16329,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp && LVL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
-            value.level           = static_cast<uint8_t>(MinlevelValue + 1);
-            value.transitionTime  = 0U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.level = static_cast<uint8_t>(MinlevelValue + 1);
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
                                value, chip::NullOptional
 
@@ -16291,23 +16344,24 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp && !LVL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
-            value.level           = 2U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.level = 2U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
                                value, chip::NullOptional
 
             );
         }
         case 7: {
-            LogStep(7, "Reads current level attribute from DUT");
+            LogStep(7, "Reads CurrentLevel attribute from DUT");
             VerifyOrDo(!ShouldSkip("LVL.S.A0000 && LVL.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                  chip::NullOptional);
         }
         case 8: {
-            LogStep(8, "Reads current level attribute from DUT");
+            LogStep(8, "Reads CurrentLevel attribute from DUT");
             VerifyOrDo(!ShouldSkip("LVL.S.A0000 && !LVL.S.A0002 && LVL.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                  chip::NullOptional);
@@ -16317,11 +16371,12 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.M.VarRate"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::Step::Type value;
-            value.stepMode        = static_cast<chip::app::Clusters::LevelControl::StepMode>(0);
-            value.stepSize        = 64U;
-            value.transitionTime  = 20U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.stepMode = static_cast<chip::app::Clusters::LevelControl::StepMode>(0);
+            value.stepSize = 64U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 20U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Step::Id, value,
                                chip::NullOptional
 
@@ -16332,11 +16387,12 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && !LVL.S.M.VarRate"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::Step::Type value;
-            value.stepMode        = static_cast<chip::app::Clusters::LevelControl::StepMode>(0);
-            value.stepSize        = 64U;
-            value.transitionTime  = 20U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.stepMode = static_cast<chip::app::Clusters::LevelControl::StepMode>(0);
+            value.stepSize = 64U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 20U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Step::Id, value,
                                chip::NullOptional
 
@@ -16350,14 +16406,14 @@
             return WaitForMs(kIdentityAlpha, value);
         }
         case 12: {
-            LogStep(12, "Reads current level attribute from DUT");
+            LogStep(12, "Reads CurrentLevel attribute from DUT");
             VerifyOrDo(!ShouldSkip("LVL.S.A0000 && LVL.S.C02.Rsp && LVL.S.M.VarRate"),
                        return ContinueOnChipMainThread(CHIP_NO_ERROR));
             return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                  chip::NullOptional);
         }
         case 13: {
-            LogStep(13, "Reads current level attribute from DUT");
+            LogStep(13, "Reads CurrentLevel attribute from DUT");
             VerifyOrDo(!ShouldSkip("LVL.S.A0000 && LVL.S.C02.Rsp && !LVL.S.M.VarRate"),
                        return ContinueOnChipMainThread(CHIP_NO_ERROR));
             return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
@@ -16368,11 +16424,12 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C06.Rsp && LVL.S.M.VarRate"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::StepWithOnOff::Type value;
-            value.stepMode        = static_cast<chip::app::Clusters::LevelControl::StepMode>(1);
-            value.stepSize        = 64U;
-            value.transitionTime  = 20U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.stepMode = static_cast<chip::app::Clusters::LevelControl::StepMode>(1);
+            value.stepSize = 64U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 20U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::StepWithOnOff::Id, value,
                                chip::NullOptional
 
@@ -16383,11 +16440,12 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C06.Rsp && !LVL.S.M.VarRate"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::StepWithOnOff::Type value;
-            value.stepMode        = static_cast<chip::app::Clusters::LevelControl::StepMode>(1);
-            value.stepSize        = 64U;
-            value.transitionTime  = 20U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.stepMode = static_cast<chip::app::Clusters::LevelControl::StepMode>(1);
+            value.stepSize = 64U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 20U;
+            value.optionsMask            = 0U;
+            value.optionsOverride        = 0U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::StepWithOnOff::Id, value,
                                chip::NullOptional
 
@@ -16401,28 +16459,28 @@
             return WaitForMs(kIdentityAlpha, value);
         }
         case 17: {
-            LogStep(17, "Reads current level attribute from DUT");
+            LogStep(17, "Reads CurrentLevel attribute from DUT");
             VerifyOrDo(!ShouldSkip("LVL.S.C06.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                        return ContinueOnChipMainThread(CHIP_NO_ERROR));
             return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                  chip::NullOptional);
         }
         case 18: {
-            LogStep(18, "Reads current level attribute from DUT");
+            LogStep(18, "Reads CurrentLevel attribute from DUT");
             VerifyOrDo(!ShouldSkip("LVL.S.C06.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate"),
                        return ContinueOnChipMainThread(CHIP_NO_ERROR));
             return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                  chip::NullOptional);
         }
         case 19: {
-            LogStep(19, "Reads current level attribute from DUT");
+            LogStep(19, "Reads CurrentLevel attribute from DUT");
             VerifyOrDo(!ShouldSkip("LVL.S.C06.Rsp && LVL.S.A0000 && !LVL.S.A0002 && LVL.S.M.VarRate"),
                        return ContinueOnChipMainThread(CHIP_NO_ERROR));
             return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                  chip::NullOptional);
         }
         case 20: {
-            LogStep(20, "Reads current level attribute from DUT");
+            LogStep(20, "Reads CurrentLevel attribute from DUT");
             VerifyOrDo(!ShouldSkip("LVL.S.C06.Rsp && LVL.S.A0000 && !LVL.S.A0002 && !LVL.S.M.VarRate"),
                        return ContinueOnChipMainThread(CHIP_NO_ERROR));
             return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
@@ -16472,7 +16530,7 @@
     chip::Optional<uint16_t> mTimeout;
 
     uint8_t MinlevelValue;
-    uint8_t CurrentLevelValue;
+    chip::app::DataModel::Nullable<uint8_t> CurrentLevelValue;
 
     chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }
 
@@ -16521,7 +16579,7 @@
         case 6:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                 VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
@@ -16545,7 +16603,7 @@
         case 11:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, 21U));
                 VerifyOrReturn(CheckConstraintMaxValue("value", value, 29U));
@@ -16569,7 +16627,7 @@
         case 16:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                 VerifyOrReturn(CheckConstraintMinValue("value", value, 43U));
                 VerifyOrReturn(CheckConstraintMaxValue("value", value, 57U));
@@ -16643,10 +16701,11 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
-            value.level           = 1U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 1U;
-            value.optionsOverride = 1U;
+            value.level = 1U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 1U;
+            value.optionsOverride        = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
                                value, chip::NullOptional
 
@@ -16663,8 +16722,9 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::Move::Type value;
-            value.moveMode        = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
-            value.rate            = 5U;
+            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
+            value.rate.SetNonNull();
+            value.rate.Value()    = 5U;
             value.optionsMask     = 1U;
             value.optionsOverride = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
@@ -16713,8 +16773,9 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::Move::Type value;
-            value.moveMode        = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
-            value.rate            = 5U;
+            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
+            value.rate.SetNonNull();
+            value.rate.Value()    = 5U;
             value.optionsMask     = 1U;
             value.optionsOverride = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
@@ -56236,9 +56297,10 @@
         case 3:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 1U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 1U));
             }
             break;
         case 4:
@@ -56298,9 +56360,10 @@
         case 14:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 254U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 254U));
             }
             break;
         case 15:
@@ -56321,9 +56384,10 @@
         case 18:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 1U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 1U));
             }
             break;
         case 19:
@@ -56336,9 +56400,10 @@
         case 21:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 127U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 127U));
             }
             break;
         case 22:
@@ -56374,9 +56439,10 @@
         case 28:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 127U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 127U));
             }
             break;
         case 29:
@@ -56397,9 +56463,10 @@
         case 32:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::app::DataModel::Nullable<uint8_t> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
-                VerifyOrReturn(CheckValue("currentLevel", value, 127U));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 127U));
             }
             break;
         default:
@@ -56425,13 +56492,14 @@
             return WaitForCommissionee(kIdentityAlpha, value);
         }
         case 1: {
-            LogStep(1, "Sends a MoveToLevel command to set current level to min value");
+            LogStep(1, "Sends a MoveToLevel command to set CurrentLevel to min value");
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 1U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 1U;
-            value.optionsOverride = 1U;
+            value.level = 1U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 1U;
+            value.optionsOverride        = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -56544,13 +56612,14 @@
                                  chip::NullOptional);
         }
         case 19: {
-            LogStep(19, "Sends a MoveToLevel command to set current level to a mid value");
+            LogStep(19, "Sends a MoveToLevel command to set CurrentLevel to a mid value");
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
-            value.level           = 127U;
-            value.transitionTime  = 0U;
-            value.optionsMask     = 1U;
-            value.optionsOverride = 1U;
+            value.level = 127U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = 1U;
+            value.optionsOverride        = 1U;
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
index 78979bc..788aab2 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
@@ -4374,7 +4374,11 @@
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.level = [NSNumber numberWithUnsignedChar:mRequest.level];
-        params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime];
+        if (mRequest.transitionTime.IsNull()) {
+            params.transitionTime = nil;
+        } else {
+            params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime.Value()];
+        }
         params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
         params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
@@ -4426,7 +4430,11 @@
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.moveMode = [NSNumber numberWithUnsignedChar:chip::to_underlying(mRequest.moveMode)];
-        params.rate = [NSNumber numberWithUnsignedChar:mRequest.rate];
+        if (mRequest.rate.IsNull()) {
+            params.rate = nil;
+        } else {
+            params.rate = [NSNumber numberWithUnsignedChar:mRequest.rate.Value()];
+        }
         params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
         params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
@@ -4480,7 +4488,11 @@
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.stepMode = [NSNumber numberWithUnsignedChar:chip::to_underlying(mRequest.stepMode)];
         params.stepSize = [NSNumber numberWithUnsignedChar:mRequest.stepSize];
-        params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime];
+        if (mRequest.transitionTime.IsNull()) {
+            params.transitionTime = nil;
+        } else {
+            params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime.Value()];
+        }
         params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
         params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
@@ -4580,7 +4592,11 @@
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.level = [NSNumber numberWithUnsignedChar:mRequest.level];
-        params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime];
+        if (mRequest.transitionTime.IsNull()) {
+            params.transitionTime = nil;
+        } else {
+            params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime.Value()];
+        }
         params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
         params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
@@ -4632,7 +4648,11 @@
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.moveMode = [NSNumber numberWithUnsignedChar:chip::to_underlying(mRequest.moveMode)];
-        params.rate = [NSNumber numberWithUnsignedChar:mRequest.rate];
+        if (mRequest.rate.IsNull()) {
+            params.rate = nil;
+        } else {
+            params.rate = [NSNumber numberWithUnsignedChar:mRequest.rate.Value()];
+        }
         params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
         params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
@@ -4686,7 +4706,11 @@
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.stepMode = [NSNumber numberWithUnsignedChar:chip::to_underlying(mRequest.stepMode)];
         params.stepSize = [NSNumber numberWithUnsignedChar:mRequest.stepSize];
-        params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime];
+        if (mRequest.transitionTime.IsNull()) {
+            params.transitionTime = nil;
+        } else {
+            params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime.Value()];
+        }
         params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
         params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
diff --git a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
index 42a4b8c..6dfc371 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
@@ -22984,7 +22984,7 @@
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
     }
-    NSNumber * _Nonnull CurrentLevelValue;
+    NSNumber * _Nullable CurrentLevelValue;
 
     CHIP_ERROR TestReadsTheCurrentLevelAttribute_1()
     {
@@ -22999,9 +22999,12 @@
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
-            VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
-            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
-            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 255U));
+            if (value != nil) {
+
+                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
+                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
+                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 255U));
+            }
             {
                 CurrentLevelValue = value;
             }
@@ -23051,7 +23054,7 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("min level", actualValue, 1U));
+                VerifyOrReturn(CheckValue("MinLevel", actualValue, 1U));
             }
 
             VerifyOrReturn(CheckConstraintType("minLevel", "int8u", "int8u"));
@@ -23108,7 +23111,7 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("max level", actualValue, 254U));
+                VerifyOrReturn(CheckValue("MaxLevel", actualValue, 254U));
             }
 
             VerifyOrReturn(CheckConstraintType("maxLevel", "int8u", "int8u"));
@@ -23164,9 +23167,12 @@
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
-            VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
-            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], MinLevelValue));
-            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], MaxLevelValue));
+            if (value != nil) {
+
+                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
+                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], MinLevelValue));
+                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], MaxLevelValue));
+            }
 
             NextTest();
         }];
@@ -23187,11 +23193,14 @@
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
-            VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
-            VerifyOrReturn(
-                CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], MinLevelFeatureMapNotSupportedValue));
-            VerifyOrReturn(
-                CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], MaxLevelFeatureMapNotSupportedValue));
+            if (value != nil) {
+
+                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
+                VerifyOrReturn(CheckConstraintMinValue<uint8_t>(
+                    "currentLevel", [value unsignedCharValue], MinLevelFeatureMapNotSupportedValue));
+                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>(
+                    "currentLevel", [value unsignedCharValue], MaxLevelFeatureMapNotSupportedValue));
+            }
 
             NextTest();
         }];
@@ -23469,7 +23478,7 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("options", actualValue, 0U));
+                VerifyOrReturn(CheckValue("Options", actualValue, 0U));
             }
 
             VerifyOrReturn(CheckConstraintType("options", "bitmap8", "bitmap8"));
@@ -23876,7 +23885,7 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("on off transition time", actualValue,
+                VerifyOrReturn(CheckValue("OnOffTransitionTime", actualValue,
                     mOnOffTransitionTimeConfigValue.HasValue() ? mOnOffTransitionTimeConfigValue.Value() : 10U));
             }
 
@@ -23957,9 +23966,9 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValueNonNull("on level", actualValue));
+                VerifyOrReturn(CheckValueNonNull("OnLevel", actualValue));
                 VerifyOrReturn(
-                    CheckValue("on level", actualValue, mOnLevelConfigValue.HasValue() ? mOnLevelConfigValue.Value() : 5U));
+                    CheckValue("OnLevel", actualValue, mOnLevelConfigValue.HasValue() ? mOnLevelConfigValue.Value() : 5U));
             }
             if (value != nil) {
 
@@ -24042,8 +24051,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValueNonNull("on transition time", actualValue));
-                VerifyOrReturn(CheckValue("on transition time", actualValue,
+                VerifyOrReturn(CheckValueNonNull("OnTransitionTime", actualValue));
+                VerifyOrReturn(CheckValue("OnTransitionTime", actualValue,
                     mOnTransitionTimeConfigValue.HasValue() ? mOnTransitionTimeConfigValue.Value() : 5U));
             }
             if (value != nil) {
@@ -24127,8 +24136,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValueNonNull("off transition time", actualValue));
-                VerifyOrReturn(CheckValue("off transition time", actualValue,
+                VerifyOrReturn(CheckValueNonNull("OffTransitionTime", actualValue));
+                VerifyOrReturn(CheckValue("OffTransitionTime", actualValue,
                     mOffTransitionTimeConfigValue.HasValue() ? mOffTransitionTimeConfigValue.Value() : 10U));
             }
             if (value != nil) {
@@ -24212,8 +24221,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValueNonNull("default move rate", actualValue));
-                VerifyOrReturn(CheckValue("default move rate", actualValue,
+                VerifyOrReturn(CheckValueNonNull("DefaultMoveRate", actualValue));
+                VerifyOrReturn(CheckValue("DefaultMoveRate", actualValue,
                     mDefaultMoveRateConfigValue.HasValue() ? mDefaultMoveRateConfigValue.Value() : 111U));
             }
             if (value != nil) {
@@ -24297,8 +24306,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValueNonNull("start up current level", actualValue));
-                VerifyOrReturn(CheckValue("start up current level", actualValue,
+                VerifyOrReturn(CheckValueNonNull("StartUpCurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("StartUpCurrentLevel", actualValue,
                     mStartUpCurrentLevelConfigValue.HasValue() ? mStartUpCurrentLevelConfigValue.Value() : 5U));
             }
             if (value != nil) {
@@ -25097,7 +25106,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 64U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 64U));
             }
 
             NextTest();
@@ -25153,7 +25163,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 100U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
             }
 
             NextTest();
@@ -25209,7 +25220,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 128U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 128U));
             }
 
             NextTest();
@@ -25251,7 +25263,7 @@
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
         params.level = [NSNumber numberWithUnsignedChar:64U];
-        params.transitionTime = [NSNumber numberWithUnsignedShort:65535U];
+        params.transitionTime = nil;
         params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
         params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
         [cluster moveToLevelWithParams:params
@@ -25288,7 +25300,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 64U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 64U));
             }
 
             NextTest();
@@ -25334,7 +25347,7 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("options", actualValue, 0U));
+                VerifyOrReturn(CheckValue("Options", actualValue, 0U));
             }
 
             NextTest();
@@ -25407,7 +25420,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 100U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
             }
 
             NextTest();
@@ -25480,7 +25494,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 100U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
             }
 
             NextTest();
@@ -25536,7 +25551,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 100U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
             }
 
             NextTest();
@@ -25592,7 +25608,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 160U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 160U));
             }
 
             NextTest();
@@ -25638,7 +25655,7 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("options", actualValue, 1U));
+                VerifyOrReturn(CheckValue("Options", actualValue, 1U));
             }
 
             NextTest();
@@ -25711,7 +25728,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 100U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
             }
 
             NextTest();
@@ -25784,7 +25802,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 120U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 120U));
             }
 
             NextTest();
@@ -25840,7 +25859,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 120U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 120U));
             }
 
             NextTest();
@@ -25896,7 +25916,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 160U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 160U));
             }
 
             NextTest();
@@ -26028,7 +26049,7 @@
             err = TestSendsAMoveToLevelWithOnOffCommand_5();
             break;
         case 6:
-            ChipLogProgress(chipTool, " ***** Test Step 6 : reads max level attribute from DUT\n");
+            ChipLogProgress(chipTool, " ***** Test Step 6 : reads MaxLevel attribute from DUT\n");
             if (ShouldSkip("LVL.S.A0003")) {
                 NextTest();
                 return;
@@ -26096,7 +26117,7 @@
             err = TestReadsCurrentLevelAttributeFromDut_14();
             break;
         case 15:
-            ChipLogProgress(chipTool, " ***** Test Step 15 : reads default move rate attribute from DUT\n");
+            ChipLogProgress(chipTool, " ***** Test Step 15 : reads DefaultMoveRate attribute from DUT\n");
             if (ShouldSkip("LVL.S.A0014")) {
                 NextTest();
                 return;
@@ -26104,7 +26125,7 @@
             err = TestReadsDefaultMoveRateAttributeFromDut_15();
             break;
         case 16:
-            ChipLogProgress(chipTool, " ***** Test Step 16 : sends a Move up command at default move rate\n");
+            ChipLogProgress(chipTool, " ***** Test Step 16 : sends a Move up command at DefaultMoveRate\n");
             if (ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0014")) {
                 NextTest();
                 return;
@@ -26302,7 +26323,7 @@
 
         return CHIP_NO_ERROR;
     }
-    NSNumber * _Nonnull MinlevelValue;
+    NSNumber * _Nonnull MinimumLevelValue;
 
     CHIP_ERROR TestReadsMinlevelAttributeFromDut_4()
     {
@@ -26321,7 +26342,7 @@
             VerifyOrReturn(CheckConstraintMinValue<uint8_t>("minLevel", [value unsignedCharValue], 0U));
             VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("minLevel", [value unsignedCharValue], 255U));
             {
-                MinlevelValue = value;
+                MinimumLevelValue = value;
             }
 
             NextTest();
@@ -26354,7 +26375,7 @@
 
         return CHIP_NO_ERROR;
     }
-    NSNumber * _Nonnull MaxlevelValue;
+    NSNumber * _Nonnull MaximumLevelValue;
 
     CHIP_ERROR TestReadsMaxLevelAttributeFromDut_6()
     {
@@ -26365,7 +26386,7 @@
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxLevelWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            NSLog(@"reads max level attribute from DUT Error: %@", err);
+            NSLog(@"reads MaxLevel attribute from DUT Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
@@ -26373,7 +26394,7 @@
             VerifyOrReturn(CheckConstraintMinValue<uint8_t>("maxLevel", [value unsignedCharValue], 0U));
             VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("maxLevel", [value unsignedCharValue], 255U));
             {
-                MaxlevelValue = value;
+                MaximumLevelValue = value;
             }
 
             NextTest();
@@ -26439,7 +26460,17 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, MaxlevelValue));
+                if (MaximumLevelValue == nil) {
+                    VerifyOrReturn(CheckValueNull("CurrentLevel", actualValue));
+                } else {
+                    VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                    VerifyOrReturn(CheckValue("CurrentLevel", actualValue, MaximumLevelValue));
+                }
+            }
+            if (value != nil) {
+
+                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
+                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 255U));
             }
 
             NextTest();
@@ -26505,11 +26536,18 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, MinlevelValue));
+                if (MinimumLevelValue == nil) {
+                    VerifyOrReturn(CheckValueNull("CurrentLevel", actualValue));
+                } else {
+                    VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                    VerifyOrReturn(CheckValue("CurrentLevel", actualValue, MinimumLevelValue));
+                }
             }
+            if (value != nil) {
 
-            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
-            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 255U));
+                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
+                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 255U));
+            }
 
             NextTest();
         }];
@@ -26527,7 +26565,7 @@
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDefaultMoveRateWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            NSLog(@"reads default move rate attribute from DUT Error: %@", err);
+            NSLog(@"reads DefaultMoveRate attribute from DUT Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
@@ -26557,12 +26595,12 @@
 
         __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
         params.moveMode = [NSNumber numberWithUnsignedChar:0U];
-        params.rate = [NSNumber numberWithUnsignedChar:255U];
+        params.rate = nil;
         params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
         params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
         [cluster moveWithParams:params
               completionHandler:^(NSError * _Nullable err) {
-                  NSLog(@"sends a Move up command at default move rate Error: %@", err);
+                  NSLog(@"sends a Move up command at DefaultMoveRate Error: %@", err);
 
                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
@@ -26719,7 +26757,7 @@
             err = TestSendsMoveToLevelWithOnOffCommandToDut_6();
             break;
         case 7:
-            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads current level attribute from DUT\n");
+            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads CurrentLevel attribute from DUT\n");
             if (ShouldSkip("LVL.S.A0000 && LVL.S.C04.Rsp")) {
                 NextTest();
                 return;
@@ -26727,7 +26765,7 @@
             err = TestReadsCurrentLevelAttributeFromDut_7();
             break;
         case 8:
-            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads current level attribute from DUT\n");
+            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads CurrentLevel attribute from DUT\n");
             if (ShouldSkip("LVL.S.A0000 && !LVL.S.A0002 && LVL.S.C04.Rsp")) {
                 NextTest();
                 return;
@@ -26755,7 +26793,7 @@
             err = TestWait2500ms_11();
             break;
         case 12:
-            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads current level attribute from DUT\n");
+            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads CurrentLevel attribute from DUT\n");
             if (ShouldSkip("LVL.S.A0000 && LVL.S.C02.Rsp && LVL.S.M.VarRate")) {
                 NextTest();
                 return;
@@ -26763,7 +26801,7 @@
             err = TestReadsCurrentLevelAttributeFromDut_12();
             break;
         case 13:
-            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads current level attribute from DUT\n");
+            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads CurrentLevel attribute from DUT\n");
             if (ShouldSkip("LVL.S.A0000 && LVL.S.C02.Rsp && !LVL.S.M.VarRate")) {
                 NextTest();
                 return;
@@ -26791,7 +26829,7 @@
             err = TestWait2500ms_16();
             break;
         case 17:
-            ChipLogProgress(chipTool, " ***** Test Step 17 : Reads current level attribute from DUT\n");
+            ChipLogProgress(chipTool, " ***** Test Step 17 : Reads CurrentLevel attribute from DUT\n");
             if (ShouldSkip("LVL.S.C06.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                 NextTest();
                 return;
@@ -26799,7 +26837,7 @@
             err = TestReadsCurrentLevelAttributeFromDut_17();
             break;
         case 18:
-            ChipLogProgress(chipTool, " ***** Test Step 18 : Reads current level attribute from DUT\n");
+            ChipLogProgress(chipTool, " ***** Test Step 18 : Reads CurrentLevel attribute from DUT\n");
             if (ShouldSkip("LVL.S.C06.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate")) {
                 NextTest();
                 return;
@@ -26807,7 +26845,7 @@
             err = TestReadsCurrentLevelAttributeFromDut_18();
             break;
         case 19:
-            ChipLogProgress(chipTool, " ***** Test Step 19 : Reads current level attribute from DUT\n");
+            ChipLogProgress(chipTool, " ***** Test Step 19 : Reads CurrentLevel attribute from DUT\n");
             if (ShouldSkip("LVL.S.C06.Rsp && LVL.S.A0000 && !LVL.S.A0002 && LVL.S.M.VarRate")) {
                 NextTest();
                 return;
@@ -26815,7 +26853,7 @@
             err = TestReadsCurrentLevelAttributeFromDut_19();
             break;
         case 20:
-            ChipLogProgress(chipTool, " ***** Test Step 20 : Reads current level attribute from DUT\n");
+            ChipLogProgress(chipTool, " ***** Test Step 20 : Reads CurrentLevel attribute from DUT\n");
             if (ShouldSkip("LVL.S.C06.Rsp && LVL.S.A0000 && !LVL.S.A0002 && !LVL.S.M.VarRate")) {
                 NextTest();
                 return;
@@ -27082,7 +27120,7 @@
 
         return CHIP_NO_ERROR;
     }
-    NSNumber * _Nonnull CurrentlevelValue;
+    NSNumber * _Nullable CurrentlevelValue;
 
     CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_7()
     {
@@ -27093,18 +27131,21 @@
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            NSLog(@"Reads current level attribute from DUT Error: %@", err);
+            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, [MinlevelValue unsignedCharValue] + 1U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, [MinlevelValue unsignedCharValue] + 1U));
             }
+            if (value != nil) {
 
-            VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
-            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
-            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 254U));
+                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
+                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
+                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 254U));
+            }
             {
                 CurrentlevelValue = value;
             }
@@ -27124,18 +27165,21 @@
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            NSLog(@"Reads current level attribute from DUT Error: %@", err);
+            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 2U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 2U));
             }
+            if (value != nil) {
 
-            VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
-            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
-            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 254U));
+                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
+                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
+                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 254U));
+            }
 
             NextTest();
         }];
@@ -27211,16 +27255,20 @@
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            NSLog(@"Reads current level attribute from DUT Error: %@", err);
+            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 66U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 66U));
+            }
+            if (value != nil) {
+
+                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
             }
 
-            VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
             NextTest();
         }];
 
@@ -27236,16 +27284,20 @@
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            NSLog(@"Reads current level attribute from DUT Error: %@", err);
+            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 66U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 66U));
+            }
+            if (value != nil) {
+
+                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
             }
 
-            VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
             NextTest();
         }];
 
@@ -27320,13 +27372,18 @@
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            NSLog(@"Reads current level attribute from DUT Error: %@", err);
+            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, CurrentlevelValue));
+                if (CurrentlevelValue == nil) {
+                    VerifyOrReturn(CheckValueNull("CurrentLevel", actualValue));
+                } else {
+                    VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                    VerifyOrReturn(CheckValue("CurrentLevel", actualValue, CurrentlevelValue));
+                }
             }
 
             NextTest();
@@ -27344,13 +27401,18 @@
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            NSLog(@"Reads current level attribute from DUT Error: %@", err);
+            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, CurrentlevelValue));
+                if (CurrentlevelValue == nil) {
+                    VerifyOrReturn(CheckValueNull("CurrentLevel", actualValue));
+                } else {
+                    VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                    VerifyOrReturn(CheckValue("CurrentLevel", actualValue, CurrentlevelValue));
+                }
             }
 
             NextTest();
@@ -27368,13 +27430,14 @@
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            NSLog(@"Reads current level attribute from DUT Error: %@", err);
+            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 2U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 2U));
             }
 
             NextTest();
@@ -27392,13 +27455,14 @@
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            NSLog(@"Reads current level attribute from DUT Error: %@", err);
+            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 2U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 2U));
             }
 
             NextTest();
@@ -27832,7 +27896,7 @@
 
         return CHIP_NO_ERROR;
     }
-    NSNumber * _Nonnull CurrentLevelValue;
+    NSNumber * _Nullable CurrentLevelValue;
 
     CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_6()
     {
@@ -27847,8 +27911,11 @@
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
-            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
-            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 255U));
+            if (value != nil) {
+
+                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
+                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 255U));
+            }
             {
                 CurrentLevelValue = value;
             }
@@ -27936,8 +28003,11 @@
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
-            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 21U));
-            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 29U));
+            if (value != nil) {
+
+                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 21U));
+                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 29U));
+            }
             VerifyOrReturn(CheckConstraintNotValue("currentLevel", value, CurrentLevelValue));
 
             NextTest();
@@ -28023,8 +28093,11 @@
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
-            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 43U));
-            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 57U));
+            if (value != nil) {
+
+                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 43U));
+                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 57U));
+            }
             VerifyOrReturn(CheckConstraintNotValue("currentLevel", value, CurrentLevelValue));
 
             NextTest();
@@ -96984,7 +97057,7 @@
             err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
             break;
         case 1:
-            ChipLogProgress(chipTool, " ***** Test Step 1 : Sends a MoveToLevel command to set current level to min value\n");
+            ChipLogProgress(chipTool, " ***** Test Step 1 : Sends a MoveToLevel command to set CurrentLevel to min value\n");
             err = TestSendsAMoveToLevelCommandToSetCurrentLevelToMinValue_1();
             break;
         case 2:
@@ -97056,7 +97129,7 @@
             err = TestIfOnLevelIsDefinedCheckCurrentLevelIsMinValue_18();
             break;
         case 19:
-            ChipLogProgress(chipTool, " ***** Test Step 19 : Sends a MoveToLevel command to set current level to a mid value\n");
+            ChipLogProgress(chipTool, " ***** Test Step 19 : Sends a MoveToLevel command to set CurrentLevel to a mid value\n");
             err = TestSendsAMoveToLevelCommandToSetCurrentLevelToAMidValue_19();
             break;
         case 20:
@@ -97263,7 +97336,7 @@
         params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
         [cluster moveToLevelWithParams:params
                      completionHandler:^(NSError * _Nullable err) {
-                         NSLog(@"Sends a MoveToLevel command to set current level to min value Error: %@", err);
+                         NSLog(@"Sends a MoveToLevel command to set CurrentLevel to min value Error: %@", err);
 
                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
@@ -97295,7 +97368,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 1U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 1U));
             }
 
             NextTest();
@@ -97348,7 +97422,7 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("on off transition time", actualValue, 0U));
+                VerifyOrReturn(CheckValue("OnOffTransitionTime", actualValue, 0U));
             }
 
             NextTest();
@@ -97401,8 +97475,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValueNonNull("on level", actualValue));
-                VerifyOrReturn(CheckValue("on level", actualValue, 254U));
+                VerifyOrReturn(CheckValueNonNull("OnLevel", actualValue));
+                VerifyOrReturn(CheckValue("OnLevel", actualValue, 254U));
             }
 
             NextTest();
@@ -97426,7 +97500,7 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("min level", actualValue, 1U));
+                VerifyOrReturn(CheckValue("MinLevel", actualValue, 1U));
             }
 
             NextTest();
@@ -97496,7 +97570,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 254U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 254U));
             }
 
             NextTest();
@@ -97566,7 +97641,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 1U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 1U));
             }
 
             NextTest();
@@ -97590,7 +97666,7 @@
         params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
         [cluster moveToLevelWithParams:params
                      completionHandler:^(NSError * _Nullable err) {
-                         NSLog(@"Sends a MoveToLevel command to set current level to a mid value Error: %@", err);
+                         NSLog(@"Sends a MoveToLevel command to set CurrentLevel to a mid value Error: %@", err);
 
                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
 
@@ -97622,7 +97698,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 127U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 127U));
             }
 
             NextTest();
@@ -97675,7 +97752,7 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValueNull("on level", actualValue));
+                VerifyOrReturn(CheckValueNull("OnLevel", actualValue));
             }
 
             NextTest();
@@ -97745,7 +97822,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 127U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 127U));
             }
 
             NextTest();
@@ -97815,7 +97893,8 @@
 
             {
                 id actualValue = value;
-                VerifyOrReturn(CheckValue("current level", actualValue, 127U));
+                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
+                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 127U));
             }
 
             NextTest();
diff --git a/zzz_generated/lighting-app/zap-generated/access.h b/zzz_generated/lighting-app/zap-generated/access.h
index 46ba904..9bec66a 100644
--- a/zzz_generated/lighting-app/zap-generated/access.h
+++ b/zzz_generated/lighting-app/zap-generated/access.h
@@ -30,7 +30,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__CLUSTER { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -55,7 +55,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__ATTRIBUTE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -80,7 +80,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__PRIVILEGE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -107,7 +107,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__CLUSTER { \
     6, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    8, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    8, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     40, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -123,7 +123,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__ATTRIBUTE { \
     16387, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    16384, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    16384, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     5, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -139,7 +139,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__PRIVILEGE { \
     kMatterAccessPrivilegeManage, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     kMatterAccessPrivilegeManage, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
diff --git a/zzz_generated/lighting-app/zap-generated/endpoint_config.h b/zzz_generated/lighting-app/zap-generated/endpoint_config.h
index 0eadabd..fb85f25 100644
--- a/zzz_generated/lighting-app/zap-generated/endpoint_config.h
+++ b/zzz_generated/lighting-app/zap-generated/endpoint_config.h
@@ -89,7 +89,7 @@
             { (uint16_t) 0xFF, (uint16_t) 0x0, (uint16_t) 0x2 }, /* StartUpOnOff */                                                \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* options */                                                      \
+            { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* Options */                                                      \
                                                                                                                                    \
         /* Endpoint: 1, Cluster: Color Control (server) */                                                                         \
         {                                                                                                                          \
@@ -473,28 +473,29 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },   /* ClusterRevision */                                 \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE), ZAP_SIMPLE_DEFAULT(0x01) }, /* current level */        \
-            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* remaining time */       \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },                            /* min level */            \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },                            /* max level */            \
-            { 0x00000004, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* current frequency */    \
-            { 0x00000005, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* min frequency */        \
-            { 0x00000006, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* max frequency */        \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
+              ZAP_SIMPLE_DEFAULT(0x01) },                                       /* CurrentLevel */                                 \
+            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* RemainingTime */                                \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) },    /* MinLevel */                                     \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFE) },    /* MaxLevel */                                     \
+            { 0x00000004, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* CurrentFrequency */                             \
+            { 0x00000005, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* MinFrequency */                                 \
+            { 0x00000006, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* MaxFrequency */                                 \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* Options */                                                                       \
             { 0x00000010, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE),                                                       \
-              ZAP_SIMPLE_DEFAULT(0x0000) }, /* on off transition time */                                                           \
+              ZAP_SIMPLE_DEFAULT(0x0000) }, /* OnOffTransitionTime */                                                              \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFF) }, /* on level */                                                                           \
+              ZAP_SIMPLE_DEFAULT(0xFF) }, /* OnLevel */                                                                            \
             { 0x00000012, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                        \
-              ZAP_EMPTY_DEFAULT() }, /* on transition time */                                                                      \
+              ZAP_EMPTY_DEFAULT() }, /* OnTransitionTime */                                                                        \
             { 0x00000013, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                        \
-              ZAP_EMPTY_DEFAULT() }, /* off transition time */                                                                     \
+              ZAP_EMPTY_DEFAULT() }, /* OffTransitionTime */                                                                       \
             { 0x00000014, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(50) }, /* default move rate */                                                                    \
+              ZAP_SIMPLE_DEFAULT(50) }, /* DefaultMoveRate */                                                                      \
             { 0x00004000, ZAP_TYPE(INT8U), 1,                                                                                      \
               ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                          \
-              ZAP_SIMPLE_DEFAULT(255) },                                     /* start up current level */                          \
+              ZAP_SIMPLE_DEFAULT(255) },                                     /* StartUpCurrentLevel */                             \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(3) }, /* FeatureMap */                                      \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
                                                                                                                                    \
diff --git a/zzz_generated/placeholder/app1/zap-generated/endpoint_config.h b/zzz_generated/placeholder/app1/zap-generated/endpoint_config.h
index 7a3260f..21e6dd4 100644
--- a/zzz_generated/placeholder/app1/zap-generated/endpoint_config.h
+++ b/zzz_generated/placeholder/app1/zap-generated/endpoint_config.h
@@ -568,9 +568,9 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },   /* ClusterRevision */                                 \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* current level */                                   \
-            { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(0) }, /* FeatureMap */                                      \
-            { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(NULLABLE), ZAP_SIMPLE_DEFAULT(0x00) }, /* CurrentLevel */         \
+            { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(0) },                            /* FeatureMap */           \
+            { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },                              /* ClusterRevision */      \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Basic (server) */                                                                             \
             { 0x00000000, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) | ZAP_ATTRIBUTE_MASK(SINGLETON),               \
diff --git a/zzz_generated/placeholder/app2/zap-generated/endpoint_config.h b/zzz_generated/placeholder/app2/zap-generated/endpoint_config.h
index 7a3260f..21e6dd4 100644
--- a/zzz_generated/placeholder/app2/zap-generated/endpoint_config.h
+++ b/zzz_generated/placeholder/app2/zap-generated/endpoint_config.h
@@ -568,9 +568,9 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },   /* ClusterRevision */                                 \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* current level */                                   \
-            { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(0) }, /* FeatureMap */                                      \
-            { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(NULLABLE), ZAP_SIMPLE_DEFAULT(0x00) }, /* CurrentLevel */         \
+            { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(0) },                            /* FeatureMap */           \
+            { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },                              /* ClusterRevision */      \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Basic (server) */                                                                             \
             { 0x00000000, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) | ZAP_ATTRIBUTE_MASK(SINGLETON),               \
diff --git a/zzz_generated/pump-app/zap-generated/endpoint_config.h b/zzz_generated/pump-app/zap-generated/endpoint_config.h
index b9414fa..89e8194 100644
--- a/zzz_generated/pump-app/zap-generated/endpoint_config.h
+++ b/zzz_generated/pump-app/zap-generated/endpoint_config.h
@@ -73,7 +73,7 @@
     {                                                                                                                              \
                                                                                                                                    \
         /* Endpoint: 1, Cluster: Level Control (server) */                                                                         \
-        { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* options */                                                          \
+        { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* Options */                                                          \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Pump Configuration and Control (server) */                                                    \
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* OperationMode */                                                \
@@ -271,13 +271,13 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },     /* ClusterRevision */                               \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* current level */                                   \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* min level */                                       \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xC8) }, /* max level */                                       \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(NULLABLE), ZAP_SIMPLE_DEFAULT(0x00) }, /* CurrentLevel */         \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) },                            /* MinLevel */             \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xC8) },                            /* MaxLevel */             \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(0) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(0) }, /* Options */                                                                       \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFF) },                                    /* on level */                                        \
+              ZAP_SIMPLE_DEFAULT(0xFF) },                                    /* OnLevel */                                         \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(1) }, /* FeatureMap */                                      \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
                                                                                                                                    \
diff --git a/zzz_generated/tv-app/zap-generated/access.h b/zzz_generated/tv-app/zap-generated/access.h
index d788c99..a210a00 100644
--- a/zzz_generated/tv-app/zap-generated/access.h
+++ b/zzz_generated/tv-app/zap-generated/access.h
@@ -29,7 +29,7 @@
 
 // Parallel array data (*cluster*, attribute, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__CLUSTER { \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -52,7 +52,7 @@
 
 // Parallel array data (cluster, *attribute*, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__ATTRIBUTE { \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -75,7 +75,7 @@
 
 // Parallel array data (cluster, attribute, *privilege*) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__PRIVILEGE { \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -100,7 +100,7 @@
 
 // Parallel array data (*cluster*, attribute, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__CLUSTER { \
-    8, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    8, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     40, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -114,7 +114,7 @@
 
 // Parallel array data (cluster, *attribute*, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__ATTRIBUTE { \
-    16384, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    16384, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     5, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -128,7 +128,7 @@
 
 // Parallel array data (cluster, attribute, *privilege*) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__PRIVILEGE { \
-    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     kMatterAccessPrivilegeManage, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
diff --git a/zzz_generated/tv-app/zap-generated/endpoint_config.h b/zzz_generated/tv-app/zap-generated/endpoint_config.h
index 34443ed..5e90f65 100644
--- a/zzz_generated/tv-app/zap-generated/endpoint_config.h
+++ b/zzz_generated/tv-app/zap-generated/endpoint_config.h
@@ -144,7 +144,7 @@
             /* Endpoint: 0, Cluster: Unit Localization (server) */                                                                 \
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x2 }, /* TemperatureUnit */                                              \
                                                                                                                                    \
-        /* Endpoint: 2, Cluster: Level Control (server) */ { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 } /* options */        \
+        /* Endpoint: 2, Cluster: Level Control (server) */ { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 } /* Options */        \
     }
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
@@ -591,28 +591,29 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },     /* ClusterRevision */                               \
                                                                                                                                    \
             /* Endpoint: 2, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE), ZAP_SIMPLE_DEFAULT(0x00) }, /* current level */        \
-            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* remaining time */       \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) },                            /* min level */            \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFF) },                            /* max level */            \
-            { 0x00000004, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* current frequency */    \
-            { 0x00000005, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* min frequency */        \
-            { 0x00000006, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* max frequency */        \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
+              ZAP_SIMPLE_DEFAULT(0x00) },                                       /* CurrentLevel */                                 \
+            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* RemainingTime */                                \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) },    /* MinLevel */                                     \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFF) },    /* MaxLevel */                                     \
+            { 0x00000004, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* CurrentFrequency */                             \
+            { 0x00000005, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* MinFrequency */                                 \
+            { 0x00000006, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* MaxFrequency */                                 \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(2) }, /* Options */                                                                       \
             { 0x00000010, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE),                                                       \
-              ZAP_SIMPLE_DEFAULT(0x0000) }, /* on off transition time */                                                           \
+              ZAP_SIMPLE_DEFAULT(0x0000) }, /* OnOffTransitionTime */                                                              \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFE) }, /* on level */                                                                           \
+              ZAP_SIMPLE_DEFAULT(0xFE) }, /* OnLevel */                                                                            \
             { 0x00000012, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                        \
-              ZAP_EMPTY_DEFAULT() }, /* on transition time */                                                                      \
+              ZAP_EMPTY_DEFAULT() }, /* OnTransitionTime */                                                                        \
             { 0x00000013, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                        \
-              ZAP_EMPTY_DEFAULT() }, /* off transition time */                                                                     \
+              ZAP_EMPTY_DEFAULT() }, /* OffTransitionTime */                                                                       \
             { 0x00000014, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_EMPTY_DEFAULT() }, /* default move rate */                                                                       \
+              ZAP_EMPTY_DEFAULT() }, /* DefaultMoveRate */                                                                         \
             { 0x00004000, ZAP_TYPE(INT8U), 1,                                                                                      \
               ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                          \
-              ZAP_SIMPLE_DEFAULT(255) },                                     /* start up current level */                          \
+              ZAP_SIMPLE_DEFAULT(255) },                                     /* StartUpCurrentLevel */                             \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(1) }, /* FeatureMap */                                      \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
                                                                                                                                    \
diff --git a/zzz_generated/tv-casting-app/zap-generated/access.h b/zzz_generated/tv-casting-app/zap-generated/access.h
index 5dc37fc..2cd9738 100644
--- a/zzz_generated/tv-casting-app/zap-generated/access.h
+++ b/zzz_generated/tv-casting-app/zap-generated/access.h
@@ -30,7 +30,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__CLUSTER { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -54,7 +54,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__ATTRIBUTE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -78,7 +78,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for read attribute
 #define GENERATED_ACCESS_READ_ATTRIBUTE__PRIVILEGE { \
     /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: view */ \
-    /* Cluster: Level Control, Attribute: start up current level, Privilege: view */ \
+    /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
@@ -104,7 +104,7 @@
 // Parallel array data (*cluster*, attribute, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__CLUSTER { \
     6, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    8, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    8, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     31, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     31, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     40, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -119,7 +119,7 @@
 // Parallel array data (cluster, *attribute*, privilege) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__ATTRIBUTE { \
     16387, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    16384, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    16384, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     0, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     1, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     5, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
@@ -134,7 +134,7 @@
 // Parallel array data (cluster, attribute, *privilege*) for write attribute
 #define GENERATED_ACCESS_WRITE_ATTRIBUTE__PRIVILEGE { \
     kMatterAccessPrivilegeManage, /* Cluster: On/Off, Attribute: StartUpOnOff, Privilege: manage */ \
-    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: start up current level, Privilege: manage */ \
+    kMatterAccessPrivilegeManage, /* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: manage */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
     kMatterAccessPrivilegeAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
     kMatterAccessPrivilegeManage, /* Cluster: Basic, Attribute: NodeLabel, Privilege: manage */ \
diff --git a/zzz_generated/tv-casting-app/zap-generated/endpoint_config.h b/zzz_generated/tv-casting-app/zap-generated/endpoint_config.h
index f3a0b88..b39b2f0 100644
--- a/zzz_generated/tv-casting-app/zap-generated/endpoint_config.h
+++ b/zzz_generated/tv-casting-app/zap-generated/endpoint_config.h
@@ -92,7 +92,7 @@
             { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x2 }, /* StartUpOnOff */                                                 \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* options */                                                      \
+            { (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x3 }, /* Options */                                                      \
                                                                                                                                    \
         /* Endpoint: 1, Cluster: Binary Input (Basic) (server) */                                                                  \
         {                                                                                                                          \
@@ -483,28 +483,29 @@
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(4) },        /* ClusterRevision */                            \
                                                                                                                                    \
             /* Endpoint: 1, Cluster: Level Control (server) */                                                                     \
-            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE), ZAP_SIMPLE_DEFAULT(0x00) }, /* current level */        \
-            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* remaining time */       \
-            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) },                            /* min level */            \
-            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFF) },                            /* max level */            \
-            { 0x00000004, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* current frequency */    \
-            { 0x00000005, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* min frequency */        \
-            { 0x00000006, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) },                         /* max frequency */        \
+            { 0x00000000, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
+              ZAP_SIMPLE_DEFAULT(0x00) },                                       /* CurrentLevel */                                 \
+            { 0x00000001, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* RemainingTime */                                \
+            { 0x00000002, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) },    /* MinLevel */                                     \
+            { 0x00000003, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xFF) },    /* MaxLevel */                                     \
+            { 0x00000004, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* CurrentFrequency */                             \
+            { 0x00000005, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* MinFrequency */                                 \
+            { 0x00000006, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* MaxFrequency */                                 \
             { 0x0000000F, ZAP_TYPE(BITMAP8), 1, ZAP_ATTRIBUTE_MASK(MIN_MAX) | ZAP_ATTRIBUTE_MASK(WRITABLE),                        \
-              ZAP_MIN_MAX_DEFAULTS_INDEX(3) }, /* options */                                                                       \
+              ZAP_MIN_MAX_DEFAULTS_INDEX(3) }, /* Options */                                                                       \
             { 0x00000010, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE),                                                       \
-              ZAP_SIMPLE_DEFAULT(0x0000) }, /* on off transition time */                                                           \
+              ZAP_SIMPLE_DEFAULT(0x0000) }, /* OnOffTransitionTime */                                                              \
             { 0x00000011, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_SIMPLE_DEFAULT(0xFE) }, /* on level */                                                                           \
+              ZAP_SIMPLE_DEFAULT(0xFE) }, /* OnLevel */                                                                            \
             { 0x00000012, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                        \
-              ZAP_EMPTY_DEFAULT() }, /* on transition time */                                                                      \
+              ZAP_EMPTY_DEFAULT() }, /* OnTransitionTime */                                                                        \
             { 0x00000013, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                        \
-              ZAP_EMPTY_DEFAULT() }, /* off transition time */                                                                     \
+              ZAP_EMPTY_DEFAULT() }, /* OffTransitionTime */                                                                       \
             { 0x00000014, ZAP_TYPE(INT8U), 1, ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                         \
-              ZAP_EMPTY_DEFAULT() }, /* default move rate */                                                                       \
+              ZAP_EMPTY_DEFAULT() }, /* DefaultMoveRate */                                                                         \
             { 0x00004000, ZAP_TYPE(INT8U), 1,                                                                                      \
               ZAP_ATTRIBUTE_MASK(TOKENIZE) | ZAP_ATTRIBUTE_MASK(WRITABLE) | ZAP_ATTRIBUTE_MASK(NULLABLE),                          \
-              ZAP_SIMPLE_DEFAULT(255) },                                     /* start up current level */                          \
+              ZAP_SIMPLE_DEFAULT(255) },                                     /* StartUpCurrentLevel */                             \
             { 0x0000FFFC, ZAP_TYPE(BITMAP32), 4, 0, ZAP_SIMPLE_DEFAULT(1) }, /* FeatureMap */                                      \
             { 0x0000FFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(5) },   /* ClusterRevision */                                 \
                                                                                                                                    \