Fixed wrong datamodel in Level Cluster (#23656)

Added: Cluster code to LevelControlOptions Bitmap
Fixed: LevelControlOptions was defined wrong as Enum, Changed it to a Bitmap
Changed/Fixed: Level Cluster Attribute 15 (OPTIONS) datatype from BITMAP8 to LevelControlOptions (Bitmap8) type
Changed/Fixed: Level Command datatype for 'OptionsMask' and 'OptionsOverride' from BITMAP8 to LevelControlOptions
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 62cf857..4f87fd2 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,6 +300,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
@@ -307,7 +312,7 @@
   readonly attribute int16u currentFrequency = 4;
   readonly attribute int16u minFrequency = 5;
   readonly attribute int16u maxFrequency = 6;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute int16u onOffTransitionTime = 16;
   attribute nullable int8u onLevel = 17;
   attribute nullable int16u onTransitionTime = 18;
@@ -320,55 +325,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
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 9c29b7e..65d9b42 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,8 +269,13 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute nullable int8u onLevel = 17;
   readonly attribute bitmap32 featureMap = 65532;
   readonly attribute int16u clusterRevision = 65533;
@@ -278,55 +283,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/bridge-app/bridge-common/bridge-app.matter b/examples/bridge-app/bridge-common/bridge-app.matter
index df5f85e..935c1c8 100644
--- a/examples/bridge-app/bridge-common/bridge-app.matter
+++ b/examples/bridge-app/bridge-common/bridge-app.matter
@@ -105,6 +105,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
@@ -112,7 +117,7 @@
   readonly attribute int16u currentFrequency = 4;
   readonly attribute int16u minFrequency = 5;
   readonly attribute int16u maxFrequency = 6;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute int16u onOffTransitionTime = 16;
   attribute nullable int8u onLevel = 17;
   attribute nullable int16u onTransitionTime = 18;
@@ -125,55 +130,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter
index 46a52ab..e7583f9 100644
--- a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter
+++ b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter
@@ -169,11 +169,16 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute nullable int8u onLevel = 17;
   attribute access(write: manage) nullable int8u startUpCurrentLevel = 16384;
   readonly attribute command_id generatedCommandList[] = 65528;
@@ -185,55 +190,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter b/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter
index f5684bb..691f043 100644
--- a/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter
+++ b/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter
@@ -189,9 +189,14 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute nullable int8u onLevel = 17;
   attribute access(write: manage) nullable int8u startUpCurrentLevel = 16384;
   readonly attribute command_id generatedCommandList[] = 65528;
@@ -203,55 +208,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter
index 49f75ce..4ef2b98 100644
--- a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter
+++ b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter
@@ -169,11 +169,16 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute nullable int8u onLevel = 17;
   attribute access(write: manage) nullable int8u startUpCurrentLevel = 16384;
   readonly attribute command_id generatedCommandList[] = 65528;
@@ -185,55 +190,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter
index e576750..6266fa4 100644
--- a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter
+++ b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter
@@ -169,11 +169,16 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute nullable int8u onLevel = 17;
   attribute access(write: manage) nullable int8u startUpCurrentLevel = 16384;
   readonly attribute command_id generatedCommandList[] = 65528;
@@ -185,55 +190,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
index d0ee4e4..e8b1081 100644
--- a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
+++ b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
@@ -165,6 +165,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
@@ -178,55 +183,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter
index c87555b..de8ed09 100644
--- a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter
+++ b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter
@@ -169,11 +169,16 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute nullable int8u onLevel = 17;
   attribute access(write: manage) nullable int8u startUpCurrentLevel = 16384;
   readonly attribute command_id generatedCommandList[] = 65528;
@@ -185,55 +190,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter
index 7144dd9..acc8ff4 100644
--- a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter
+++ b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter
@@ -162,10 +162,15 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute nullable int8u onLevel = 17;
   readonly attribute command_id generatedCommandList[] = 65528;
   readonly attribute command_id acceptedCommandList[] = 65529;
@@ -176,55 +181,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/dynamic-bridge-app/bridge-common/bridge-app.matter b/examples/dynamic-bridge-app/bridge-common/bridge-app.matter
index df5f85e..935c1c8 100644
--- a/examples/dynamic-bridge-app/bridge-common/bridge-app.matter
+++ b/examples/dynamic-bridge-app/bridge-common/bridge-app.matter
@@ -105,6 +105,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
@@ -112,7 +117,7 @@
   readonly attribute int16u currentFrequency = 4;
   readonly attribute int16u minFrequency = 5;
   readonly attribute int16u maxFrequency = 6;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute int16u onOffTransitionTime = 16;
   attribute nullable int8u onLevel = 17;
   attribute nullable int16u onTransitionTime = 18;
@@ -125,55 +130,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/lighting-app/lighting-common/lighting-app.matter b/examples/lighting-app/lighting-common/lighting-app.matter
index d685bdd..68d7564 100644
--- a/examples/lighting-app/lighting-common/lighting-app.matter
+++ b/examples/lighting-app/lighting-common/lighting-app.matter
@@ -185,6 +185,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
@@ -192,7 +197,7 @@
   readonly attribute int16u currentFrequency = 4;
   readonly attribute int16u minFrequency = 5;
   readonly attribute int16u maxFrequency = 6;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute int16u onOffTransitionTime = 16;
   attribute nullable int8u onLevel = 17;
   attribute nullable int16u onTransitionTime = 18;
@@ -205,55 +210,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/lighting-app/nxp/zap/lighting-on-off.matter b/examples/lighting-app/nxp/zap/lighting-on-off.matter
index 273c23c..5a4d282 100644
--- a/examples/lighting-app/nxp/zap/lighting-on-off.matter
+++ b/examples/lighting-app/nxp/zap/lighting-on-off.matter
@@ -189,11 +189,16 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute nullable int8u onLevel = 17;
   attribute access(write: manage) nullable int8u startUpCurrentLevel = 16384;
   readonly attribute command_id generatedCommandList[] = 65528;
@@ -205,55 +210,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/placeholder/linux/apps/app1/config.matter b/examples/placeholder/linux/apps/app1/config.matter
index c8c0dbc..f6d04ad 100644
--- a/examples/placeholder/linux/apps/app1/config.matter
+++ b/examples/placeholder/linux/apps/app1/config.matter
@@ -343,6 +343,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute bitmap32 featureMap = 65532;
   readonly attribute int16u clusterRevision = 65533;
@@ -350,55 +355,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/placeholder/linux/apps/app2/config.matter b/examples/placeholder/linux/apps/app2/config.matter
index c8c0dbc..f6d04ad 100644
--- a/examples/placeholder/linux/apps/app2/config.matter
+++ b/examples/placeholder/linux/apps/app2/config.matter
@@ -343,6 +343,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute bitmap32 featureMap = 65532;
   readonly attribute int16u clusterRevision = 65533;
@@ -350,55 +355,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/pump-app/pump-common/pump-app.matter b/examples/pump-app/pump-common/pump-app.matter
index 7531278..b1b48d3 100644
--- a/examples/pump-app/pump-common/pump-app.matter
+++ b/examples/pump-app/pump-common/pump-app.matter
@@ -102,10 +102,15 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int8u minLevel = 2;
   readonly attribute int8u maxLevel = 3;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute nullable int8u onLevel = 17;
   readonly attribute command_id generatedCommandList[] = 65528;
   readonly attribute command_id acceptedCommandList[] = 65529;
@@ -116,55 +121,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/examples/tv-app/linux/include/level-control/LevelControl.cpp b/examples/tv-app/linux/include/level-control/LevelControl.cpp
index 78da6a1..278c42f 100644
--- a/examples/tv-app/linux/include/level-control/LevelControl.cpp
+++ b/examples/tv-app/linux/include/level-control/LevelControl.cpp
@@ -25,7 +25,7 @@
 #include <app-common/zap-generated/command-id.h>
 
 using namespace chip;
-
+using namespace chip::app::Clusters;
 #define MAX_LEVEL 99
 #define MIN_LEVEL 1
 
@@ -45,7 +45,8 @@
 }
 
 static void stepHandler(CommandId commandId, uint8_t stepMode, uint8_t stepSize, pp::DataModel::Nullable<uint16_t> transitionTimeDs,
-                        uint8_t optionMask, uint8_t optionOverride)
+                        BitMask<LevelControl::LevelControlOptions> optionMask,
+                        BitMask<LevelControl::LevelControlOptions> optionOverride)
 {
 
     EndpointId endpoint              = emberAfCurrentEndpoint();
@@ -124,7 +125,8 @@
 }
 
 bool emberAfLevelControlClusterStepCallback(uint8_t stepMode, uint8_t stepSize, pp::DataModel::Nullable<uint8_t> transitionTime,
-                                            uint8_t optionMask, uint8_t optionOverride)
+                                            BitMask<LevelControl::LevelControlOptions> optionMask,
+                                            BitMask<LevelControl::LevelControlOptions> 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 f143582..0a8fa96 100644
--- a/examples/tv-app/tv-common/tv-app.matter
+++ b/examples/tv-app/tv-common/tv-app.matter
@@ -66,6 +66,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
@@ -73,7 +78,7 @@
   readonly attribute int16u currentFrequency = 4;
   readonly attribute int16u minFrequency = 5;
   readonly attribute int16u maxFrequency = 6;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute int16u onOffTransitionTime = 16;
   attribute nullable int8u onLevel = 17;
   attribute nullable int16u onTransitionTime = 18;
@@ -86,55 +91,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
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 a1fd172..01c07f2 100644
--- a/examples/tv-casting-app/tv-casting-common/include/LevelControl.h
+++ b/examples/tv-casting-app/tv-casting-common/include/LevelControl.h
@@ -30,7 +30,9 @@
     StepCommand() : MediaCommandBase(chip::app::Clusters::LevelControl::Id) {}
 
     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,
+                      chip::app::DataModel::Nullable<uint16_t> transitionTime,
+                      chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> optionMask,
+                      chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> optionOverride,
                       std::function<void(CHIP_ERROR)> responseCallback);
 };
 
@@ -40,8 +42,10 @@
 public:
     MoveToLevelCommand() : MediaCommandBase(chip::app::Clusters::LevelControl::Id) {}
 
-    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);
+    CHIP_ERROR Invoke(uint8_t level, chip::app::DataModel::Nullable<uint16_t> transitionTime,
+                      chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> optionMask,
+                      chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> optionOverride,
+                      std::function<void(CHIP_ERROR)> responseCallback);
 };
 
 // SUBSCRIBER CLASSES
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 48de522..2f0c1b4 100644
--- a/examples/tv-casting-app/tv-casting-common/src/LevelControl.cpp
+++ b/examples/tv-casting-app/tv-casting-common/src/LevelControl.cpp
@@ -22,7 +22,9 @@
 using namespace chip::app::Clusters;
 
 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)
+                               BitMask<LevelControl::LevelControlOptions> optionMask,
+                               BitMask<LevelControl::LevelControlOptions> optionOverride,
+                               std::function<void(CHIP_ERROR)> responseCallback)
 {
     LevelControl::Commands::Step::Type request;
     request.stepMode        = stepMode;
@@ -33,8 +35,10 @@
     return MediaCommandBase::Invoke(request, 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)
+CHIP_ERROR MoveToLevelCommand::Invoke(uint8_t level, app::DataModel::Nullable<uint16_t> transitionTime,
+                                      BitMask<LevelControl::LevelControlOptions> optionMask,
+                                      BitMask<LevelControl::LevelControlOptions> 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 976496d..0c992d3 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,6 +320,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
@@ -327,7 +332,7 @@
   readonly attribute int16u currentFrequency = 4;
   readonly attribute int16u minFrequency = 5;
   readonly attribute int16u maxFrequency = 6;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute int16u onOffTransitionTime = 16;
   attribute nullable int8u onLevel = 17;
   attribute nullable int16u onTransitionTime = 18;
@@ -340,55 +345,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
@@ -418,6 +423,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
@@ -425,7 +435,7 @@
   readonly attribute int16u currentFrequency = 4;
   readonly attribute int16u minFrequency = 5;
   readonly attribute int16u maxFrequency = 6;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute int16u onOffTransitionTime = 16;
   attribute nullable int8u onLevel = 17;
   attribute nullable int16u onTransitionTime = 18;
@@ -438,55 +448,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/src/app/clusters/level-control/level-control.cpp b/src/app/clusters/level-control/level-control.cpp
index 5bca058..87f60446 100644
--- a/src/app/clusters/level-control/level-control.cpp
+++ b/src/app/clusters/level-control/level-control.cpp
@@ -28,6 +28,7 @@
 #include <app/util/util.h>
 
 #include <app/reporting/reporting.h>
+#include <lib/core/Optional.h>
 #include <platform/CHIPDeviceConfig.h>
 #include <platform/CHIPDeviceLayer.h>
 #include <platform/PlatformManager.h>
@@ -99,17 +100,24 @@
 static EmberAfLevelControlState * getState(EndpointId endpoint);
 
 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);
+                                        app::DataModel::Nullable<uint16_t> transitionTimeDs,
+                                        chip::Optional<BitMask<LevelControlOptions>> optionsMask,
+                                        chip::Optional<BitMask<LevelControlOptions>> 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);
+                        chip::Optional<BitMask<LevelControlOptions>> optionsMask,
+                        chip::Optional<BitMask<LevelControlOptions>> 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);
+                        app::DataModel::Nullable<uint16_t> transitionTimeDs,
+                        chip::Optional<BitMask<LevelControlOptions>> optionsMask,
+                        chip::Optional<BitMask<LevelControlOptions>> optionsOverride);
+static void stopHandler(EndpointId endpoint, CommandId commandId, chip::Optional<BitMask<LevelControlOptions>> optionsMask,
+                        chip::Optional<BitMask<LevelControlOptions>> optionsOverride);
 
 static void setOnOffValue(EndpointId endpoint, bool onOff);
 static void writeRemainingTime(EndpointId endpoint, uint16_t remainingTimeMs);
-static bool shouldExecuteIfOff(EndpointId endpoint, CommandId commandId, uint8_t optionsMask, uint8_t optionsOverride);
+static bool shouldExecuteIfOff(EndpointId endpoint, CommandId commandId,
+                               chip::Optional<chip::BitMask<LevelControlOptions>> optionsMask,
+                               chip::Optional<chip::BitMask<LevelControlOptions>> optionsOverride);
 
 #if !defined(IGNORE_LEVEL_CONTROL_CLUSTER_OPTIONS) && defined(EMBER_AF_PLUGIN_COLOR_CONTROL_SERVER_TEMP)
 static void reallyUpdateCoupledColorTemp(EndpointId endpoint);
@@ -185,7 +193,7 @@
 #if !defined(IGNORE_LEVEL_CONTROL_CLUSTER_OPTIONS) && defined(EMBER_AF_PLUGIN_COLOR_CONTROL_SERVER_TEMP)
 static void reallyUpdateCoupledColorTemp(EndpointId endpoint)
 {
-    uint8_t options;
+    LevelControl::Attributes::Options::TypeInfo::Type options;
     EmberAfStatus status = Attributes::Options::Get(endpoint, &options);
     if (status != EMBER_ZCL_STATUS_SUCCESS)
     {
@@ -195,7 +203,7 @@
 
     if (emberAfContainsAttribute(endpoint, ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id))
     {
-        if (READBITS(options, EMBER_ZCL_LEVEL_CONTROL_OPTIONS_COUPLE_COLOR_TEMP_TO_LEVEL))
+        if (options.Has(LevelControlOptions::kCoupleColorTempToLevel))
         {
             emberAfPluginLevelControlCoupledColorTempChangeCallback(endpoint);
         }
@@ -346,7 +354,9 @@
 #endif // EMBER_AF_PLUGIN_ON_OFF
 }
 
-static bool shouldExecuteIfOff(EndpointId endpoint, CommandId commandId, uint8_t optionsMask, uint8_t optionsOverride)
+static bool shouldExecuteIfOff(EndpointId endpoint, CommandId commandId,
+                               chip::Optional<chip::BitMask<LevelControlOptions>> optionsMask,
+                               chip::Optional<chip::BitMask<LevelControlOptions>> optionsOverride)
 {
 #ifndef IGNORE_LEVEL_CONTROL_CLUSTER_OPTIONS
     if (emberAfContainsAttribute(endpoint, LevelControl::Id, Attributes::Options::Id))
@@ -370,14 +380,13 @@
             return true;
         }
 
-        uint8_t options;
+        LevelControl::Attributes::Options::TypeInfo::Type options;
         EmberAfStatus status = Attributes::Options::Get(endpoint, &options);
         if (status != EMBER_ZCL_STATUS_SUCCESS)
         {
             emberAfLevelControlClusterPrintln("Unable to read Options attribute: 0x%X", status);
             // If we can't read the attribute, then we should just assume that it has its
             // default value.
-            options = 0x00;
         }
 
         bool on;
@@ -408,23 +417,22 @@
         // ---------- The following order is important in decision making -------
         // -----------more readable ----------
         //
-        if (optionsMask == 0xFF && optionsOverride == 0xFF)
+        if (!optionsMask.HasValue() || !optionsOverride.HasValue())
         {
-            // 0xFF are the default values passed to the command handler when
-            // the payload is not present - in that case there is use of option
+            // in case optionMask or optionOverride is not set, use of option
             // attribute to decide execution of the command
-            return READBITS(options, EMBER_ZCL_LEVEL_CONTROL_OPTIONS_EXECUTE_IF_OFF);
+            return options.Has(LevelControlOptions::kExecuteIfOff);
         }
         // ---------- The above is to distinguish if the payload is present or not
 
-        if (READBITS(optionsMask, EMBER_ZCL_LEVEL_CONTROL_OPTIONS_EXECUTE_IF_OFF))
+        if (optionsMask.Value().Has(LevelControlOptions::kExecuteIfOff))
         {
             // Mask is present and set in the command payload, this indicates
             // use the over ride as temporary option
-            return READBITS(optionsOverride, EMBER_ZCL_LEVEL_CONTROL_OPTIONS_EXECUTE_IF_OFF);
+            return optionsOverride.Value().Has(LevelControlOptions::kExecuteIfOff);
         }
         // if we are here - use the option bits
-        return (READBITS(options, EMBER_ZCL_LEVEL_CONTROL_OPTIONS_EXECUTE_IF_OFF));
+        return options.Has(LevelControlOptions::kExecuteIfOff);
     }
 
 #endif // IGNORE_LEVEL_CONTROL_CLUSTER_OPTIONS
@@ -442,18 +450,19 @@
 
     if (transitionTime.IsNull())
     {
-        emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL %x null %x %x", "RX level-control:", level, optionsMask,
-                                          optionsOverride);
+        emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL %x null %x %x", "RX level-control:", level, optionsMask.Raw(),
+                                          optionsOverride.Raw());
     }
     else
     {
         emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL %x %2x %x %x", "RX level-control:", level, transitionTime.Value(),
-                                          optionsMask, optionsOverride);
+                                          optionsMask.Raw(), optionsOverride.Raw());
     }
 
-    EmberAfStatus status =
-        moveToLevelHandler(commandPath.mEndpointId, Commands::MoveToLevel::Id, level, transitionTime, optionsMask, optionsOverride,
-                           INVALID_STORED_LEVEL); // Don't revert to the stored level
+    EmberAfStatus status = moveToLevelHandler(commandPath.mEndpointId, Commands::MoveToLevel::Id, level, transitionTime,
+                                              Optional<BitMask<LevelControlOptions>>(optionsMask),
+                                              Optional<BitMask<LevelControlOptions>>(optionsOverride),
+                                              INVALID_STORED_LEVEL); // Don't revert to the stored level
 
     emberAfSendImmediateDefaultResponse(status);
 
@@ -471,17 +480,18 @@
 
     if (transitionTime.IsNull())
     {
-        emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL_WITH_ON_OFF %x null %x %x", "RX level-control:", level, optionsMask,
-                                          optionsOverride);
+        emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL_WITH_ON_OFF %x null %x %x", "RX level-control:", level,
+                                          optionsMask.Raw(), optionsOverride.Raw());
     }
     else
     {
         emberAfLevelControlClusterPrintln("%pMOVE_TO_LEVEL_WITH_ON_OFF %x %2x %x %x", "RX level-control:", level,
-                                          transitionTime.Value(), optionsMask, optionsOverride);
+                                          transitionTime.Value(), optionsMask.Raw(), optionsOverride.Raw());
     }
 
     EmberAfStatus status = moveToLevelHandler(commandPath.mEndpointId, Commands::MoveToLevelWithOnOff::Id, level, transitionTime,
-                                              optionsMask, optionsOverride,
+                                              Optional<BitMask<LevelControlOptions>>(optionsMask),
+                                              Optional<BitMask<LevelControlOptions>>(optionsOverride),
                                               INVALID_STORED_LEVEL); // Don't revert to the stored level
 
     emberAfSendImmediateDefaultResponse(status);
@@ -499,15 +509,17 @@
 
     if (rate.IsNull())
     {
-        emberAfLevelControlClusterPrintln("%pMOVE %x null %x %x", "RX level-control:", moveMode, optionsMask, optionsOverride);
+        emberAfLevelControlClusterPrintln("%pMOVE %x null %x %x", "RX level-control:", moveMode, optionsMask.Raw(),
+                                          optionsOverride.Raw());
     }
     else
     {
-        emberAfLevelControlClusterPrintln("%pMOVE %x %u %x %x", "RX level-control:", moveMode, rate.Value(), optionsMask,
-                                          optionsOverride);
+        emberAfLevelControlClusterPrintln("%pMOVE %x %u %x %x", "RX level-control:", moveMode, rate.Value(), optionsMask.Raw(),
+                                          optionsOverride.Raw());
     }
 
-    moveHandler(commandPath.mEndpointId, Commands::Move::Id, moveMode, rate, optionsMask, optionsOverride);
+    moveHandler(commandPath.mEndpointId, Commands::Move::Id, moveMode, rate, Optional<BitMask<LevelControlOptions>>(optionsMask),
+                Optional<BitMask<LevelControlOptions>>(optionsOverride));
     return true;
 }
 
@@ -521,16 +533,17 @@
 
     if (rate.IsNull())
     {
-        emberAfLevelControlClusterPrintln("%pMOVE_WITH_ON_OFF %x null %x %x", "RX level-control:", moveMode, optionsMask,
-                                          optionsOverride);
+        emberAfLevelControlClusterPrintln("%pMOVE_WITH_ON_OFF %x null %x %x", "RX level-control:", moveMode, optionsMask.Raw(),
+                                          optionsOverride.Raw());
     }
     else
     {
         emberAfLevelControlClusterPrintln("%pMOVE_WITH_ON_OFF %u %2x %x %x", "RX level-control:", moveMode, rate.Value(),
-                                          optionsMask, optionsOverride);
+                                          optionsMask.Raw(), optionsOverride.Raw());
     }
 
-    moveHandler(commandPath.mEndpointId, Commands::MoveWithOnOff::Id, moveMode, rate, optionsMask, optionsOverride);
+    moveHandler(commandPath.mEndpointId, Commands::MoveWithOnOff::Id, moveMode, rate,
+                Optional<BitMask<LevelControlOptions>>(optionsMask), Optional<BitMask<LevelControlOptions>>(optionsOverride));
     return true;
 }
 
@@ -545,16 +558,17 @@
 
     if (transitionTime.IsNull())
     {
-        emberAfLevelControlClusterPrintln("%pSTEP %x %x null %x %x", "RX level-control:", stepMode, stepSize, optionsMask,
-                                          optionsOverride);
+        emberAfLevelControlClusterPrintln("%pSTEP %x %x null %x %x", "RX level-control:", stepMode, stepSize, optionsMask.Raw(),
+                                          optionsOverride.Raw());
     }
     else
     {
         emberAfLevelControlClusterPrintln("%pSTEP %x %x %2x %x %x", "RX level-control:", stepMode, stepSize, transitionTime.Value(),
-                                          optionsMask, optionsOverride);
+                                          optionsMask.Raw(), optionsOverride.Raw());
     }
 
-    stepHandler(commandPath.mEndpointId, Commands::Step::Id, stepMode, stepSize, transitionTime, optionsMask, optionsOverride);
+    stepHandler(commandPath.mEndpointId, Commands::Step::Id, stepMode, stepSize, transitionTime,
+                Optional<BitMask<LevelControlOptions>>(optionsMask), Optional<BitMask<LevelControlOptions>>(optionsOverride));
     return true;
 }
 
@@ -570,16 +584,16 @@
     if (transitionTime.IsNull())
     {
         emberAfLevelControlClusterPrintln("%pSTEP_WITH_ON_OFF %x %x null %x %x", "RX level-control:", stepMode, stepSize,
-                                          optionsMask, optionsOverride);
+                                          optionsMask.Raw(), optionsOverride.Raw());
     }
     else
     {
         emberAfLevelControlClusterPrintln("%pSTEP_WITH_ON_OFF %x %x %2x %x %x", "RX level-control:", stepMode, stepSize,
-                                          transitionTime.Value(), optionsMask, optionsOverride);
+                                          transitionTime.Value(), optionsMask.Raw(), optionsOverride.Raw());
     }
 
-    stepHandler(commandPath.mEndpointId, Commands::StepWithOnOff::Id, stepMode, stepSize, transitionTime, optionsMask,
-                optionsOverride);
+    stepHandler(commandPath.mEndpointId, Commands::StepWithOnOff::Id, stepMode, stepSize, transitionTime,
+                Optional<BitMask<LevelControlOptions>>(optionsMask), Optional<BitMask<LevelControlOptions>>(optionsOverride));
     return true;
 }
 
@@ -590,7 +604,8 @@
     auto & optionsOverride = commandData.optionsOverride;
 
     emberAfLevelControlClusterPrintln("%pSTOP", "RX level-control:");
-    stopHandler(commandPath.mEndpointId, Commands::Stop::Id, optionsMask, optionsOverride);
+    stopHandler(commandPath.mEndpointId, Commands::Stop::Id, Optional<BitMask<LevelControlOptions>>(optionsMask),
+                Optional<BitMask<LevelControlOptions>>(optionsOverride));
     return true;
 }
 
@@ -600,13 +615,15 @@
     auto & optionsMask     = commandData.optionsMask;
     auto & optionsOverride = commandData.optionsOverride;
     emberAfLevelControlClusterPrintln("%pSTOP_WITH_ON_OFF", "RX level-control:");
-    stopHandler(commandPath.mEndpointId, Commands::StopWithOnOff::Id, optionsMask, optionsOverride);
+    stopHandler(commandPath.mEndpointId, Commands::StopWithOnOff::Id, Optional<BitMask<LevelControlOptions>>(optionsMask),
+                Optional<BitMask<LevelControlOptions>>(optionsOverride));
     return true;
 }
 
 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)
+                                        app::DataModel::Nullable<uint16_t> transitionTimeDs,
+                                        chip::Optional<BitMask<LevelControlOptions>> optionsMask,
+                                        chip::Optional<BitMask<LevelControlOptions>> optionsOverride, uint16_t storedLevel)
 {
     EmberAfLevelControlState * state = getState(endpoint);
     EmberAfStatus status;
@@ -751,7 +768,8 @@
 }
 
 static void moveHandler(EndpointId endpoint, CommandId commandId, uint8_t moveMode, app::DataModel::Nullable<uint8_t> rate,
-                        uint8_t optionsMask, uint8_t optionsOverride)
+                        chip::Optional<BitMask<LevelControlOptions>> optionsMask,
+                        chip::Optional<BitMask<LevelControlOptions>> optionsOverride)
 {
     EmberAfLevelControlState * state = getState(endpoint);
     EmberAfStatus status;
@@ -870,7 +888,9 @@
 }
 
 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)
+                        app::DataModel::Nullable<uint16_t> transitionTimeDs,
+                        chip::Optional<BitMask<LevelControlOptions>> optionsMask,
+                        chip::Optional<BitMask<LevelControlOptions>> optionsOverride)
 {
     EmberAfLevelControlState * state = getState(endpoint);
     EmberAfStatus status;
@@ -997,7 +1017,8 @@
     emberAfSendImmediateDefaultResponse(status);
 }
 
-static void stopHandler(EndpointId endpoint, CommandId commandId, uint8_t optionsMask, uint8_t optionsOverride)
+static void stopHandler(EndpointId endpoint, CommandId commandId, chip::Optional<BitMask<LevelControlOptions>> optionsMask,
+                        chip::Optional<BitMask<LevelControlOptions>> optionsOverride)
 {
     EmberAfLevelControlState * state = getState(endpoint);
     EmberAfStatus status;
@@ -1119,7 +1140,8 @@
 
         // "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(), transitionTime, 0xFF, 0xFF,
+        moveToLevelHandler(endpoint, Commands::MoveToLevel::Id, resolvedLevel.Value(), transitionTime, chip::NullOptional,
+                           chip::NullOptional,
                            INVALID_STORED_LEVEL); // Don't revert to stored level
     }
     else
@@ -1130,14 +1152,14 @@
         if (useOnLevel)
         {
             // If OnLevel is defined, don't revert to stored level.
-            moveToLevelHandler(endpoint, Commands::MoveToLevelWithOnOff::Id, minimumLevelAllowedForTheDevice, transitionTime, 0xFF,
-                               0xFF, INVALID_STORED_LEVEL);
+            moveToLevelHandler(endpoint, Commands::MoveToLevelWithOnOff::Id, minimumLevelAllowedForTheDevice, transitionTime,
+                               chip::NullOptional, chip::NullOptional, INVALID_STORED_LEVEL);
         }
         else
         {
             // If OnLevel is not defined, set the CurrentLevel to the stored level.
-            moveToLevelHandler(endpoint, Commands::MoveToLevelWithOnOff::Id, minimumLevelAllowedForTheDevice, transitionTime, 0xFF,
-                               0xFF, temporaryCurrentLevelCache.Value());
+            moveToLevelHandler(endpoint, Commands::MoveToLevelWithOnOff::Id, minimumLevelAllowedForTheDevice, transitionTime,
+                               chip::NullOptional, chip::NullOptional, temporaryCurrentLevelCache.Value());
         }
     }
 }
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 ae60b4b..4265943 100644
--- a/src/app/zap-templates/zcl/data-model/silabs/general.xml
+++ b/src/app/zap-templates/zcl/data-model/silabs/general.xml
@@ -191,21 +191,21 @@
     <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"  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="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">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">
+    <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="LevelControlOptions"  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"/>
@@ -216,8 +216,8 @@
       </description>
       <arg name="Level"           type="INT8U"/>
       <arg name="TransitionTime"  type="INT16U" isNullable="true"/>
-      <arg name="OptionsMask"     type="BITMAP8"/>
-      <arg name="OptionsOverride" type="BITMAP8"/>
+      <arg name="OptionsMask"     type="LevelControlOptions"/>
+      <arg name="OptionsOverride" type="LevelControlOptions"/>
     </command>
     <command source="client" code="0x01" name="Move" optional="false" cli="zcl level-control move">
       <description>
@@ -225,8 +225,8 @@
       </description>
       <arg name="MoveMode" type="MoveMode"/>
       <arg name="Rate" type="INT8U" isNullable="true"/>
-      <arg name="OptionsMask" type="BITMAP8"/>
-      <arg name="OptionsOverride" type="BITMAP8"/>
+      <arg name="OptionsMask" type="LevelControlOptions"/>
+      <arg name="OptionsOverride" type="LevelControlOptions"/>
     </command>
     <command source="client" code="0x02" name="Step" optional="false" cli="zcl level-control step">
       <description>
@@ -235,15 +235,15 @@
       <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"/>
+      <arg name="OptionsMask" type="LevelControlOptions"/>
+      <arg name="OptionsOverride" type="LevelControlOptions"/>
     </command>
     <command source="client" code="0x03" name="Stop" optional="false" cli="zcl level-control stop">
       <description>
         Command description for Stop
       </description>
-      <arg name="OptionsMask" type="BITMAP8"/>
-      <arg name="OptionsOverride" type="BITMAP8"/>
+      <arg name="OptionsMask" type="LevelControlOptions"/>
+      <arg name="OptionsOverride" type="LevelControlOptions"/>
     </command>
     <command source="client" code="0x04" name="MoveToLevelWithOnOff" optional="false" cli="zcl level-control o-mv-to-level">
       <description>
@@ -251,8 +251,8 @@
       </description>
       <arg name="Level"           type="INT8U"/>
       <arg name="TransitionTime"  type="INT16U" isNullable="true"/>
-      <arg name="OptionsMask"     type="BITMAP8"/>
-      <arg name="OptionsOverride" type="BITMAP8"/>
+      <arg name="OptionsMask"     type="LevelControlOptions"/>
+      <arg name="OptionsOverride" type="LevelControlOptions"/>
     </command>
     <command source="client" code="0x05" name="MoveWithOnOff" optional="false" cli="zcl level-control o-move">
       <description>
@@ -260,8 +260,8 @@
       </description>
       <arg name="MoveMode" type="MoveMode"/>
       <arg name="Rate" type="INT8U" isNullable="true"/>
-      <arg name="OptionsMask" type="BITMAP8"/>
-      <arg name="OptionsOverride" type="BITMAP8"/>
+      <arg name="OptionsMask" type="LevelControlOptions"/>
+      <arg name="OptionsOverride" type="LevelControlOptions"/>
     </command>
     <command source="client" code="0x06" name="StepWithOnOff" optional="false" cli="zcl level-control o-step">
       <description>
@@ -270,15 +270,15 @@
       <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"/>
+      <arg name="OptionsMask" type="LevelControlOptions"/>
+      <arg name="OptionsOverride" type="LevelControlOptions"/>
     </command>
     <command source="client" code="0x07" name="StopWithOnOff" optional="false" cli="zcl level-control o-stop">
       <description>
         Command description for StopWithOnOff
       </description>
-      <arg name="OptionsMask" type="BITMAP8"/>
-      <arg name="OptionsOverride" type="BITMAP8"/>
+      <arg name="OptionsMask" type="LevelControlOptions"/>
+      <arg name="OptionsOverride" type="LevelControlOptions"/>
     </command>
     <command source="client" code="0x08" name="MoveToClosestFrequency" optional="true">
       <description>
diff --git a/src/app/zap-templates/zcl/data-model/silabs/types.xml b/src/app/zap-templates/zcl/data-model/silabs/types.xml
index aabddbc..c7e67ff 100644
--- a/src/app/zap-templates/zcl/data-model/silabs/types.xml
+++ b/src/app/zap-templates/zcl/data-model/silabs/types.xml
@@ -661,10 +661,11 @@
     <item name="SetToToggle" value="0x02"/>
     <!-- 0x03-0xFF reserved -->
   </enum>
-  <enum name="LevelControlOptions" type="BITMAP8">
-    <item name="ExecuteIfOff" value="0x1"/>
-    <item name="CoupleColorTempToLevel" value="0x02"/>
-  </enum>
+  <bitmap name="LevelControlOptions" type="BITMAP8">
+    <cluster code="0x0008"/>
+    <field name="ExecuteIfOff" mask="0x1"/>
+    <field name="CoupleColorTempToLevel" mask="0x02"/>
+  </bitmap>
   <!-- Barrier Control Cluster -->
   <bitmap name="BarrierControlCapabilities" type="BITMAP8">
     <field name="partialBarrier" mask="0x01"/>
diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter
index a2b3632..f5d80fd 100644
--- a/src/controller/data_model/controller-clusters.matter
+++ b/src/controller/data_model/controller-clusters.matter
@@ -315,6 +315,11 @@
     kFrequency = 0x4;
   }
 
+  bitmap LevelControlOptions : BITMAP8 {
+    kExecuteIfOff = 0x1;
+    kCoupleColorTempToLevel = 0x2;
+  }
+
   readonly attribute nullable int8u currentLevel = 0;
   readonly attribute int16u remainingTime = 1;
   readonly attribute int8u minLevel = 2;
@@ -322,7 +327,7 @@
   readonly attribute int16u currentFrequency = 4;
   readonly attribute int16u minFrequency = 5;
   readonly attribute int16u maxFrequency = 6;
-  attribute bitmap8 options = 15;
+  attribute LevelControlOptions options = 15;
   attribute int16u onOffTransitionTime = 16;
   attribute nullable int8u onLevel = 17;
   attribute nullable int16u onTransitionTime = 18;
@@ -338,55 +343,55 @@
   request struct MoveToLevelRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   request struct MoveToLevelWithOnOffRequest {
     INT8U level = 0;
     nullable INT16U transitionTime = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct MoveWithOnOffRequest {
     MoveMode moveMode = 0;
     nullable INT8U rate = 1;
-    BITMAP8 optionsMask = 2;
-    BITMAP8 optionsOverride = 3;
+    LevelControlOptions optionsMask = 2;
+    LevelControlOptions optionsOverride = 3;
   }
 
   request struct StepWithOnOffRequest {
     StepMode stepMode = 0;
     INT8U stepSize = 1;
     nullable INT16U transitionTime = 2;
-    BITMAP8 optionsMask = 3;
-    BITMAP8 optionsOverride = 4;
+    LevelControlOptions optionsMask = 3;
+    LevelControlOptions optionsOverride = 4;
   }
 
   request struct StopWithOnOffRequest {
-    BITMAP8 optionsMask = 0;
-    BITMAP8 optionsOverride = 1;
+    LevelControlOptions optionsMask = 0;
+    LevelControlOptions optionsOverride = 1;
   }
 
   command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
diff --git a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
index 555e828..3e375f9 100644
--- a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
+++ b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
@@ -957,7 +957,7 @@
             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);
+                                                                          cppValue.Raw(), value);
             return value;
         }
         case Attributes::OnOffTransitionTime::Id: {
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
index 010ca73..526c715 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
@@ -853,7 +853,7 @@
                 return nil;
             }
             NSNumber * _Nonnull value;
-            value = [NSNumber numberWithUnsignedChar:cppValue];
+            value = [NSNumber numberWithUnsignedChar:cppValue.Raw()];
             return value;
         }
         case Attributes::OnOffTransitionTime::Id: {
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
index 3262968..2cc6d66 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
@@ -15982,6 +15982,11 @@
     MTRLevelControlFeatureFrequency = 0x4,
 };
 
+typedef NS_OPTIONS(uint8_t, MTRLevelControlOptions) {
+    MTRLevelControlOptionsExecuteIfOff = 0x1,
+    MTRLevelControlOptionsCoupleColorTempToLevel = 0x2,
+};
+
 typedef NS_ENUM(uint8_t, MTRAccessControlAuthMode) {
     MTRAccessControlAuthModePASE = 0x01,
     MTRAccessControlAuthModeCASE = 0x02,
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
index cd17c02..4af3218 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
@@ -5065,8 +5065,10 @@
                 auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                 nonNullValue_0 = params.transitionTime.unsignedShortValue;
             }
-            request.optionsMask = params.optionsMask.unsignedCharValue;
-            request.optionsOverride = params.optionsOverride.unsignedCharValue;
+            request.optionsMask
+                = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+            request.optionsOverride
+                = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(params.optionsOverride.unsignedCharValue);
 
             return MTRStartInvokeInteraction(
                 typedBridge, request, exchangeManager, session, successCb, failureCb, self->_endpoint, timedInvokeTimeoutMs);
@@ -5101,8 +5103,10 @@
                 auto & nonNullValue_0 = request.rate.SetNonNull();
                 nonNullValue_0 = params.rate.unsignedCharValue;
             }
-            request.optionsMask = params.optionsMask.unsignedCharValue;
-            request.optionsOverride = params.optionsOverride.unsignedCharValue;
+            request.optionsMask
+                = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+            request.optionsOverride
+                = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(params.optionsOverride.unsignedCharValue);
 
             return MTRStartInvokeInteraction(
                 typedBridge, request, exchangeManager, session, successCb, failureCb, self->_endpoint, timedInvokeTimeoutMs);
@@ -5138,8 +5142,10 @@
                 auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                 nonNullValue_0 = params.transitionTime.unsignedShortValue;
             }
-            request.optionsMask = params.optionsMask.unsignedCharValue;
-            request.optionsOverride = params.optionsOverride.unsignedCharValue;
+            request.optionsMask
+                = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+            request.optionsOverride
+                = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(params.optionsOverride.unsignedCharValue);
 
             return MTRStartInvokeInteraction(
                 typedBridge, request, exchangeManager, session, successCb, failureCb, self->_endpoint, timedInvokeTimeoutMs);
@@ -5167,8 +5173,10 @@
                     timedInvokeTimeoutMs.SetValue(params.timedInvokeTimeoutMs.unsignedShortValue);
                 }
             }
-            request.optionsMask = params.optionsMask.unsignedCharValue;
-            request.optionsOverride = params.optionsOverride.unsignedCharValue;
+            request.optionsMask
+                = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+            request.optionsOverride
+                = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(params.optionsOverride.unsignedCharValue);
 
             return MTRStartInvokeInteraction(
                 typedBridge, request, exchangeManager, session, successCb, failureCb, self->_endpoint, timedInvokeTimeoutMs);
@@ -5204,8 +5212,10 @@
                 auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                 nonNullValue_0 = params.transitionTime.unsignedShortValue;
             }
-            request.optionsMask = params.optionsMask.unsignedCharValue;
-            request.optionsOverride = params.optionsOverride.unsignedCharValue;
+            request.optionsMask
+                = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+            request.optionsOverride
+                = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(params.optionsOverride.unsignedCharValue);
 
             return MTRStartInvokeInteraction(
                 typedBridge, request, exchangeManager, session, successCb, failureCb, self->_endpoint, timedInvokeTimeoutMs);
@@ -5240,8 +5250,10 @@
                 auto & nonNullValue_0 = request.rate.SetNonNull();
                 nonNullValue_0 = params.rate.unsignedCharValue;
             }
-            request.optionsMask = params.optionsMask.unsignedCharValue;
-            request.optionsOverride = params.optionsOverride.unsignedCharValue;
+            request.optionsMask
+                = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+            request.optionsOverride
+                = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(params.optionsOverride.unsignedCharValue);
 
             return MTRStartInvokeInteraction(
                 typedBridge, request, exchangeManager, session, successCb, failureCb, self->_endpoint, timedInvokeTimeoutMs);
@@ -5277,8 +5289,10 @@
                 auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                 nonNullValue_0 = params.transitionTime.unsignedShortValue;
             }
-            request.optionsMask = params.optionsMask.unsignedCharValue;
-            request.optionsOverride = params.optionsOverride.unsignedCharValue;
+            request.optionsMask
+                = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+            request.optionsOverride
+                = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(params.optionsOverride.unsignedCharValue);
 
             return MTRStartInvokeInteraction(
                 typedBridge, request, exchangeManager, session, successCb, failureCb, self->_endpoint, timedInvokeTimeoutMs);
@@ -5306,8 +5320,10 @@
                     timedInvokeTimeoutMs.SetValue(params.timedInvokeTimeoutMs.unsignedShortValue);
                 }
             }
-            request.optionsMask = params.optionsMask.unsignedCharValue;
-            request.optionsOverride = params.optionsOverride.unsignedCharValue;
+            request.optionsMask
+                = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+            request.optionsOverride
+                = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(params.optionsOverride.unsignedCharValue);
 
             return MTRStartInvokeInteraction(
                 typedBridge, request, exchangeManager, session, successCb, failureCb, self->_endpoint, timedInvokeTimeoutMs);
@@ -5643,7 +5659,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = LevelControl::Attributes::Options::TypeInfo;
-    return MTRReadAttribute<MTRInt8uAttributeCallbackBridge, NSNumber, TypeInfo::DecodableType>(
+    return MTRReadAttribute<MTRLevelControlOptionsAttributeCallbackBridge, NSNumber, TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
 
@@ -5676,7 +5692,7 @@
             ListFreer listFreer;
             using TypeInfo = LevelControl::Attributes::Options::TypeInfo;
             TypeInfo::Type cppValue;
-            cppValue = value.unsignedCharValue;
+            cppValue = static_cast<std::remove_reference_t<decltype(cppValue)>>(value.unsignedCharValue);
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
             return cppCluster.WriteAttribute<TypeInfo>(cppValue, bridge, successCb, failureCb, timedWriteTimeout);
@@ -5689,7 +5705,7 @@
                               reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = LevelControl::Attributes::Options::TypeInfo;
-    MTRSubscribeAttribute<MTRInt8uAttributeCallbackSubscriptionBridge, NSNumber, TypeInfo::DecodableType>(params,
+    MTRSubscribeAttribute<MTRLevelControlOptionsAttributeCallbackSubscriptionBridge, NSNumber, TypeInfo::DecodableType>(params,
         subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(),
         TypeInfo::GetAttributeId());
 }
@@ -5699,8 +5715,8 @@
                                             queue:(dispatch_queue_t)queue
                                        completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTRInt8uAttributeCallbackBridge(queue, completion);
-    std::move(*bridge).DispatchLocalAction(^(Int8uAttributeCallback successCb, MTRErrorCallback failureCb) {
+    auto * bridge = new MTRLevelControlOptionsAttributeCallbackBridge(queue, completion);
+    std::move(*bridge).DispatchLocalAction(^(LevelControlOptionsAttributeCallback successCb, MTRErrorCallback failureCb) {
         if (clusterStateCacheContainer.cppClusterStateCache) {
             chip::app::ConcreteAttributePath path;
             using TypeInfo = LevelControl::Attributes::Options::TypeInfo;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm
index d300ece..5a83eb0 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm
@@ -1273,6 +1273,29 @@
     }
 }
 
+void MTRLevelControlOptionsAttributeCallbackBridge::OnSuccessFn(
+    void * context, chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value)
+{
+    NSNumber * _Nonnull objCValue;
+    objCValue = [NSNumber numberWithUnsignedChar:value.Raw()];
+    DispatchSuccess(context, objCValue);
+};
+
+void MTRLevelControlOptionsAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+{
+    if (!mQueue) {
+        return;
+    }
+
+    if (mEstablishedHandler != nil) {
+        dispatch_async(mQueue, mEstablishedHandler);
+        // On failure, mEstablishedHandler will be cleaned up by our destructor,
+        // but we can clean it up earlier on successful subscription
+        // establishment.
+        mEstablishedHandler = nil;
+    }
+}
+
 void MTRLevelControlGeneratedCommandListListAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value)
 {
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h
index cf55841..98cfb00 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h
@@ -564,6 +564,7 @@
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
 typedef void (*OnOffSwitchConfigurationAttributeListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
+typedef void (*LevelControlOptionsAttributeCallback)(void *, chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>);
 typedef void (*LevelControlGeneratedCommandListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
 typedef void (*LevelControlAcceptedCommandListListAttributeCallback)(
@@ -2430,6 +2431,36 @@
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
+class MTRLevelControlOptionsAttributeCallbackBridge : public MTRCallbackBridge<LevelControlOptionsAttributeCallback>
+{
+public:
+    MTRLevelControlOptionsAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LevelControlOptionsAttributeCallback>(queue, handler, OnSuccessFn){};
+
+    MTRLevelControlOptionsAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<LevelControlOptionsAttributeCallback>(queue, handler, action, OnSuccessFn){};
+
+    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value);
+};
+
+class MTRLevelControlOptionsAttributeCallbackSubscriptionBridge : public MTRLevelControlOptionsAttributeCallbackBridge
+{
+public:
+    MTRLevelControlOptionsAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                              MTRActionBlock action,
+                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
+        MTRLevelControlOptionsAttributeCallbackBridge(queue, handler, action),
+        mEstablishedHandler(establishedHandler)
+    {}
+
+    void OnSubscriptionEstablished();
+    using MTRLevelControlOptionsAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLevelControlOptionsAttributeCallbackBridge::OnDone;
+
+private:
+    MTRSubscriptionEstablishedHandler mEstablishedHandler;
+};
+
 class MTRLevelControlGeneratedCommandListListAttributeCallbackBridge
     : public MTRCallbackBridge<LevelControlGeneratedCommandListListAttributeCallback>
 {
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
index 8476a3f..487c481 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
@@ -2414,8 +2414,10 @@
                     auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                     nonNullValue_0 = params.transitionTime.unsignedShortValue;
                 }
-                request.optionsMask = params.optionsMask.unsignedCharValue;
-                request.optionsOverride = params.optionsOverride.unsignedCharValue;
+                request.optionsMask
+                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
+                    params.optionsOverride.unsignedCharValue);
 
                 chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
                 return cppCluster.InvokeCommand(request, bridge, successCb, failureCb, timedInvokeTimeoutMs);
@@ -2472,8 +2474,10 @@
                     auto & nonNullValue_0 = request.rate.SetNonNull();
                     nonNullValue_0 = params.rate.unsignedCharValue;
                 }
-                request.optionsMask = params.optionsMask.unsignedCharValue;
-                request.optionsOverride = params.optionsOverride.unsignedCharValue;
+                request.optionsMask
+                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
+                    params.optionsOverride.unsignedCharValue);
 
                 chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
                 return cppCluster.InvokeCommand(request, bridge, successCb, failureCb, timedInvokeTimeoutMs);
@@ -2531,8 +2535,10 @@
                     auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                     nonNullValue_0 = params.transitionTime.unsignedShortValue;
                 }
-                request.optionsMask = params.optionsMask.unsignedCharValue;
-                request.optionsOverride = params.optionsOverride.unsignedCharValue;
+                request.optionsMask
+                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
+                    params.optionsOverride.unsignedCharValue);
 
                 chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
                 return cppCluster.InvokeCommand(request, bridge, successCb, failureCb, timedInvokeTimeoutMs);
@@ -2581,8 +2587,10 @@
                 if (timedInvokeTimeoutMsParam != nil) {
                     timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                 }
-                request.optionsMask = params.optionsMask.unsignedCharValue;
-                request.optionsOverride = params.optionsOverride.unsignedCharValue;
+                request.optionsMask
+                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
+                    params.optionsOverride.unsignedCharValue);
 
                 chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
                 return cppCluster.InvokeCommand(request, bridge, successCb, failureCb, timedInvokeTimeoutMs);
@@ -2638,8 +2646,10 @@
                     auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                     nonNullValue_0 = params.transitionTime.unsignedShortValue;
                 }
-                request.optionsMask = params.optionsMask.unsignedCharValue;
-                request.optionsOverride = params.optionsOverride.unsignedCharValue;
+                request.optionsMask
+                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
+                    params.optionsOverride.unsignedCharValue);
 
                 chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
                 return cppCluster.InvokeCommand(request, bridge, successCb, failureCb, timedInvokeTimeoutMs);
@@ -2696,8 +2706,10 @@
                     auto & nonNullValue_0 = request.rate.SetNonNull();
                     nonNullValue_0 = params.rate.unsignedCharValue;
                 }
-                request.optionsMask = params.optionsMask.unsignedCharValue;
-                request.optionsOverride = params.optionsOverride.unsignedCharValue;
+                request.optionsMask
+                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
+                    params.optionsOverride.unsignedCharValue);
 
                 chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
                 return cppCluster.InvokeCommand(request, bridge, successCb, failureCb, timedInvokeTimeoutMs);
@@ -2755,8 +2767,10 @@
                     auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                     nonNullValue_0 = params.transitionTime.unsignedShortValue;
                 }
-                request.optionsMask = params.optionsMask.unsignedCharValue;
-                request.optionsOverride = params.optionsOverride.unsignedCharValue;
+                request.optionsMask
+                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
+                    params.optionsOverride.unsignedCharValue);
 
                 chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
                 return cppCluster.InvokeCommand(request, bridge, successCb, failureCb, timedInvokeTimeoutMs);
@@ -2805,8 +2819,10 @@
                 if (timedInvokeTimeoutMsParam != nil) {
                     timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                 }
-                request.optionsMask = params.optionsMask.unsignedCharValue;
-                request.optionsOverride = params.optionsOverride.unsignedCharValue;
+                request.optionsMask
+                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
+                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
+                    params.optionsOverride.unsignedCharValue);
 
                 chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
                 return cppCluster.InvokeCommand(request, bridge, successCb, failureCb, timedInvokeTimeoutMs);
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 26b721b..aba2445 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
@@ -1160,9 +1160,9 @@
 
 namespace Options {
 
-EmberAfStatus Get(chip::EndpointId endpoint, uint8_t * value)
+EmberAfStatus Get(chip::EndpointId endpoint, chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> * value)
 {
-    using Traits = NumericAttributeTraits<uint8_t>;
+    using Traits = NumericAttributeTraits<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>;
     Traits::StorageType temp;
     uint8_t * readable   = Traits::ToAttributeStoreRepresentation(temp);
     EmberAfStatus status = emberAfReadServerAttribute(endpoint, Clusters::LevelControl::Id, Id, readable, sizeof(temp));
@@ -1174,9 +1174,9 @@
     *value = Traits::StorageToWorking(temp);
     return status;
 }
-EmberAfStatus Set(chip::EndpointId endpoint, uint8_t value)
+EmberAfStatus Set(chip::EndpointId endpoint, chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value)
 {
-    using Traits = NumericAttributeTraits<uint8_t>;
+    using Traits = NumericAttributeTraits<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>;
     if (!Traits::CanRepresentValue(/* isNullable = */ false, value))
     {
         return EMBER_ZCL_STATUS_CONSTRAINT_ERROR;
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 9f533ae..e1e6b3d 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
@@ -240,8 +240,9 @@
 } // namespace MaxFrequency
 
 namespace Options {
-EmberAfStatus Get(chip::EndpointId endpoint, uint8_t * value); // bitmap8
-EmberAfStatus Set(chip::EndpointId endpoint, uint8_t value);
+EmberAfStatus Get(chip::EndpointId endpoint,
+                  chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> * value); // LevelControlOptions
+EmberAfStatus Set(chip::EndpointId endpoint, chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value);
 } // namespace Options
 
 namespace OnOffTransitionTime {
diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h b/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h
index 48eb466..b71d81d 100644
--- a/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h
+++ b/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h
@@ -222,6 +222,13 @@
     kLighting  = 0x2,
     kFrequency = 0x4,
 };
+
+// Bitmap for LevelControlOptions
+enum class LevelControlOptions : uint8_t
+{
+    kExecuteIfOff           = 0x1,
+    kCoupleColorTempToLevel = 0x2,
+};
 } // namespace LevelControl
 
 namespace BinaryInputBasic {
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 29465ae..4fadf5d 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
@@ -2275,8 +2275,8 @@
 
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
 
     CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const;
 
@@ -2293,8 +2293,8 @@
 
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
 };
 }; // namespace MoveToLevel
@@ -2316,8 +2316,8 @@
 
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
 
     CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const;
 
@@ -2334,8 +2334,8 @@
 
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
 };
 }; // namespace Move
@@ -2359,8 +2359,8 @@
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
 
     CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const;
 
@@ -2378,8 +2378,8 @@
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
 };
 }; // namespace Step
@@ -2397,8 +2397,8 @@
     static constexpr CommandId GetCommandId() { return Commands::Stop::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    uint8_t optionsMask     = static_cast<uint8_t>(0);
-    uint8_t optionsOverride = static_cast<uint8_t>(0);
+    chip::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
 
     CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const;
 
@@ -2413,8 +2413,8 @@
     static constexpr CommandId GetCommandId() { return Commands::Stop::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    uint8_t optionsMask     = static_cast<uint8_t>(0);
-    uint8_t optionsOverride = static_cast<uint8_t>(0);
+    chip::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
 };
 }; // namespace Stop
@@ -2436,8 +2436,8 @@
 
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
 
     CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const;
 
@@ -2454,8 +2454,8 @@
 
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
 };
 }; // namespace MoveToLevelWithOnOff
@@ -2477,8 +2477,8 @@
 
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
 
     CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const;
 
@@ -2495,8 +2495,8 @@
 
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
 };
 }; // namespace MoveWithOnOff
@@ -2520,8 +2520,8 @@
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
 
     CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const;
 
@@ -2539,8 +2539,8 @@
     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::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
 };
 }; // namespace StepWithOnOff
@@ -2558,8 +2558,8 @@
     static constexpr CommandId GetCommandId() { return Commands::StopWithOnOff::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    uint8_t optionsMask     = static_cast<uint8_t>(0);
-    uint8_t optionsOverride = static_cast<uint8_t>(0);
+    chip::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
 
     CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const;
 
@@ -2574,8 +2574,8 @@
     static constexpr CommandId GetCommandId() { return Commands::StopWithOnOff::Id; }
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
 
-    uint8_t optionsMask     = static_cast<uint8_t>(0);
-    uint8_t optionsOverride = static_cast<uint8_t>(0);
+    chip::BitMask<LevelControlOptions> optionsMask     = static_cast<chip::BitMask<LevelControlOptions>>(0);
+    chip::BitMask<LevelControlOptions> optionsOverride = static_cast<chip::BitMask<LevelControlOptions>>(0);
     CHIP_ERROR Decode(TLV::TLVReader & reader);
 };
 }; // namespace StopWithOnOff
@@ -2702,9 +2702,9 @@
 namespace Options {
 struct TypeInfo
 {
-    using Type             = uint8_t;
-    using DecodableType    = uint8_t;
-    using DecodableArgType = uint8_t;
+    using Type             = chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>;
+    using DecodableType    = chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>;
+    using DecodableArgType = chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>;
 
     static constexpr ClusterId GetClusterId() { return Clusters::LevelControl::Id; }
     static constexpr AttributeId GetAttributeId() { return Attributes::Options::Id; }
@@ -2823,13 +2823,14 @@
         CHIP_ERROR Decode(TLV::TLVReader & reader, const ConcreteAttributePath & path);
 
         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);
-        Attributes::CurrentFrequency::TypeInfo::DecodableType currentFrequency       = static_cast<uint16_t>(0);
-        Attributes::MinFrequency::TypeInfo::DecodableType minFrequency               = static_cast<uint16_t>(0);
-        Attributes::MaxFrequency::TypeInfo::DecodableType maxFrequency               = static_cast<uint16_t>(0);
-        Attributes::Options::TypeInfo::DecodableType options                         = static_cast<uint8_t>(0);
+        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);
+        Attributes::CurrentFrequency::TypeInfo::DecodableType currentFrequency = static_cast<uint16_t>(0);
+        Attributes::MinFrequency::TypeInfo::DecodableType minFrequency         = static_cast<uint16_t>(0);
+        Attributes::MaxFrequency::TypeInfo::DecodableType maxFrequency         = static_cast<uint16_t>(0);
+        Attributes::Options::TypeInfo::DecodableType options =
+            static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0);
         Attributes::OnOffTransitionTime::TypeInfo::DecodableType onOffTransitionTime = static_cast<uint16_t>(0);
         Attributes::OnLevel::TypeInfo::DecodableType onLevel;
         Attributes::OnTransitionTime::TypeInfo::DecodableType onTransitionTime;
diff --git a/zzz_generated/app-common/app-common/zap-generated/enums.h b/zzz_generated/app-common/app-common/zap-generated/enums.h
index 76e565b..f2d3e87 100644
--- a/zzz_generated/app-common/app-common/zap-generated/enums.h
+++ b/zzz_generated/app-common/app-common/zap-generated/enums.h
@@ -179,13 +179,6 @@
     EMBER_ZCL_KEYPAD_LOCKOUT_LEVELFIVE_LOCKOUT   = 5,
 };
 
-// Enum for LevelControlOptions
-enum EmberAfLevelControlOptions : uint8_t
-{
-    EMBER_ZCL_LEVEL_CONTROL_OPTIONS_EXECUTE_IF_OFF             = 1,
-    EMBER_ZCL_LEVEL_CONTROL_OPTIONS_COUPLE_COLOR_TEMP_TO_LEVEL = 2,
-};
-
 // Enum for MoveMode
 enum EmberAfMoveMode : uint8_t
 {
@@ -741,6 +734,10 @@
 #define EMBER_AF_LEVEL_CONTROL_FEATURE_LIGHTING_OFFSET (1)
 #define EMBER_AF_LEVEL_CONTROL_FEATURE_FREQUENCY (4)
 #define EMBER_AF_LEVEL_CONTROL_FEATURE_FREQUENCY_OFFSET (2)
+#define EMBER_AF_LEVEL_CONTROL_OPTIONS_EXECUTE_IF_OFF (1)
+#define EMBER_AF_LEVEL_CONTROL_OPTIONS_EXECUTE_IF_OFF_OFFSET (0)
+#define EMBER_AF_LEVEL_CONTROL_OPTIONS_COUPLE_COLOR_TEMP_TO_LEVEL (2)
+#define EMBER_AF_LEVEL_CONTROL_OPTIONS_COUPLE_COLOR_TEMP_TO_LEVEL_OFFSET (1)
 #define EMBER_AF_MAINS_ALARM_MASK_VOLTAGE_TOO_LOW (1)
 #define EMBER_AF_MAINS_ALARM_MASK_VOLTAGE_TOO_LOW_OFFSET (0)
 #define EMBER_AF_MAINS_ALARM_MASK_VOLTAGE_TOO_HIGH (2)
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
index b437a36..852804c 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
@@ -8521,7 +8521,8 @@
         make_unique<ReadAttribute>(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig),                      //
         make_unique<ReadAttribute>(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig),            //
         make_unique<WriteAttribute<>>(Id, credsIssuerConfig),                                                              //
-        make_unique<WriteAttribute<uint8_t>>(Id, "options", 0, UINT8_MAX, Attributes::Options::Id, credsIssuerConfig),     //
+        make_unique<WriteAttribute<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>>(
+            Id, "options", 0, UINT8_MAX, Attributes::Options::Id, credsIssuerConfig), //
         make_unique<WriteAttribute<uint16_t>>(Id, "on-off-transition-time", 0, UINT16_MAX, Attributes::OnOffTransitionTime::Id,
                                               credsIssuerConfig), //
         make_unique<WriteAttribute<chip::app::DataModel::Nullable<uint8_t>>>(Id, "on-level", 0, UINT8_MAX, Attributes::OnLevel::Id,
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 ba839e1..c9f8748 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
+++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
@@ -4435,7 +4435,7 @@
             return DataModelLogger::LogValue("MaxFrequency", 1, value);
         }
         case LevelControl::Attributes::Options::Id: {
-            uint8_t value;
+            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
             return DataModelLogger::LogValue("Options", 1, value);
         }
diff --git a/zzz_generated/chip-tool/zap-generated/test/Commands.h b/zzz_generated/chip-tool/zap-generated/test/Commands.h
index d387909..e9f1930 100644
--- a/zzz_generated/chip-tool/zap-generated/test/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/test/Commands.h
@@ -18154,7 +18154,7 @@
         case 19:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                 VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
             }
@@ -18867,7 +18867,7 @@
         case 23:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                 VerifyOrReturn(CheckValue("options", value, 0U));
             }
@@ -18932,7 +18932,7 @@
         case 35:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             {
-                uint8_t value;
+                chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
                 VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                 VerifyOrReturn(CheckValue("options", value, 1U));
             }
@@ -19040,8 +19040,8 @@
             LogStep(4, "TH writes 0 to the Options attribute");
             VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
-            uint8_t value;
-            value = 0U;
+            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
+            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                   chip::NullOptional, chip::NullOptional);
         }
@@ -19062,8 +19062,8 @@
             value.level = 50U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
                                value, chip::NullOptional
 
@@ -19097,8 +19097,8 @@
             value.level = 50U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19120,8 +19120,8 @@
             value.level = 200U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 300U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19194,8 +19194,8 @@
             LogStep(22, "TH writes 0 to the Options attribute");
             VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
-            uint8_t value;
-            value = 0U;
+            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
+            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                   chip::NullOptional, chip::NullOptional);
         }
@@ -19222,8 +19222,8 @@
             value.level = 100U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19252,8 +19252,8 @@
             value.level = 120U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19273,8 +19273,8 @@
             value.level = 140U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 1U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19294,8 +19294,8 @@
             value.level = 160U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 1U;
-            value.optionsOverride        = 1U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19311,8 +19311,8 @@
             LogStep(34, "TH writes 1 to the Options attribute");
             VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
-            uint8_t value;
-            value = 1U;
+            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
+            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
             return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                   chip::NullOptional, chip::NullOptional);
         }
@@ -19339,8 +19339,8 @@
             value.level = 100U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19369,8 +19369,8 @@
             value.level = 120U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19390,8 +19390,8 @@
             value.level = 140U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 1U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19411,8 +19411,8 @@
             value.level = 160U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 1U;
-            value.optionsOverride        = 1U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19664,8 +19664,8 @@
             LogStep(4, "TH writes 0 to the Options attribute");
             VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
-            uint8_t value;
-            value = 0U;
+            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
+            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                   chip::NullOptional, chip::NullOptional);
         }
@@ -19692,8 +19692,8 @@
             value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
             value.rate.SetNonNull();
             value.rate.Value()    = 10U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveWithOnOff::Id, value,
                                chip::NullOptional
 
@@ -19740,8 +19740,8 @@
             value.level = 50U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -19761,8 +19761,8 @@
             value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
             value.rate.SetNonNull();
             value.rate.Value()    = 5U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
                                chip::NullOptional
 
@@ -20049,8 +20049,8 @@
             LogStep(4, "TH writes 0 to the Options attribute");
             VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
-            uint8_t value;
-            value = 0U;
+            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
+            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                   chip::NullOptional, chip::NullOptional);
         }
@@ -20074,8 +20074,8 @@
             value.stepSize = 50U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::StepWithOnOff::Id, value,
                                chip::NullOptional
 
@@ -20103,8 +20103,8 @@
             value.level = 50U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -20125,8 +20125,8 @@
             value.stepSize = 150U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 300U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Step::Id, value,
                                chip::NullOptional
 
@@ -20367,8 +20367,8 @@
             LogStep(2, "TH writes 0 to the Options attribute");
             VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
-            uint8_t value;
-            value = 0U;
+            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
+            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                   chip::NullOptional, chip::NullOptional);
         }
@@ -20389,8 +20389,8 @@
             value.level = 50U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 0U;
-            value.optionsOverride        = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -20412,8 +20412,8 @@
             value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
             value.rate.SetNonNull();
             value.rate.Value()    = 5U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
                                chip::NullOptional
 
@@ -20431,8 +20431,8 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::Stop::Type value;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Stop::Id, value,
                                chip::NullOptional
 
@@ -20465,8 +20465,8 @@
             value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
             value.rate.SetNonNull();
             value.rate.Value()    = 5U;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
                                chip::NullOptional
 
@@ -20484,8 +20484,8 @@
             VerifyOrDo(!ShouldSkip("LVL.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
             ListFreer listFreer;
             chip::app::Clusters::LevelControl::Commands::StopWithOnOff::Type value;
-            value.optionsMask     = 0U;
-            value.optionsOverride = 0U;
+            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::StopWithOnOff::Id, value,
                                chip::NullOptional
 
@@ -62946,8 +62946,8 @@
             value.level = 1U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 1U;
-            value.optionsOverride        = 1U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
             return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                                chip::NullOptional
 
@@ -63066,8 +63066,8 @@
             value.level = 127U;
             value.transitionTime.SetNonNull();
             value.transitionTime.Value() = 0U;
-            value.optionsMask            = 1U;
-            value.optionsOverride        = 1U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(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 1d5d8e6..8b1fb53 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
@@ -4602,8 +4602,8 @@
         } else {
             params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime.Value()];
         }
-        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
-        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
+        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask.Raw()];
+        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride.Raw()];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
         uint16_t __block responsesNeeded = repeatCount;
         while (repeatCount--) {
@@ -4658,8 +4658,8 @@
         } else {
             params.rate = [NSNumber numberWithUnsignedChar:mRequest.rate.Value()];
         }
-        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
-        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
+        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask.Raw()];
+        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride.Raw()];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
         uint16_t __block responsesNeeded = repeatCount;
         while (repeatCount--) {
@@ -4716,8 +4716,8 @@
         } else {
             params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime.Value()];
         }
-        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
-        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
+        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask.Raw()];
+        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride.Raw()];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
         uint16_t __block responsesNeeded = repeatCount;
         while (repeatCount--) {
@@ -4764,8 +4764,8 @@
         __auto_type * params = [[MTRLevelControlClusterStopParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
-        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
-        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
+        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask.Raw()];
+        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride.Raw()];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
         uint16_t __block responsesNeeded = repeatCount;
         while (repeatCount--) {
@@ -4820,8 +4820,8 @@
         } else {
             params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime.Value()];
         }
-        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
-        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
+        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask.Raw()];
+        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride.Raw()];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
         uint16_t __block responsesNeeded = repeatCount;
         while (repeatCount--) {
@@ -4876,8 +4876,8 @@
         } else {
             params.rate = [NSNumber numberWithUnsignedChar:mRequest.rate.Value()];
         }
-        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
-        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
+        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask.Raw()];
+        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride.Raw()];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
         uint16_t __block responsesNeeded = repeatCount;
         while (repeatCount--) {
@@ -4934,8 +4934,8 @@
         } else {
             params.transitionTime = [NSNumber numberWithUnsignedShort:mRequest.transitionTime.Value()];
         }
-        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
-        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
+        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask.Raw()];
+        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride.Raw()];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
         uint16_t __block responsesNeeded = repeatCount;
         while (repeatCount--) {
@@ -4982,8 +4982,8 @@
         __auto_type * params = [[MTRLevelControlClusterStopWithOnOffParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
-        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask];
-        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride];
+        params.optionsMask = [NSNumber numberWithUnsignedChar:mRequest.optionsMask.Raw()];
+        params.optionsOverride = [NSNumber numberWithUnsignedChar:mRequest.optionsOverride.Raw()];
         uint16_t repeatCount = mRepeatCount.ValueOr(1);
         uint16_t __block responsesNeeded = repeatCount;
         while (repeatCount--) {