diff --git a/src/darwin/Framework/CHIP/MTRBaseDevice.mm b/src/darwin/Framework/CHIP/MTRBaseDevice.mm
index fdc5cdb..d4b9f11 100644
--- a/src/darwin/Framework/CHIP/MTRBaseDevice.mm
+++ b/src/darwin/Framework/CHIP/MTRBaseDevice.mm
@@ -688,9 +688,8 @@
 // Callback bridge for MTRDataValueDictionaryCallback
 class MTRDataValueDictionaryCallbackBridge : public MTRCallbackBridge<MTRDataValueDictionaryCallback> {
 public:
-    MTRDataValueDictionaryCallbackBridge(
-        dispatch_queue_t queue, MTRDeviceResponseHandler handler, MTRActionBlock action, bool keepAlive = false)
-        : MTRCallbackBridge<MTRDataValueDictionaryCallback>(queue, handler, action, OnSuccessFn, keepAlive) {};
+    MTRDataValueDictionaryCallbackBridge(dispatch_queue_t queue, MTRDeviceResponseHandler handler, MTRActionBlock action)
+        : MTRCallbackBridge<MTRDataValueDictionaryCallback>(queue, handler, action, OnSuccessFn) {};
 
     static void OnSuccessFn(void * context, id value) { DispatchSuccess(context, value); }
 };
diff --git a/src/darwin/Framework/CHIP/MTRCallbackBridgeBase_internal.h b/src/darwin/Framework/CHIP/MTRCallbackBridgeBase_internal.h
index 56442b0..5e4913a 100644
--- a/src/darwin/Framework/CHIP/MTRCallbackBridgeBase_internal.h
+++ b/src/darwin/Framework/CHIP/MTRCallbackBridgeBase_internal.h
@@ -72,10 +72,9 @@
      * Construct a callback bridge, which can then have DispatcLocalAction() called
      * on it.
      */
-    MTRCallbackBridge(dispatch_queue_t queue, MTRResponseHandler handler, T OnSuccessFn, bool keepAlive)
+    MTRCallbackBridge(dispatch_queue_t queue, MTRResponseHandler handler, T OnSuccessFn)
         : mQueue(queue)
         , mHandler(handler)
-        , mKeepAlive(keepAlive)
         , mSuccess(OnSuccessFn)
         , mFailure(OnFailureFn)
     {
@@ -85,11 +84,10 @@
      * Construct a callback bridge, which can then have DispatchAction() called
      * on it.
      */
-    MTRCallbackBridge(dispatch_queue_t queue, MTRResponseHandler handler, MTRActionBlock action, T OnSuccessFn, bool keepAlive)
+    MTRCallbackBridge(dispatch_queue_t queue, MTRResponseHandler handler, MTRActionBlock action, T OnSuccessFn)
         : mQueue(queue)
         , mHandler(handler)
         , mAction(action)
-        , mKeepAlive(keepAlive)
         , mSuccess(OnSuccessFn)
         , mFailure(OnFailureFn)
     {
@@ -219,6 +217,26 @@
     static void DispatchFailure(void * context, NSError * error) { DispatchCallbackResult(context, error, nil); }
 
 protected:
+    // OnDone and KeepAliveOnCallback really only make sense for subscription
+    // bridges, but we put them here to avoid many copies of this code in
+    // generated bits.
+    void OnDone()
+    {
+        if (!mQueue) {
+            delete this;
+            return;
+        }
+
+        // Delete ourselves async, so that any error/data reports we
+        // queued up before getting OnDone have a chance to run.
+        auto * self = this;
+        dispatch_async(mQueue, ^{
+            delete self;
+        });
+    }
+
+    void KeepAliveOnCallback() { mKeepAlive = true; }
+
     dispatch_queue_t mQueue;
 
 private:
@@ -230,15 +248,12 @@
         }
 
         if (!callbackBridge->mQueue) {
-            delete callbackBridge;
+            if (!callbackBridge->mKeepAlive) {
+                delete callbackBridge;
+            }
             return;
         }
 
-        if (error) {
-            // We should delete ourselves; there will be no more callbacks.
-            callbackBridge->mKeepAlive = false;
-        }
-
         dispatch_async(callbackBridge->mQueue, ^{
             ChipLogDetail(Controller, "%s %f seconds", callbackBridge->mCookie.UTF8String,
                 -[callbackBridge->mRequestTime timeIntervalSinceNow]);
@@ -252,7 +267,7 @@
 
     MTRResponseHandler mHandler;
     MTRActionBlock mAction;
-    bool mKeepAlive;
+    bool mKeepAlive = false;
 
     T mSuccess;
     MTRErrorCallback mFailure;
diff --git a/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt b/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt
index bde911c..768ae19 100644
--- a/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt
@@ -195,12 +195,18 @@
           using TypeInfo = {{asUpperCamelCase parent.name}}::Attributes::{{asUpperCamelCase name}}::TypeInfo;
 
           chip::Controller::{{asUpperCamelCase parent.name}}Cluster cppCluster(exchangeManager, session, self->_endpoint);
-          return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue], MTR{{>attribute_data_callback_name}}CallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
+          CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue], MTR{{>attribute_data_callback_name}}CallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
               params.filterByFabric,
               !params.replaceExistingSubscriptions,
               chip::NullOptional,
-              [typedBridge](void) { delete typedBridge; }
+              [typedBridge](void) { typedBridge->OnDone(); }
           );
+          if (err == CHIP_NO_ERROR) {
+              // Now that we kicked off the subscribe, flag our callback bridge
+              // to stay alive until we get an OnDone.
+              typedBridge->KeepAliveOnCallback();
+          }
+          return err;
       }, subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
 }
diff --git a/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt b/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt
index 1f6b97e..433a069 100644
--- a/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt
+++ b/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt
@@ -13,12 +13,12 @@
 class MTR{{> @partial-block}}Bridge : public MTRCallbackBridge<{{>callbackType}}>
 {
 public:
-    MTR{{> @partial-block}}Bridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false)
-      : MTRCallbackBridge<{{>callbackType}}>(queue, handler, OnSuccessFn, keepAlive)
+    MTR{{> @partial-block}}Bridge(dispatch_queue_t queue, ResponseHandler handler)
+      : MTRCallbackBridge<{{>callbackType}}>(queue, handler, OnSuccessFn)
       {};
 
-    MTR{{> @partial-block}}Bridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action, bool keepAlive = false)
-      : MTRCallbackBridge<{{>callbackType}}>(queue, handler, action, OnSuccessFn, keepAlive)
+    MTR{{> @partial-block}}Bridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action)
+      : MTRCallbackBridge<{{>callbackType}}>(queue, handler, action, OnSuccessFn)
       {};
 
     static void OnSuccessFn(void * context
@@ -43,11 +43,13 @@
 {
 public:
     MTR{{> @partial-block}}SubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action, MTRSubscriptionEstablishedHandler establishedHandler)
-      : MTR{{> @partial-block}}Bridge(queue, handler, action, true),
+      : MTR{{> @partial-block}}Bridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
       {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTR{{> @partial-block}}Bridge::OnDone;
+    using MTR{{> @partial-block}}Bridge::KeepAliveOnCallback;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -110,5 +112,6 @@
          self->mEstablishedHandler = nil;
      }
 }
+
 {{/unless}}
 {{/if}}
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
index 3ebc201..ba602ab 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
@@ -177,10 +177,16 @@
             using TypeInfo = Identify::Attributes::IdentifyTime::TypeInfo;
 
             chip::Controller::IdentifyCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -240,10 +246,16 @@
             using TypeInfo = Identify::Attributes::IdentifyType::TypeInfo;
 
             chip::Controller::IdentifyCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -306,11 +318,17 @@
             using TypeInfo = Identify::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::IdentifyCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRIdentifyGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -375,11 +393,17 @@
             using TypeInfo = Identify::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::IdentifyCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRIdentifyAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -441,11 +465,17 @@
             using TypeInfo = Identify::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::IdentifyCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRIdentifyAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -505,10 +535,16 @@
             using TypeInfo = Identify::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::IdentifyCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -568,10 +604,16 @@
             using TypeInfo = Identify::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::IdentifyCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -1101,10 +1143,16 @@
             using TypeInfo = Groups::Attributes::NameSupport::TypeInfo;
 
             chip::Controller::GroupsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -1165,11 +1213,17 @@
             using TypeInfo = Groups::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::GroupsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGroupsGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -1232,11 +1286,17 @@
             using TypeInfo = Groups::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::GroupsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGroupsAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -1297,11 +1357,17 @@
             using TypeInfo = Groups::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::GroupsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGroupsAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -1361,10 +1427,16 @@
             using TypeInfo = Groups::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::GroupsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -1424,10 +1496,16 @@
             using TypeInfo = Groups::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::GroupsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2185,10 +2263,16 @@
             using TypeInfo = Scenes::Attributes::SceneCount::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2248,10 +2332,16 @@
             using TypeInfo = Scenes::Attributes::CurrentScene::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2311,10 +2401,16 @@
             using TypeInfo = Scenes::Attributes::CurrentGroup::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2374,10 +2470,16 @@
             using TypeInfo = Scenes::Attributes::SceneValid::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2437,10 +2539,16 @@
             using TypeInfo = Scenes::Attributes::NameSupport::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2500,10 +2608,16 @@
             using TypeInfo = Scenes::Attributes::LastConfiguredBy::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2564,11 +2678,17 @@
             using TypeInfo = Scenes::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRScenesGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2631,11 +2751,17 @@
             using TypeInfo = Scenes::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRScenesAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2696,11 +2822,17 @@
             using TypeInfo = Scenes::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRScenesAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2760,10 +2892,16 @@
             using TypeInfo = Scenes::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -2823,10 +2961,16 @@
             using TypeInfo = Scenes::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ScenesCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -3528,10 +3672,16 @@
             using TypeInfo = OnOff::Attributes::OnOff::TypeInfo;
 
             chip::Controller::OnOffCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -3592,10 +3742,16 @@
             using TypeInfo = OnOff::Attributes::GlobalSceneControl::TypeInfo;
 
             chip::Controller::OnOffCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -3693,10 +3849,16 @@
             using TypeInfo = OnOff::Attributes::OnTime::TypeInfo;
 
             chip::Controller::OnOffCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -3793,10 +3955,16 @@
             using TypeInfo = OnOff::Attributes::OffWaitTime::TypeInfo;
 
             chip::Controller::OnOffCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -3900,11 +4068,17 @@
             using TypeInfo = OnOff::Attributes::StartUpOnOff::TypeInfo;
 
             chip::Controller::OnOffCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -3966,11 +4140,17 @@
             using TypeInfo = OnOff::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::OnOffCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROnOffGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -4032,11 +4212,17 @@
             using TypeInfo = OnOff::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::OnOffCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROnOffAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -4097,10 +4283,16 @@
             using TypeInfo = OnOff::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::OnOffCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROnOffAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -4160,10 +4352,16 @@
             using TypeInfo = OnOff::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::OnOffCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -4223,10 +4421,16 @@
             using TypeInfo = OnOff::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::OnOffCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -4722,10 +4926,16 @@
             using TypeInfo = OnOffSwitchConfiguration::Attributes::SwitchType::TypeInfo;
 
             chip::Controller::OnOffSwitchConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -4822,10 +5032,16 @@
             using TypeInfo = OnOffSwitchConfiguration::Attributes::SwitchActions::TypeInfo;
 
             chip::Controller::OnOffSwitchConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -4889,11 +5105,17 @@
             using TypeInfo = OnOffSwitchConfiguration::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::OnOffSwitchConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -4959,11 +5181,17 @@
             using TypeInfo = OnOffSwitchConfiguration::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::OnOffSwitchConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -5028,11 +5256,17 @@
             using TypeInfo = OnOffSwitchConfiguration::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::OnOffSwitchConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROnOffSwitchConfigurationAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -5093,10 +5327,16 @@
             using TypeInfo = OnOffSwitchConfiguration::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::OnOffSwitchConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -5156,10 +5396,16 @@
             using TypeInfo = OnOffSwitchConfiguration::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::OnOffSwitchConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -5794,10 +6040,16 @@
             using TypeInfo = LevelControl::Attributes::CurrentLevel::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -5857,10 +6109,16 @@
             using TypeInfo = LevelControl::Attributes::RemainingTime::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -5920,10 +6178,16 @@
             using TypeInfo = LevelControl::Attributes::MinLevel::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -5983,10 +6247,16 @@
             using TypeInfo = LevelControl::Attributes::MaxLevel::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6046,10 +6316,16 @@
             using TypeInfo = LevelControl::Attributes::CurrentFrequency::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6109,10 +6385,16 @@
             using TypeInfo = LevelControl::Attributes::MinFrequency::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6172,10 +6454,16 @@
             using TypeInfo = LevelControl::Attributes::MaxFrequency::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6272,10 +6560,16 @@
             using TypeInfo = LevelControl::Attributes::Options::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6373,10 +6667,16 @@
             using TypeInfo = LevelControl::Attributes::OnOffTransitionTime::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6479,10 +6779,16 @@
             using TypeInfo = LevelControl::Attributes::OnLevel::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6584,10 +6890,16 @@
             using TypeInfo = LevelControl::Attributes::OnTransitionTime::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6689,10 +7001,16 @@
             using TypeInfo = LevelControl::Attributes::OffTransitionTime::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6794,10 +7112,16 @@
             using TypeInfo = LevelControl::Attributes::DefaultMoveRate::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6900,10 +7224,16 @@
             using TypeInfo = LevelControl::Attributes::StartUpCurrentLevel::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -6967,11 +7297,17 @@
             using TypeInfo = LevelControl::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRLevelControlGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -7036,11 +7372,17 @@
             using TypeInfo = LevelControl::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRLevelControlAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -7102,11 +7444,17 @@
             using TypeInfo = LevelControl::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRLevelControlAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -7166,10 +7514,16 @@
             using TypeInfo = LevelControl::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -7229,10 +7583,16 @@
             using TypeInfo = LevelControl::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::LevelControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8125,10 +8485,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::ActiveText::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8225,10 +8591,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::Description::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8325,10 +8697,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::InactiveText::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8425,10 +8803,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::OutOfService::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8488,10 +8872,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::Polarity::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8588,10 +8978,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::PresentValue::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8688,10 +9084,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::Reliability::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8751,10 +9153,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::StatusFlags::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8814,10 +9222,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::ApplicationType::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8881,11 +9295,17 @@
             using TypeInfo = BinaryInputBasic::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -8951,11 +9371,17 @@
             using TypeInfo = BinaryInputBasic::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -9019,11 +9445,17 @@
             using TypeInfo = BinaryInputBasic::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBinaryInputBasicAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -9084,10 +9516,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -9147,10 +9585,16 @@
             using TypeInfo = BinaryInputBasic::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::BinaryInputBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -9775,11 +10219,17 @@
             using TypeInfo = Descriptor::Attributes::DeviceTypeList::TypeInfo;
 
             chip::Controller::DescriptorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDescriptorDeviceTypeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -9839,11 +10289,17 @@
             using TypeInfo = Descriptor::Attributes::ServerList::TypeInfo;
 
             chip::Controller::DescriptorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDescriptorServerListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -9903,11 +10359,17 @@
             using TypeInfo = Descriptor::Attributes::ClientList::TypeInfo;
 
             chip::Controller::DescriptorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDescriptorClientListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -9967,11 +10429,17 @@
             using TypeInfo = Descriptor::Attributes::PartsList::TypeInfo;
 
             chip::Controller::DescriptorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDescriptorPartsListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -10034,11 +10502,17 @@
             using TypeInfo = Descriptor::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::DescriptorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDescriptorGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -10103,11 +10577,17 @@
             using TypeInfo = Descriptor::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::DescriptorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDescriptorAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -10169,11 +10649,17 @@
             using TypeInfo = Descriptor::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::DescriptorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDescriptorAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -10233,10 +10719,16 @@
             using TypeInfo = Descriptor::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::DescriptorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -10296,10 +10788,16 @@
             using TypeInfo = Descriptor::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::DescriptorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -10767,10 +11265,16 @@
             using TypeInfo = Binding::Attributes::Binding::TypeInfo;
 
             chip::Controller::BindingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBindingBindingListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -10833,11 +11337,17 @@
             using TypeInfo = Binding::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::BindingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBindingGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -10900,11 +11410,17 @@
             using TypeInfo = Binding::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::BindingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBindingAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -10966,11 +11482,17 @@
             using TypeInfo = Binding::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::BindingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBindingAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -11030,10 +11552,16 @@
             using TypeInfo = Binding::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::BindingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -11093,10 +11621,16 @@
             using TypeInfo = Binding::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::BindingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -11536,10 +12070,16 @@
             using TypeInfo = AccessControl::Attributes::Acl::TypeInfo;
 
             chip::Controller::AccessControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAccessControlAclListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -11660,11 +12200,17 @@
             using TypeInfo = AccessControl::Attributes::Extension::TypeInfo;
 
             chip::Controller::AccessControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAccessControlExtensionListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -11727,10 +12273,16 @@
             using TypeInfo = AccessControl::Attributes::SubjectsPerAccessControlEntry::TypeInfo;
 
             chip::Controller::AccessControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -11794,10 +12346,16 @@
             using TypeInfo = AccessControl::Attributes::TargetsPerAccessControlEntry::TypeInfo;
 
             chip::Controller::AccessControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -11861,10 +12419,16 @@
             using TypeInfo = AccessControl::Attributes::AccessControlEntriesPerFabric::TypeInfo;
 
             chip::Controller::AccessControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -11928,11 +12492,17 @@
             using TypeInfo = AccessControl::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::AccessControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAccessControlGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -11997,11 +12567,17 @@
             using TypeInfo = AccessControl::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::AccessControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAccessControlAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -12063,11 +12639,17 @@
             using TypeInfo = AccessControl::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::AccessControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAccessControlAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -12128,10 +12710,16 @@
             using TypeInfo = AccessControl::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::AccessControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -12191,10 +12779,16 @@
             using TypeInfo = AccessControl::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::AccessControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -13027,10 +13621,16 @@
             using TypeInfo = Actions::Attributes::ActionList::TypeInfo;
 
             chip::Controller::ActionsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRActionsActionListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -13090,11 +13690,17 @@
             using TypeInfo = Actions::Attributes::EndpointLists::TypeInfo;
 
             chip::Controller::ActionsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRActionsEndpointListsListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -13154,10 +13760,16 @@
             using TypeInfo = Actions::Attributes::SetupURL::TypeInfo;
 
             chip::Controller::ActionsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -13220,11 +13832,17 @@
             using TypeInfo = Actions::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ActionsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRActionsGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -13287,11 +13905,17 @@
             using TypeInfo = Actions::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ActionsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRActionsAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -13353,11 +13977,17 @@
             using TypeInfo = Actions::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ActionsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRActionsAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -13417,10 +14047,16 @@
             using TypeInfo = Actions::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ActionsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -13480,10 +14116,16 @@
             using TypeInfo = Actions::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ActionsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -13932,10 +14574,16 @@
             using TypeInfo = Basic::Attributes::DataModelRevision::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -13995,10 +14643,16 @@
             using TypeInfo = Basic::Attributes::VendorName::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14058,10 +14712,16 @@
             using TypeInfo = Basic::Attributes::VendorID::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRVendorIdAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRVendorIdAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14121,10 +14781,16 @@
             using TypeInfo = Basic::Attributes::ProductName::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14184,10 +14850,16 @@
             using TypeInfo = Basic::Attributes::ProductID::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14284,10 +14956,16 @@
             using TypeInfo = Basic::Attributes::NodeLabel::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14384,10 +15062,16 @@
             using TypeInfo = Basic::Attributes::Location::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14447,10 +15131,16 @@
             using TypeInfo = Basic::Attributes::HardwareVersion::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14511,10 +15201,16 @@
             using TypeInfo = Basic::Attributes::HardwareVersionString::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14575,10 +15271,16 @@
             using TypeInfo = Basic::Attributes::SoftwareVersion::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14639,10 +15341,16 @@
             using TypeInfo = Basic::Attributes::SoftwareVersionString::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14703,10 +15411,16 @@
             using TypeInfo = Basic::Attributes::ManufacturingDate::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14766,10 +15480,16 @@
             using TypeInfo = Basic::Attributes::PartNumber::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14829,10 +15549,16 @@
             using TypeInfo = Basic::Attributes::ProductURL::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14892,10 +15618,16 @@
             using TypeInfo = Basic::Attributes::ProductLabel::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -14955,10 +15687,16 @@
             using TypeInfo = Basic::Attributes::SerialNumber::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -15056,10 +15794,16 @@
             using TypeInfo = Basic::Attributes::LocalConfigDisabled::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -15120,10 +15864,16 @@
             using TypeInfo = Basic::Attributes::Reachable::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -15183,10 +15933,16 @@
             using TypeInfo = Basic::Attributes::UniqueID::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -15248,11 +16004,17 @@
             using TypeInfo = Basic::Attributes::CapabilityMinima::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBasicCapabilityMinimaStructAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -15314,11 +16076,17 @@
             using TypeInfo = Basic::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -15380,11 +16148,17 @@
             using TypeInfo = Basic::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -15445,10 +16219,16 @@
             using TypeInfo = Basic::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBasicAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -15508,10 +16288,16 @@
             using TypeInfo = Basic::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -15571,10 +16357,16 @@
             using TypeInfo = Basic::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::BasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -16687,11 +17479,17 @@
             using TypeInfo = OtaSoftwareUpdateProvider::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateProviderCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -16757,11 +17555,17 @@
             using TypeInfo = OtaSoftwareUpdateProvider::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateProviderCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -16826,11 +17630,17 @@
             using TypeInfo = OtaSoftwareUpdateProvider::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateProviderCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -16891,10 +17701,16 @@
             using TypeInfo = OtaSoftwareUpdateProvider::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateProviderCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -16954,10 +17770,16 @@
             using TypeInfo = OtaSoftwareUpdateProvider::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateProviderCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -17337,11 +18159,17 @@
             using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::DefaultOtaProviders::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateRequestorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -17403,10 +18231,16 @@
             using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::UpdatePossible::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateRequestorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -17470,12 +18304,18 @@
             using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::UpdateState::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateRequestorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -17537,10 +18377,16 @@
             using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::UpdateStateProgress::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateRequestorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -17605,11 +18451,17 @@
             using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateRequestorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -17675,11 +18527,17 @@
             using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateRequestorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -17744,11 +18602,17 @@
             using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateRequestorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -17809,10 +18673,16 @@
             using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateRequestorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -17872,10 +18742,16 @@
             using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::OtaSoftwareUpdateRequestorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -18330,10 +19206,16 @@
             using TypeInfo = LocalizationConfiguration::Attributes::ActiveLocale::TypeInfo;
 
             chip::Controller::LocalizationConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -18396,11 +19278,17 @@
             using TypeInfo = LocalizationConfiguration::Attributes::SupportedLocales::TypeInfo;
 
             chip::Controller::LocalizationConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -18465,11 +19353,17 @@
             using TypeInfo = LocalizationConfiguration::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::LocalizationConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -18535,11 +19429,17 @@
             using TypeInfo = LocalizationConfiguration::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::LocalizationConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -18604,11 +19504,17 @@
             using TypeInfo = LocalizationConfiguration::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::LocalizationConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRLocalizationConfigurationAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -18669,10 +19575,16 @@
             using TypeInfo = LocalizationConfiguration::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::LocalizationConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -18732,10 +19644,16 @@
             using TypeInfo = LocalizationConfiguration::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::LocalizationConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -19114,11 +20032,17 @@
             using TypeInfo = TimeFormatLocalization::Attributes::HourFormat::TypeInfo;
 
             chip::Controller::TimeFormatLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTimeFormatLocalizationClusterHourFormatAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -19220,11 +20144,17 @@
             using TypeInfo = TimeFormatLocalization::Attributes::ActiveCalendarType::TypeInfo;
 
             chip::Controller::TimeFormatLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTimeFormatLocalizationClusterCalendarTypeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -19290,11 +20220,17 @@
             using TypeInfo = TimeFormatLocalization::Attributes::SupportedCalendarTypes::TypeInfo;
 
             chip::Controller::TimeFormatLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -19360,11 +20296,17 @@
             using TypeInfo = TimeFormatLocalization::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::TimeFormatLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -19430,11 +20372,17 @@
             using TypeInfo = TimeFormatLocalization::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::TimeFormatLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -19499,11 +20447,17 @@
             using TypeInfo = TimeFormatLocalization::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::TimeFormatLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTimeFormatLocalizationAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -19564,10 +20518,16 @@
             using TypeInfo = TimeFormatLocalization::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::TimeFormatLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -19627,10 +20587,16 @@
             using TypeInfo = TimeFormatLocalization::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::TimeFormatLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20055,11 +21021,17 @@
             using TypeInfo = UnitLocalization::Attributes::TemperatureUnit::TypeInfo;
 
             chip::Controller::UnitLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRUnitLocalizationClusterTempUnitAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20124,11 +21096,17 @@
             using TypeInfo = UnitLocalization::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::UnitLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRUnitLocalizationGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20194,11 +21172,17 @@
             using TypeInfo = UnitLocalization::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::UnitLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRUnitLocalizationAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20262,11 +21246,17 @@
             using TypeInfo = UnitLocalization::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::UnitLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRUnitLocalizationAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20327,10 +21317,16 @@
             using TypeInfo = UnitLocalization::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::UnitLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20390,10 +21386,16 @@
             using TypeInfo = UnitLocalization::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::UnitLocalizationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20700,11 +21702,17 @@
             using TypeInfo = PowerSourceConfiguration::Attributes::Sources::TypeInfo;
 
             chip::Controller::PowerSourceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceConfigurationSourcesListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20769,11 +21777,17 @@
             using TypeInfo = PowerSourceConfiguration::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::PowerSourceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20839,11 +21853,17 @@
             using TypeInfo = PowerSourceConfiguration::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::PowerSourceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20908,11 +21928,17 @@
             using TypeInfo = PowerSourceConfiguration::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::PowerSourceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceConfigurationAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -20973,10 +21999,16 @@
             using TypeInfo = PowerSourceConfiguration::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::PowerSourceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21036,10 +22068,16 @@
             using TypeInfo = PowerSourceConfiguration::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::PowerSourceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21333,11 +22371,17 @@
             using TypeInfo = PowerSource::Attributes::Status::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceClusterPowerSourceStatusAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21398,10 +22442,16 @@
             using TypeInfo = PowerSource::Attributes::Order::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21461,10 +22511,16 @@
             using TypeInfo = PowerSource::Attributes::Description::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21526,10 +22582,16 @@
             using TypeInfo = PowerSource::Attributes::WiredAssessedInputVoltage::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21592,10 +22654,16 @@
             using TypeInfo = PowerSource::Attributes::WiredAssessedInputFrequency::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21658,11 +22726,17 @@
             using TypeInfo = PowerSource::Attributes::WiredCurrentType::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceClusterWiredCurrentTypeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21724,10 +22798,16 @@
             using TypeInfo = PowerSource::Attributes::WiredAssessedCurrent::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21789,10 +22869,16 @@
             using TypeInfo = PowerSource::Attributes::WiredNominalVoltage::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21854,10 +22940,16 @@
             using TypeInfo = PowerSource::Attributes::WiredMaximumCurrent::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21918,10 +23010,16 @@
             using TypeInfo = PowerSource::Attributes::WiredPresent::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -21983,11 +23081,17 @@
             using TypeInfo = PowerSource::Attributes::ActiveWiredFaults::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceActiveWiredFaultsListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22048,10 +23152,16 @@
             using TypeInfo = PowerSource::Attributes::BatVoltage::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22112,10 +23222,16 @@
             using TypeInfo = PowerSource::Attributes::BatPercentRemaining::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22176,10 +23292,16 @@
             using TypeInfo = PowerSource::Attributes::BatTimeRemaining::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22241,11 +23363,17 @@
             using TypeInfo = PowerSource::Attributes::BatChargeLevel::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceClusterBatChargeLevelAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22307,10 +23435,16 @@
             using TypeInfo = PowerSource::Attributes::BatReplacementNeeded::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22373,11 +23507,17 @@
             using TypeInfo = PowerSource::Attributes::BatReplaceability::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceClusterBatReplaceabilityAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22438,10 +23578,16 @@
             using TypeInfo = PowerSource::Attributes::BatPresent::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22501,11 +23647,17 @@
             using TypeInfo = PowerSource::Attributes::ActiveBatFaults::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceActiveBatFaultsListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22568,10 +23720,16 @@
             using TypeInfo = PowerSource::Attributes::BatReplacementDescription::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22633,10 +23791,16 @@
             using TypeInfo = PowerSource::Attributes::BatCommonDesignation::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22698,10 +23862,16 @@
             using TypeInfo = PowerSource::Attributes::BatANSIDesignation::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22762,10 +23932,16 @@
             using TypeInfo = PowerSource::Attributes::BatIECDesignation::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22826,10 +24002,16 @@
             using TypeInfo = PowerSource::Attributes::BatApprovedChemistry::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22890,10 +24072,16 @@
             using TypeInfo = PowerSource::Attributes::BatCapacity::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -22953,10 +24141,16 @@
             using TypeInfo = PowerSource::Attributes::BatQuantity::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -23018,11 +24212,17 @@
             using TypeInfo = PowerSource::Attributes::BatChargeState::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceClusterBatChargeStateAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -23084,10 +24284,16 @@
             using TypeInfo = PowerSource::Attributes::BatTimeToFullCharge::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -23150,10 +24356,16 @@
             using TypeInfo = PowerSource::Attributes::BatFunctionalWhileCharging::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -23215,10 +24427,16 @@
             using TypeInfo = PowerSource::Attributes::BatChargingCurrent::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -23282,11 +24500,17 @@
             using TypeInfo = PowerSource::Attributes::ActiveBatChargeFaults::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -23351,11 +24575,17 @@
             using TypeInfo = PowerSource::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -23420,11 +24650,17 @@
             using TypeInfo = PowerSource::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -23486,11 +24722,17 @@
             using TypeInfo = PowerSource::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPowerSourceAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -23550,10 +24792,16 @@
             using TypeInfo = PowerSource::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -23613,10 +24861,16 @@
             using TypeInfo = PowerSource::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::PowerSourceCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -25083,10 +26337,16 @@
             using TypeInfo = GeneralCommissioning::Attributes::Breadcrumb::TypeInfo;
 
             chip::Controller::GeneralCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -25152,11 +26412,17 @@
             using TypeInfo = GeneralCommissioning::Attributes::BasicCommissioningInfo::TypeInfo;
 
             chip::Controller::GeneralCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -25223,11 +26489,17 @@
             using TypeInfo = GeneralCommissioning::Attributes::RegulatoryConfig::TypeInfo;
 
             chip::Controller::GeneralCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -25292,11 +26564,17 @@
             using TypeInfo = GeneralCommissioning::Attributes::LocationCapability::TypeInfo;
 
             chip::Controller::GeneralCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -25361,10 +26639,16 @@
             using TypeInfo = GeneralCommissioning::Attributes::SupportsConcurrentConnection::TypeInfo;
 
             chip::Controller::GeneralCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -25429,11 +26713,17 @@
             using TypeInfo = GeneralCommissioning::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::GeneralCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -25499,11 +26789,17 @@
             using TypeInfo = GeneralCommissioning::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::GeneralCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -25567,11 +26863,17 @@
             using TypeInfo = GeneralCommissioning::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::GeneralCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralCommissioningAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -25632,10 +26934,16 @@
             using TypeInfo = GeneralCommissioning::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::GeneralCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -25695,10 +27003,16 @@
             using TypeInfo = GeneralCommissioning::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::GeneralCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -26365,10 +27679,16 @@
             using TypeInfo = NetworkCommissioning::Attributes::MaxNetworks::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -26430,11 +27750,17 @@
             using TypeInfo = NetworkCommissioning::Attributes::Networks::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNetworkCommissioningNetworksListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -26496,10 +27822,16 @@
             using TypeInfo = NetworkCommissioning::Attributes::ScanMaxTimeSeconds::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -26561,10 +27893,16 @@
             using TypeInfo = NetworkCommissioning::Attributes::ConnectMaxTimeSeconds::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -26662,10 +28000,16 @@
             using TypeInfo = NetworkCommissioning::Attributes::InterfaceEnabled::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -26730,12 +28074,18 @@
             using TypeInfo = NetworkCommissioning::Attributes::LastNetworkingStatus::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -26797,10 +28147,16 @@
             using TypeInfo = NetworkCommissioning::Attributes::LastNetworkID::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableOctetStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -26861,10 +28217,16 @@
             using TypeInfo = NetworkCommissioning::Attributes::LastConnectErrorValue::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -26929,11 +28291,17 @@
             using TypeInfo = NetworkCommissioning::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -26999,11 +28367,17 @@
             using TypeInfo = NetworkCommissioning::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -27067,11 +28441,17 @@
             using TypeInfo = NetworkCommissioning::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNetworkCommissioningAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -27132,10 +28512,16 @@
             using TypeInfo = NetworkCommissioning::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -27195,10 +28581,16 @@
             using TypeInfo = NetworkCommissioning::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::NetworkCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -27817,11 +29209,17 @@
             using TypeInfo = DiagnosticLogs::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::DiagnosticLogsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -27886,11 +29284,17 @@
             using TypeInfo = DiagnosticLogs::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::DiagnosticLogsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -27954,11 +29358,17 @@
             using TypeInfo = DiagnosticLogs::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::DiagnosticLogsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDiagnosticLogsAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28019,10 +29429,16 @@
             using TypeInfo = DiagnosticLogs::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::DiagnosticLogsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28082,10 +29498,16 @@
             using TypeInfo = DiagnosticLogs::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::DiagnosticLogsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28384,11 +29806,17 @@
             using TypeInfo = GeneralDiagnostics::Attributes::NetworkInterfaces::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28449,10 +29877,16 @@
             using TypeInfo = GeneralDiagnostics::Attributes::RebootCount::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28512,10 +29946,16 @@
             using TypeInfo = GeneralDiagnostics::Attributes::UpTime::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28576,10 +30016,16 @@
             using TypeInfo = GeneralDiagnostics::Attributes::TotalOperationalHours::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28640,10 +30086,16 @@
             using TypeInfo = GeneralDiagnostics::Attributes::BootReasons::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28707,11 +30159,17 @@
             using TypeInfo = GeneralDiagnostics::Attributes::ActiveHardwareFaults::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28776,11 +30234,17 @@
             using TypeInfo = GeneralDiagnostics::Attributes::ActiveRadioFaults::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28845,11 +30309,17 @@
             using TypeInfo = GeneralDiagnostics::Attributes::ActiveNetworkFaults::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28913,10 +30383,16 @@
             using TypeInfo = GeneralDiagnostics::Attributes::TestEventTriggersEnabled::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -28981,11 +30457,17 @@
             using TypeInfo = GeneralDiagnostics::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -29051,11 +30533,17 @@
             using TypeInfo = GeneralDiagnostics::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -29119,11 +30607,17 @@
             using TypeInfo = GeneralDiagnostics::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGeneralDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -29184,10 +30678,16 @@
             using TypeInfo = GeneralDiagnostics::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -29247,10 +30747,16 @@
             using TypeInfo = GeneralDiagnostics::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::GeneralDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -29860,11 +31366,17 @@
             using TypeInfo = SoftwareDiagnostics::Attributes::ThreadMetrics::TypeInfo;
 
             chip::Controller::SoftwareDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -29925,10 +31437,16 @@
             using TypeInfo = SoftwareDiagnostics::Attributes::CurrentHeapFree::TypeInfo;
 
             chip::Controller::SoftwareDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -29988,10 +31506,16 @@
             using TypeInfo = SoftwareDiagnostics::Attributes::CurrentHeapUsed::TypeInfo;
 
             chip::Controller::SoftwareDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -30053,10 +31577,16 @@
             using TypeInfo = SoftwareDiagnostics::Attributes::CurrentHeapHighWatermark::TypeInfo;
 
             chip::Controller::SoftwareDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -30121,11 +31651,17 @@
             using TypeInfo = SoftwareDiagnostics::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::SoftwareDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -30191,11 +31727,17 @@
             using TypeInfo = SoftwareDiagnostics::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::SoftwareDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -30259,11 +31801,17 @@
             using TypeInfo = SoftwareDiagnostics::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::SoftwareDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRSoftwareDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -30324,10 +31872,16 @@
             using TypeInfo = SoftwareDiagnostics::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::SoftwareDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -30387,10 +31941,16 @@
             using TypeInfo = SoftwareDiagnostics::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::SoftwareDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -30831,10 +32391,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::Channel::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -30897,11 +32463,17 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RoutingRole::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -30962,10 +32534,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::NetworkName::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31025,10 +32603,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::PanId::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31088,10 +32672,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::ExtendedPanId::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31151,10 +32741,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::MeshLocalPrefix::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableOctetStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31214,10 +32810,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::OverrunCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31280,11 +32882,17 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::NeighborTableList::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThreadNetworkDiagnosticsNeighborTableListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31348,11 +32956,17 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RouteTableList::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThreadNetworkDiagnosticsRouteTableListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31413,10 +33027,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::PartitionId::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31476,10 +33096,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::Weighting::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31539,10 +33165,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::DataVersion::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31602,10 +33234,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::StableDataVersion::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31665,10 +33303,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::LeaderRouterId::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31728,10 +33372,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::DetachedRoleCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31791,10 +33441,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::ChildRoleCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31854,10 +33510,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RouterRoleCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31917,10 +33579,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::LeaderRoleCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -31981,10 +33649,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::AttachAttemptCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32047,10 +33721,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::PartitionIdChangeCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32114,10 +33794,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::BetterPartitionAttachAttemptCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32178,10 +33864,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::ParentChangeCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32241,10 +33933,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxTotalCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32304,10 +34002,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxUnicastCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32367,10 +34071,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxBroadcastCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32431,10 +34141,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxAckRequestedCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32495,10 +34211,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxAckedCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32559,10 +34281,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxNoAckRequestedCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32623,10 +34351,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxDataCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32686,10 +34420,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxDataPollCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32749,10 +34489,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxBeaconCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32813,10 +34559,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxBeaconRequestCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32877,10 +34629,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxOtherCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -32940,10 +34698,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxRetryCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33005,10 +34769,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxDirectMaxRetryExpiryCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33072,10 +34842,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxIndirectMaxRetryExpiryCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33136,10 +34912,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxErrCcaCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33199,10 +34981,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxErrAbortCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33263,10 +35051,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::TxErrBusyChannelCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33327,10 +35121,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxTotalCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33390,10 +35190,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxUnicastCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33453,10 +35259,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxBroadcastCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33516,10 +35328,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxDataCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33579,10 +35397,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxDataPollCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33642,10 +35466,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxBeaconCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33706,10 +35536,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxBeaconRequestCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33770,10 +35606,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxOtherCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33835,10 +35677,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxAddressFilteredCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33901,10 +35749,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxDestAddrFilteredCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -33965,10 +35819,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxDuplicatedCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34028,10 +35888,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxErrNoFrameCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34093,10 +35959,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxErrUnknownNeighborCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34159,10 +36031,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxErrInvalidSrcAddrCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34223,10 +36101,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxErrSecCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34286,10 +36170,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxErrFcsCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34349,10 +36239,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::RxErrOtherCount::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34412,10 +36308,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::ActiveTimestamp::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34475,10 +36377,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::PendingTimestamp::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34538,10 +36446,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::Delay::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34606,11 +36520,17 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::SecurityPolicy::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34672,10 +36592,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::ChannelPage0Mask::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableOctetStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34746,12 +36672,18 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::OperationalDatasetComponents::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34822,12 +36754,18 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::ActiveNetworkFaultsList::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34893,11 +36831,17 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -34963,11 +36907,17 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -35032,11 +36982,17 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -35097,10 +37053,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -35160,10 +37122,16 @@
             using TypeInfo = ThreadNetworkDiagnostics::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ThreadNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -37668,10 +39636,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::Bssid::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableOctetStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -37734,11 +39708,17 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::SecurityType::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -37803,12 +39783,18 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::WiFiVersion::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -37869,10 +39855,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::ChannelNumber::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -37932,10 +39924,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::Rssi::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -37995,10 +39993,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::BeaconLostCount::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38058,10 +40062,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::BeaconRxCount::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38123,10 +40133,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::PacketMulticastRxCount::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38189,10 +40205,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::PacketMulticastTxCount::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38254,10 +40276,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::PacketUnicastRxCount::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38319,10 +40347,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::PacketUnicastTxCount::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38383,10 +40417,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::CurrentMaxRate::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38446,10 +40486,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::OverrunCount::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38513,11 +40559,17 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38583,11 +40635,17 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38652,11 +40710,17 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38717,10 +40781,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -38780,10 +40850,16 @@
             using TypeInfo = WiFiNetworkDiagnostics::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::WiFiNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -39532,12 +41608,18 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::PHYRate::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -39598,10 +41680,16 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::FullDuplex::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -39661,10 +41749,16 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::PacketRxCount::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -39724,10 +41818,16 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::PacketTxCount::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -39787,10 +41887,16 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::TxErrCount::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -39850,10 +41956,16 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::CollisionCount::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -39913,10 +42025,16 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::OverrunCount::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -39976,10 +42094,16 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::CarrierDetect::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -40039,10 +42163,16 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::TimeSinceReset::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -40106,11 +42236,17 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -40176,11 +42312,17 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -40245,11 +42387,17 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -40310,10 +42458,16 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -40373,10 +42527,16 @@
             using TypeInfo = EthernetNetworkDiagnostics::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::EthernetNetworkDiagnosticsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -40953,10 +43113,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::VendorName::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41016,10 +43182,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::VendorID::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRVendorIdAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRVendorIdAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41079,10 +43251,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::ProductName::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41179,10 +43357,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::NodeLabel::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41242,10 +43426,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::HardwareVersion::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41306,10 +43496,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::HardwareVersionString::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41370,10 +43566,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::SoftwareVersion::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41434,10 +43636,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::SoftwareVersionString::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41498,10 +43706,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::ManufacturingDate::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41561,10 +43775,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::PartNumber::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41624,10 +43844,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::ProductURL::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41687,10 +43913,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::ProductLabel::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41750,10 +43982,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::SerialNumber::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41813,10 +44051,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::Reachable::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41876,10 +44120,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::UniqueID::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -41943,11 +44193,17 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBridgedDeviceBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -42013,11 +44269,17 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBridgedDeviceBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -42081,11 +44343,17 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBridgedDeviceBasicAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -42146,10 +44414,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -42209,10 +44483,16 @@
             using TypeInfo = BridgedDeviceBasic::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::BridgedDeviceBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -42993,10 +45273,16 @@
             using TypeInfo = Switch::Attributes::NumberOfPositions::TypeInfo;
 
             chip::Controller::SwitchCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -43056,10 +45342,16 @@
             using TypeInfo = Switch::Attributes::CurrentPosition::TypeInfo;
 
             chip::Controller::SwitchCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -43119,10 +45411,16 @@
             using TypeInfo = Switch::Attributes::MultiPressMax::TypeInfo;
 
             chip::Controller::SwitchCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -43183,11 +45481,17 @@
             using TypeInfo = Switch::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::SwitchCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRSwitchGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -43250,11 +45554,17 @@
             using TypeInfo = Switch::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::SwitchCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRSwitchAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -43315,11 +45625,17 @@
             using TypeInfo = Switch::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::SwitchCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRSwitchAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -43379,10 +45695,16 @@
             using TypeInfo = Switch::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::SwitchCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -43442,10 +45764,16 @@
             using TypeInfo = Switch::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::SwitchCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -43916,12 +46244,18 @@
             using TypeInfo = AdministratorCommissioning::Attributes::WindowStatus::TypeInfo;
 
             chip::Controller::AdministratorCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -43982,10 +46316,16 @@
             using TypeInfo = AdministratorCommissioning::Attributes::AdminFabricIndex::TypeInfo;
 
             chip::Controller::AdministratorCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -44045,10 +46385,16 @@
             using TypeInfo = AdministratorCommissioning::Attributes::AdminVendorId::TypeInfo;
 
             chip::Controller::AdministratorCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -44112,11 +46458,17 @@
             using TypeInfo = AdministratorCommissioning::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::AdministratorCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -44182,11 +46534,17 @@
             using TypeInfo = AdministratorCommissioning::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::AdministratorCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -44251,11 +46609,17 @@
             using TypeInfo = AdministratorCommissioning::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::AdministratorCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAdministratorCommissioningAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -44316,10 +46680,16 @@
             using TypeInfo = AdministratorCommissioning::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::AdministratorCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -44379,10 +46749,16 @@
             using TypeInfo = AdministratorCommissioning::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::AdministratorCommissioningCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -44994,11 +47370,17 @@
             using TypeInfo = OperationalCredentials::Attributes::NOCs::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROperationalCredentialsNOCsListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -45063,11 +47445,17 @@
             using TypeInfo = OperationalCredentials::Attributes::Fabrics::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROperationalCredentialsFabricsListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -45128,10 +47516,16 @@
             using TypeInfo = OperationalCredentials::Attributes::SupportedFabrics::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -45192,10 +47586,16 @@
             using TypeInfo = OperationalCredentials::Attributes::CommissionedFabrics::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -45261,11 +47661,17 @@
             using TypeInfo = OperationalCredentials::Attributes::TrustedRootCertificates::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -45328,10 +47734,16 @@
             using TypeInfo = OperationalCredentials::Attributes::CurrentFabricIndex::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -45396,11 +47808,17 @@
             using TypeInfo = OperationalCredentials::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROperationalCredentialsGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -45466,11 +47884,17 @@
             using TypeInfo = OperationalCredentials::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROperationalCredentialsAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -45535,11 +47959,17 @@
             using TypeInfo = OperationalCredentials::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROperationalCredentialsAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -45600,10 +48030,16 @@
             using TypeInfo = OperationalCredentials::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -45663,10 +48099,16 @@
             using TypeInfo = OperationalCredentials::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::OperationalCredentialsCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -46410,11 +48852,17 @@
             using TypeInfo = GroupKeyManagement::Attributes::GroupKeyMap::TypeInfo;
 
             chip::Controller::GroupKeyManagementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGroupKeyManagementGroupKeyMapListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -46479,11 +48927,17 @@
             using TypeInfo = GroupKeyManagement::Attributes::GroupTable::TypeInfo;
 
             chip::Controller::GroupKeyManagementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGroupKeyManagementGroupTableListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -46545,10 +48999,16 @@
             using TypeInfo = GroupKeyManagement::Attributes::MaxGroupsPerFabric::TypeInfo;
 
             chip::Controller::GroupKeyManagementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -46610,10 +49070,16 @@
             using TypeInfo = GroupKeyManagement::Attributes::MaxGroupKeysPerFabric::TypeInfo;
 
             chip::Controller::GroupKeyManagementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -46678,11 +49144,17 @@
             using TypeInfo = GroupKeyManagement::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::GroupKeyManagementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -46748,11 +49220,17 @@
             using TypeInfo = GroupKeyManagement::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::GroupKeyManagementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -46816,11 +49294,17 @@
             using TypeInfo = GroupKeyManagement::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::GroupKeyManagementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRGroupKeyManagementAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -46881,10 +49365,16 @@
             using TypeInfo = GroupKeyManagement::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::GroupKeyManagementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -46944,10 +49434,16 @@
             using TypeInfo = GroupKeyManagement::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::GroupKeyManagementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -47378,11 +49874,17 @@
             using TypeInfo = FixedLabel::Attributes::LabelList::TypeInfo;
 
             chip::Controller::FixedLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFixedLabelLabelListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -47445,11 +49947,17 @@
             using TypeInfo = FixedLabel::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::FixedLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFixedLabelGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -47514,11 +50022,17 @@
             using TypeInfo = FixedLabel::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::FixedLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFixedLabelAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -47580,11 +50094,17 @@
             using TypeInfo = FixedLabel::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::FixedLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFixedLabelAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -47644,10 +50164,16 @@
             using TypeInfo = FixedLabel::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::FixedLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -47707,10 +50233,16 @@
             using TypeInfo = FixedLabel::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::FixedLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48062,10 +50594,16 @@
             using TypeInfo = UserLabel::Attributes::LabelList::TypeInfo;
 
             chip::Controller::UserLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRUserLabelLabelListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48128,11 +50666,17 @@
             using TypeInfo = UserLabel::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::UserLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRUserLabelGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48197,11 +50741,17 @@
             using TypeInfo = UserLabel::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::UserLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRUserLabelAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48263,11 +50813,17 @@
             using TypeInfo = UserLabel::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::UserLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRUserLabelAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48327,10 +50883,16 @@
             using TypeInfo = UserLabel::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::UserLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48390,10 +50952,16 @@
             using TypeInfo = UserLabel::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::UserLabelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48696,10 +51264,16 @@
             using TypeInfo = BooleanState::Attributes::StateValue::TypeInfo;
 
             chip::Controller::BooleanStateCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48762,11 +51336,17 @@
             using TypeInfo = BooleanState::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::BooleanStateCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBooleanStateGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48831,11 +51411,17 @@
             using TypeInfo = BooleanState::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::BooleanStateCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBooleanStateAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48897,11 +51483,17 @@
             using TypeInfo = BooleanState::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::BooleanStateCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBooleanStateAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -48961,10 +51553,16 @@
             using TypeInfo = BooleanState::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::BooleanStateCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -49024,10 +51622,16 @@
             using TypeInfo = BooleanState::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::BooleanStateCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -49347,10 +51951,16 @@
             using TypeInfo = ModeSelect::Attributes::Description::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -49410,10 +52020,16 @@
             using TypeInfo = ModeSelect::Attributes::StandardNamespace::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -49473,11 +52089,17 @@
             using TypeInfo = ModeSelect::Attributes::SupportedModes::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRModeSelectSupportedModesListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -49537,10 +52159,16 @@
             using TypeInfo = ModeSelect::Attributes::CurrentMode::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -49642,10 +52270,16 @@
             using TypeInfo = ModeSelect::Attributes::StartUpMode::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -49747,10 +52381,16 @@
             using TypeInfo = ModeSelect::Attributes::OnMode::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -49813,11 +52453,17 @@
             using TypeInfo = ModeSelect::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRModeSelectGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -49882,11 +52528,17 @@
             using TypeInfo = ModeSelect::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRModeSelectAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -49948,11 +52600,17 @@
             using TypeInfo = ModeSelect::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRModeSelectAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -50012,10 +52670,16 @@
             using TypeInfo = ModeSelect::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -50075,10 +52739,16 @@
             using TypeInfo = ModeSelect::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ModeSelectCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51168,11 +53838,17 @@
             using TypeInfo = DoorLock::Attributes::LockState::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableDoorLockClusterDlLockStateAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51233,11 +53909,17 @@
             using TypeInfo = DoorLock::Attributes::LockType::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDoorLockClusterDlLockTypeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51297,10 +53979,16 @@
             using TypeInfo = DoorLock::Attributes::ActuatorEnabled::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51362,11 +54050,17 @@
             using TypeInfo = DoorLock::Attributes::DoorState::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableDoorLockClusterDlDoorStateAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51464,10 +54158,16 @@
             using TypeInfo = DoorLock::Attributes::DoorOpenEvents::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51564,10 +54264,16 @@
             using TypeInfo = DoorLock::Attributes::DoorClosedEvents::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51664,10 +54370,16 @@
             using TypeInfo = DoorLock::Attributes::OpenPeriod::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51729,10 +54441,16 @@
             using TypeInfo = DoorLock::Attributes::NumberOfTotalUsersSupported::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51795,10 +54513,16 @@
             using TypeInfo = DoorLock::Attributes::NumberOfPINUsersSupported::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51861,10 +54585,16 @@
             using TypeInfo = DoorLock::Attributes::NumberOfRFIDUsersSupported::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51928,10 +54658,16 @@
             using TypeInfo = DoorLock::Attributes::NumberOfWeekDaySchedulesSupportedPerUser::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -51996,10 +54732,16 @@
             using TypeInfo = DoorLock::Attributes::NumberOfYearDaySchedulesSupportedPerUser::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52064,10 +54806,16 @@
             using TypeInfo = DoorLock::Attributes::NumberOfHolidaySchedulesSupported::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52128,10 +54876,16 @@
             using TypeInfo = DoorLock::Attributes::MaxPINCodeLength::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52191,10 +54945,16 @@
             using TypeInfo = DoorLock::Attributes::MinPINCodeLength::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52254,10 +55014,16 @@
             using TypeInfo = DoorLock::Attributes::MaxRFIDCodeLength::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52317,10 +55083,16 @@
             using TypeInfo = DoorLock::Attributes::MinRFIDCodeLength::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52382,11 +55154,17 @@
             using TypeInfo = DoorLock::Attributes::CredentialRulesSupport::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDoorLockCredentialRulesSupportAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52451,10 +55229,16 @@
             using TypeInfo = DoorLock::Attributes::NumberOfCredentialsSupportedPerUser::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52552,10 +55336,16 @@
             using TypeInfo = DoorLock::Attributes::Language::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52652,10 +55442,16 @@
             using TypeInfo = DoorLock::Attributes::LEDSettings::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52752,10 +55548,16 @@
             using TypeInfo = DoorLock::Attributes::AutoRelockTime::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52852,10 +55654,16 @@
             using TypeInfo = DoorLock::Attributes::SoundVolume::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -52952,11 +55760,17 @@
             using TypeInfo = DoorLock::Attributes::OperatingMode::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDoorLockClusterDlOperatingModeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -53021,11 +55835,17 @@
             using TypeInfo = DoorLock::Attributes::SupportedOperatingModes::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDoorLockSupportedOperatingModesAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -53092,11 +55912,17 @@
             using TypeInfo = DoorLock::Attributes::DefaultConfigurationRegister::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDoorLockDefaultConfigurationRegisterAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -53197,10 +56023,16 @@
             using TypeInfo = DoorLock::Attributes::EnableLocalProgramming::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -53299,10 +56131,16 @@
             using TypeInfo = DoorLock::Attributes::EnableOneTouchLocking::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -53401,10 +56239,16 @@
             using TypeInfo = DoorLock::Attributes::EnableInsideStatusLED::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -53504,10 +56348,16 @@
             using TypeInfo = DoorLock::Attributes::EnablePrivacyModeButton::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -53609,11 +56459,17 @@
             using TypeInfo = DoorLock::Attributes::LocalProgrammingFeatures::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDoorLockLocalProgrammingFeaturesAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -53713,10 +56569,16 @@
             using TypeInfo = DoorLock::Attributes::WrongCodeEntryLimit::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -53817,10 +56679,16 @@
             using TypeInfo = DoorLock::Attributes::UserCodeTemporaryDisableTime::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -53918,10 +56786,16 @@
             using TypeInfo = DoorLock::Attributes::SendPINOverTheAir::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -54021,10 +56895,16 @@
             using TypeInfo = DoorLock::Attributes::RequirePINforRemoteOperation::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -54123,10 +57003,16 @@
             using TypeInfo = DoorLock::Attributes::ExpiringUserTimeout::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -54190,11 +57076,17 @@
             using TypeInfo = DoorLock::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDoorLockGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -54259,11 +57151,17 @@
             using TypeInfo = DoorLock::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDoorLockAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -54325,11 +57223,17 @@
             using TypeInfo = DoorLock::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRDoorLockAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -54389,10 +57293,16 @@
             using TypeInfo = DoorLock::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -54452,10 +57362,16 @@
             using TypeInfo = DoorLock::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::DoorLockCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -56472,11 +59388,17 @@
             using TypeInfo = WindowCovering::Attributes::Type::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWindowCoveringClusterTypeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -56538,10 +59460,16 @@
             using TypeInfo = WindowCovering::Attributes::PhysicalClosedLimitLift::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -56604,10 +59532,16 @@
             using TypeInfo = WindowCovering::Attributes::PhysicalClosedLimitTilt::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -56669,10 +59603,16 @@
             using TypeInfo = WindowCovering::Attributes::CurrentPositionLift::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -56734,10 +59674,16 @@
             using TypeInfo = WindowCovering::Attributes::CurrentPositionTilt::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -56800,10 +59746,16 @@
             using TypeInfo = WindowCovering::Attributes::NumberOfActuationsLift::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -56866,10 +59818,16 @@
             using TypeInfo = WindowCovering::Attributes::NumberOfActuationsTilt::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -56930,11 +59888,17 @@
             using TypeInfo = WindowCovering::Attributes::ConfigStatus::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWindowCoveringConfigStatusAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -56997,10 +59961,16 @@
             using TypeInfo = WindowCovering::Attributes::CurrentPositionLiftPercentage::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57064,10 +60034,16 @@
             using TypeInfo = WindowCovering::Attributes::CurrentPositionTiltPercentage::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57130,11 +60106,17 @@
             using TypeInfo = WindowCovering::Attributes::OperationalStatus::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWindowCoveringOperationalStatusAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57198,10 +60180,16 @@
             using TypeInfo = WindowCovering::Attributes::TargetPositionLiftPercent100ths::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57265,10 +60253,16 @@
             using TypeInfo = WindowCovering::Attributes::TargetPositionTiltPercent100ths::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57331,11 +60325,17 @@
             using TypeInfo = WindowCovering::Attributes::EndProductType::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWindowCoveringClusterEndProductTypeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57399,10 +60399,16 @@
             using TypeInfo = WindowCovering::Attributes::CurrentPositionLiftPercent100ths::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57466,10 +60472,16 @@
             using TypeInfo = WindowCovering::Attributes::CurrentPositionTiltPercent100ths::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57532,10 +60544,16 @@
             using TypeInfo = WindowCovering::Attributes::InstalledOpenLimitLift::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57598,10 +60616,16 @@
             using TypeInfo = WindowCovering::Attributes::InstalledClosedLimitLift::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57664,10 +60688,16 @@
             using TypeInfo = WindowCovering::Attributes::InstalledOpenLimitTilt::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57730,10 +60760,16 @@
             using TypeInfo = WindowCovering::Attributes::InstalledClosedLimitTilt::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57831,10 +60867,16 @@
             using TypeInfo = WindowCovering::Attributes::Mode::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWindowCoveringModeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57894,11 +60936,17 @@
             using TypeInfo = WindowCovering::Attributes::SafetyStatus::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWindowCoveringSafetyStatusAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -57962,11 +61010,17 @@
             using TypeInfo = WindowCovering::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWindowCoveringGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -58031,11 +61085,17 @@
             using TypeInfo = WindowCovering::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWindowCoveringAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -58099,11 +61159,17 @@
             using TypeInfo = WindowCovering::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWindowCoveringAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -58164,10 +61230,16 @@
             using TypeInfo = WindowCovering::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -58227,10 +61299,16 @@
             using TypeInfo = WindowCovering::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::WindowCoveringCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -59381,10 +62459,16 @@
             using TypeInfo = BarrierControl::Attributes::BarrierMovingState::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -59446,10 +62530,16 @@
             using TypeInfo = BarrierControl::Attributes::BarrierSafetyStatus::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -59511,10 +62601,16 @@
             using TypeInfo = BarrierControl::Attributes::BarrierCapabilities::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -59612,10 +62708,16 @@
             using TypeInfo = BarrierControl::Attributes::BarrierOpenEvents::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -59713,10 +62815,16 @@
             using TypeInfo = BarrierControl::Attributes::BarrierCloseEvents::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -59816,10 +62924,16 @@
             using TypeInfo = BarrierControl::Attributes::BarrierCommandOpenEvents::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -59919,10 +63033,16 @@
             using TypeInfo = BarrierControl::Attributes::BarrierCommandCloseEvents::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -60020,10 +63140,16 @@
             using TypeInfo = BarrierControl::Attributes::BarrierOpenPeriod::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -60121,10 +63247,16 @@
             using TypeInfo = BarrierControl::Attributes::BarrierClosePeriod::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -60185,10 +63317,16 @@
             using TypeInfo = BarrierControl::Attributes::BarrierPosition::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -60252,11 +63390,17 @@
             using TypeInfo = BarrierControl::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBarrierControlGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -60321,11 +63465,17 @@
             using TypeInfo = BarrierControl::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBarrierControlAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -60389,11 +63539,17 @@
             using TypeInfo = BarrierControl::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBarrierControlAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -60454,10 +63610,16 @@
             using TypeInfo = BarrierControl::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -60517,10 +63679,16 @@
             using TypeInfo = BarrierControl::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::BarrierControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61218,10 +64386,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MaxPressure::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61281,10 +64455,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MaxSpeed::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61344,10 +64524,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MaxFlow::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61407,10 +64593,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MinConstPressure::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61470,10 +64662,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MaxConstPressure::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61533,10 +64731,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MinCompPressure::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61596,10 +64800,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MaxCompPressure::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61659,10 +64869,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MinConstSpeed::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61722,10 +64938,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MaxConstSpeed::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61785,10 +65007,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MinConstFlow::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61848,10 +65076,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MaxConstFlow::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61911,10 +65145,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MinConstTemp::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -61974,10 +65214,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::MaxConstTemp::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62039,11 +65285,17 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::PumpStatus::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPumpConfigurationAndControlPumpStatusAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62110,12 +65362,18 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::EffectiveOperationMode::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62181,11 +65439,17 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::EffectiveControlMode::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPumpConfigurationAndControlClusterPumpControlModeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62247,10 +65511,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::Capacity::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62310,10 +65580,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::Speed::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62416,10 +65692,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::LifetimeRunningHours::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62480,10 +65762,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::Power::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62587,10 +65875,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62692,12 +65986,18 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::OperationMode::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62798,11 +66098,17 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::ControlMode::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPumpConfigurationAndControlClusterPumpControlModeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62868,12 +66174,18 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -62939,11 +66251,17 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -63008,11 +66326,17 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPumpConfigurationAndControlAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -63073,10 +66397,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -63136,10 +66466,16 @@
             using TypeInfo = PumpConfigurationAndControl::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::PumpConfigurationAndControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -64377,10 +67713,16 @@
             using TypeInfo = Thermostat::Attributes::LocalTemperature::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -64441,10 +67783,16 @@
             using TypeInfo = Thermostat::Attributes::OutdoorTemperature::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -64505,10 +67853,16 @@
             using TypeInfo = Thermostat::Attributes::Occupancy::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -64570,10 +67924,16 @@
             using TypeInfo = Thermostat::Attributes::AbsMinHeatSetpointLimit::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -64636,10 +67996,16 @@
             using TypeInfo = Thermostat::Attributes::AbsMaxHeatSetpointLimit::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -64702,10 +68068,16 @@
             using TypeInfo = Thermostat::Attributes::AbsMinCoolSetpointLimit::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -64768,10 +68140,16 @@
             using TypeInfo = Thermostat::Attributes::AbsMaxCoolSetpointLimit::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -64832,10 +68210,16 @@
             using TypeInfo = Thermostat::Attributes::PICoolingDemand::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -64895,10 +68279,16 @@
             using TypeInfo = Thermostat::Attributes::PIHeatingDemand::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -64997,10 +68387,16 @@
             using TypeInfo = Thermostat::Attributes::HVACSystemTypeConfiguration::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -65100,10 +68496,16 @@
             using TypeInfo = Thermostat::Attributes::LocalTemperatureCalibration::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -65203,10 +68605,16 @@
             using TypeInfo = Thermostat::Attributes::OccupiedCoolingSetpoint::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -65306,10 +68714,16 @@
             using TypeInfo = Thermostat::Attributes::OccupiedHeatingSetpoint::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -65409,10 +68823,16 @@
             using TypeInfo = Thermostat::Attributes::UnoccupiedCoolingSetpoint::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -65512,10 +68932,16 @@
             using TypeInfo = Thermostat::Attributes::UnoccupiedHeatingSetpoint::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -65614,10 +69040,16 @@
             using TypeInfo = Thermostat::Attributes::MinHeatSetpointLimit::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -65716,10 +69148,16 @@
             using TypeInfo = Thermostat::Attributes::MaxHeatSetpointLimit::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -65818,10 +69256,16 @@
             using TypeInfo = Thermostat::Attributes::MinCoolSetpointLimit::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -65920,10 +69364,16 @@
             using TypeInfo = Thermostat::Attributes::MaxCoolSetpointLimit::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66022,10 +69472,16 @@
             using TypeInfo = Thermostat::Attributes::MinSetpointDeadBand::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66123,10 +69579,16 @@
             using TypeInfo = Thermostat::Attributes::RemoteSensing::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66228,11 +69690,17 @@
             using TypeInfo = Thermostat::Attributes::ControlSequenceOfOperation::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThermostatClusterThermostatControlSequenceAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66331,10 +69799,16 @@
             using TypeInfo = Thermostat::Attributes::SystemMode::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66395,10 +69869,16 @@
             using TypeInfo = Thermostat::Attributes::ThermostatRunningMode::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66459,10 +69939,16 @@
             using TypeInfo = Thermostat::Attributes::StartOfWeek::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66524,10 +70010,16 @@
             using TypeInfo = Thermostat::Attributes::NumberOfWeeklyTransitions::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66590,10 +70082,16 @@
             using TypeInfo = Thermostat::Attributes::NumberOfDailyTransitions::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66693,10 +70191,16 @@
             using TypeInfo = Thermostat::Attributes::TemperatureSetpointHold::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66803,10 +70307,16 @@
             using TypeInfo = Thermostat::Attributes::TemperatureSetpointHoldDuration::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66908,10 +70418,16 @@
             using TypeInfo = Thermostat::Attributes::ThermostatProgrammingOperationMode::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -66974,10 +70490,16 @@
             using TypeInfo = Thermostat::Attributes::ThermostatRunningState::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67039,10 +70561,16 @@
             using TypeInfo = Thermostat::Attributes::SetpointChangeSource::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67104,10 +70632,16 @@
             using TypeInfo = Thermostat::Attributes::SetpointChangeAmount::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67171,10 +70705,16 @@
             using TypeInfo = Thermostat::Attributes::SetpointChangeSourceTimestamp::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67277,10 +70817,16 @@
             using TypeInfo = Thermostat::Attributes::OccupiedSetback::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67341,10 +70887,16 @@
             using TypeInfo = Thermostat::Attributes::OccupiedSetbackMin::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67406,10 +70958,16 @@
             using TypeInfo = Thermostat::Attributes::OccupiedSetbackMax::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67512,10 +71070,16 @@
             using TypeInfo = Thermostat::Attributes::UnoccupiedSetback::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67576,10 +71140,16 @@
             using TypeInfo = Thermostat::Attributes::UnoccupiedSetbackMin::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67641,10 +71211,16 @@
             using TypeInfo = Thermostat::Attributes::UnoccupiedSetbackMax::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67743,10 +71319,16 @@
             using TypeInfo = Thermostat::Attributes::EmergencyHeatDelta::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67844,10 +71426,16 @@
             using TypeInfo = Thermostat::Attributes::ACType::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -67944,10 +71532,16 @@
             using TypeInfo = Thermostat::Attributes::ACCapacity::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68044,10 +71638,16 @@
             using TypeInfo = Thermostat::Attributes::ACRefrigerantType::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68144,10 +71744,16 @@
             using TypeInfo = Thermostat::Attributes::ACCompressorType::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68244,10 +71850,16 @@
             using TypeInfo = Thermostat::Attributes::ACErrorCode::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68344,10 +71956,16 @@
             using TypeInfo = Thermostat::Attributes::ACLouverPosition::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68407,10 +72025,16 @@
             using TypeInfo = Thermostat::Attributes::ACCoilTemperature::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68507,10 +72131,16 @@
             using TypeInfo = Thermostat::Attributes::ACCapacityformat::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68573,11 +72203,17 @@
             using TypeInfo = Thermostat::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThermostatGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68642,11 +72278,17 @@
             using TypeInfo = Thermostat::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThermostatAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68708,11 +72350,17 @@
             using TypeInfo = Thermostat::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThermostatAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68772,10 +72420,16 @@
             using TypeInfo = Thermostat::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -68835,10 +72489,16 @@
             using TypeInfo = Thermostat::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ThermostatCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -71184,11 +74844,17 @@
             using TypeInfo = FanControl::Attributes::FanMode::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFanControlClusterFanModeTypeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -71287,11 +74953,17 @@
             using TypeInfo = FanControl::Attributes::FanModeSequence::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFanControlClusterFanModeSequenceTypeAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -71394,10 +75066,16 @@
             using TypeInfo = FanControl::Attributes::PercentSetting::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -71457,10 +75135,16 @@
             using TypeInfo = FanControl::Attributes::PercentCurrent::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -71520,10 +75204,16 @@
             using TypeInfo = FanControl::Attributes::SpeedMax::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -71625,10 +75315,16 @@
             using TypeInfo = FanControl::Attributes::SpeedSetting::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -71688,10 +75384,16 @@
             using TypeInfo = FanControl::Attributes::SpeedCurrent::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -71751,10 +75453,16 @@
             using TypeInfo = FanControl::Attributes::RockSupport::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -71851,10 +75559,16 @@
             using TypeInfo = FanControl::Attributes::RockSetting::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -71914,10 +75628,16 @@
             using TypeInfo = FanControl::Attributes::WindSupport::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -72014,10 +75734,16 @@
             using TypeInfo = FanControl::Attributes::WindSetting::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -72080,11 +75806,17 @@
             using TypeInfo = FanControl::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFanControlGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -72149,11 +75881,17 @@
             using TypeInfo = FanControl::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFanControlAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -72215,11 +75953,17 @@
             using TypeInfo = FanControl::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFanControlAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -72279,10 +76023,16 @@
             using TypeInfo = FanControl::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -72342,10 +76092,16 @@
             using TypeInfo = FanControl::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::FanControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -73078,10 +76834,16 @@
             using TypeInfo = ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::TypeInfo;
 
             chip::Controller::ThermostatUserInterfaceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -73179,10 +76941,16 @@
             using TypeInfo = ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::TypeInfo;
 
             chip::Controller::ThermostatUserInterfaceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -73282,10 +77050,16 @@
             using TypeInfo = ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::TypeInfo;
 
             chip::Controller::ThermostatUserInterfaceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -73352,12 +77126,18 @@
             using TypeInfo = ThermostatUserInterfaceConfiguration::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ThermostatUserInterfaceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -73425,12 +77205,18 @@
             using TypeInfo = ThermostatUserInterfaceConfiguration::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ThermostatUserInterfaceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -73497,12 +77283,18 @@
             using TypeInfo = ThermostatUserInterfaceConfiguration::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ThermostatUserInterfaceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -73563,10 +77355,16 @@
             using TypeInfo = ThermostatUserInterfaceConfiguration::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ThermostatUserInterfaceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -73626,10 +77424,16 @@
             using TypeInfo = ThermostatUserInterfaceConfiguration::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ThermostatUserInterfaceConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -74623,10 +78427,16 @@
             using TypeInfo = ColorControl::Attributes::CurrentHue::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -74686,10 +78496,16 @@
             using TypeInfo = ColorControl::Attributes::CurrentSaturation::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -74749,10 +78565,16 @@
             using TypeInfo = ColorControl::Attributes::RemainingTime::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -74812,10 +78634,16 @@
             using TypeInfo = ColorControl::Attributes::CurrentX::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -74875,10 +78703,16 @@
             using TypeInfo = ColorControl::Attributes::CurrentY::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -74938,10 +78772,16 @@
             using TypeInfo = ColorControl::Attributes::DriftCompensation::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75001,10 +78841,16 @@
             using TypeInfo = ColorControl::Attributes::CompensationText::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75066,10 +78912,16 @@
             using TypeInfo = ColorControl::Attributes::ColorTemperatureMireds::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75130,10 +78982,16 @@
             using TypeInfo = ColorControl::Attributes::ColorMode::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75230,10 +79088,16 @@
             using TypeInfo = ColorControl::Attributes::Options::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75293,10 +79157,16 @@
             using TypeInfo = ColorControl::Attributes::NumberOfPrimaries::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75356,10 +79226,16 @@
             using TypeInfo = ColorControl::Attributes::Primary1X::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75419,10 +79295,16 @@
             using TypeInfo = ColorControl::Attributes::Primary1Y::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75482,10 +79364,16 @@
             using TypeInfo = ColorControl::Attributes::Primary1Intensity::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75545,10 +79433,16 @@
             using TypeInfo = ColorControl::Attributes::Primary2X::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75608,10 +79502,16 @@
             using TypeInfo = ColorControl::Attributes::Primary2Y::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75671,10 +79571,16 @@
             using TypeInfo = ColorControl::Attributes::Primary2Intensity::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75734,10 +79640,16 @@
             using TypeInfo = ColorControl::Attributes::Primary3X::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75797,10 +79709,16 @@
             using TypeInfo = ColorControl::Attributes::Primary3Y::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75860,10 +79778,16 @@
             using TypeInfo = ColorControl::Attributes::Primary3Intensity::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75923,10 +79847,16 @@
             using TypeInfo = ColorControl::Attributes::Primary4X::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -75986,10 +79916,16 @@
             using TypeInfo = ColorControl::Attributes::Primary4Y::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76049,10 +79985,16 @@
             using TypeInfo = ColorControl::Attributes::Primary4Intensity::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76112,10 +80054,16 @@
             using TypeInfo = ColorControl::Attributes::Primary5X::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76175,10 +80123,16 @@
             using TypeInfo = ColorControl::Attributes::Primary5Y::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76238,10 +80192,16 @@
             using TypeInfo = ColorControl::Attributes::Primary5Intensity::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76301,10 +80261,16 @@
             using TypeInfo = ColorControl::Attributes::Primary6X::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76364,10 +80330,16 @@
             using TypeInfo = ColorControl::Attributes::Primary6Y::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76427,10 +80399,16 @@
             using TypeInfo = ColorControl::Attributes::Primary6Intensity::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76527,10 +80505,16 @@
             using TypeInfo = ColorControl::Attributes::WhitePointX::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76627,10 +80611,16 @@
             using TypeInfo = ColorControl::Attributes::WhitePointY::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76727,10 +80717,16 @@
             using TypeInfo = ColorControl::Attributes::ColorPointRX::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76827,10 +80823,16 @@
             using TypeInfo = ColorControl::Attributes::ColorPointRY::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -76933,10 +80935,16 @@
             using TypeInfo = ColorControl::Attributes::ColorPointRIntensity::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77034,10 +81042,16 @@
             using TypeInfo = ColorControl::Attributes::ColorPointGX::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77134,10 +81148,16 @@
             using TypeInfo = ColorControl::Attributes::ColorPointGY::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77240,10 +81260,16 @@
             using TypeInfo = ColorControl::Attributes::ColorPointGIntensity::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77341,10 +81367,16 @@
             using TypeInfo = ColorControl::Attributes::ColorPointBX::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77441,10 +81473,16 @@
             using TypeInfo = ColorControl::Attributes::ColorPointBY::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77547,10 +81585,16 @@
             using TypeInfo = ColorControl::Attributes::ColorPointBIntensity::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77612,10 +81656,16 @@
             using TypeInfo = ColorControl::Attributes::EnhancedCurrentHue::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77676,10 +81726,16 @@
             using TypeInfo = ColorControl::Attributes::EnhancedColorMode::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77739,10 +81795,16 @@
             using TypeInfo = ColorControl::Attributes::ColorLoopActive::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77803,10 +81865,16 @@
             using TypeInfo = ColorControl::Attributes::ColorLoopDirection::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77867,10 +81935,16 @@
             using TypeInfo = ColorControl::Attributes::ColorLoopTime::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77932,10 +82006,16 @@
             using TypeInfo = ColorControl::Attributes::ColorLoopStartEnhancedHue::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -77998,10 +82078,16 @@
             using TypeInfo = ColorControl::Attributes::ColorLoopStoredEnhancedHue::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -78062,10 +82148,16 @@
             using TypeInfo = ColorControl::Attributes::ColorCapabilities::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -78127,10 +82219,16 @@
             using TypeInfo = ColorControl::Attributes::ColorTempPhysicalMinMireds::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -78193,10 +82291,16 @@
             using TypeInfo = ColorControl::Attributes::ColorTempPhysicalMaxMireds::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -78260,10 +82364,16 @@
             using TypeInfo = ColorControl::Attributes::CoupleColorTempToLevelMinMireds::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -78369,10 +82479,16 @@
             using TypeInfo = ColorControl::Attributes::StartUpColorTemperatureMireds::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -78436,11 +82552,17 @@
             using TypeInfo = ColorControl::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRColorControlGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -78505,11 +82627,17 @@
             using TypeInfo = ColorControl::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRColorControlAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -78571,11 +82699,17 @@
             using TypeInfo = ColorControl::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRColorControlAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -78635,10 +82769,16 @@
             using TypeInfo = ColorControl::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -78698,10 +82838,16 @@
             using TypeInfo = ColorControl::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ColorControlCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -80986,10 +85132,16 @@
             using TypeInfo = BallastConfiguration::Attributes::PhysicalMinLevel::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -81049,10 +85201,16 @@
             using TypeInfo = BallastConfiguration::Attributes::PhysicalMaxLevel::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -81112,10 +85270,16 @@
             using TypeInfo = BallastConfiguration::Attributes::BallastStatus::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -81212,10 +85376,16 @@
             using TypeInfo = BallastConfiguration::Attributes::MinLevel::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -81312,10 +85482,16 @@
             using TypeInfo = BallastConfiguration::Attributes::MaxLevel::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -81419,10 +85595,16 @@
             using TypeInfo = BallastConfiguration::Attributes::IntrinsicBalanceFactor::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -81527,10 +85709,16 @@
             using TypeInfo = BallastConfiguration::Attributes::BallastFactorAdjustment::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -81591,10 +85779,16 @@
             using TypeInfo = BallastConfiguration::Attributes::LampQuantity::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -81691,10 +85885,16 @@
             using TypeInfo = BallastConfiguration::Attributes::LampType::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -81791,10 +85991,16 @@
             using TypeInfo = BallastConfiguration::Attributes::LampManufacturer::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -81896,10 +86102,16 @@
             using TypeInfo = BallastConfiguration::Attributes::LampRatedHours::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -82001,10 +86213,16 @@
             using TypeInfo = BallastConfiguration::Attributes::LampBurnHours::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -82101,10 +86319,16 @@
             using TypeInfo = BallastConfiguration::Attributes::LampAlarmMode::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -82208,10 +86432,16 @@
             using TypeInfo = BallastConfiguration::Attributes::LampBurnHoursTripPoint::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -82276,11 +86506,17 @@
             using TypeInfo = BallastConfiguration::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBallastConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -82346,11 +86582,17 @@
             using TypeInfo = BallastConfiguration::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBallastConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -82414,11 +86656,17 @@
             using TypeInfo = BallastConfiguration::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRBallastConfigurationAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -82479,10 +86727,16 @@
             using TypeInfo = BallastConfiguration::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -82542,10 +86796,16 @@
             using TypeInfo = BallastConfiguration::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::BallastConfigurationCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -83394,10 +87654,16 @@
             using TypeInfo = IlluminanceMeasurement::Attributes::MeasuredValue::TypeInfo;
 
             chip::Controller::IlluminanceMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -83457,10 +87723,16 @@
             using TypeInfo = IlluminanceMeasurement::Attributes::MinMeasuredValue::TypeInfo;
 
             chip::Controller::IlluminanceMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -83520,10 +87792,16 @@
             using TypeInfo = IlluminanceMeasurement::Attributes::MaxMeasuredValue::TypeInfo;
 
             chip::Controller::IlluminanceMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -83583,10 +87861,16 @@
             using TypeInfo = IlluminanceMeasurement::Attributes::Tolerance::TypeInfo;
 
             chip::Controller::IlluminanceMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -83646,10 +87930,16 @@
             using TypeInfo = IlluminanceMeasurement::Attributes::LightSensorType::TypeInfo;
 
             chip::Controller::IlluminanceMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -83713,11 +88003,17 @@
             using TypeInfo = IlluminanceMeasurement::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::IlluminanceMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -83783,11 +88079,17 @@
             using TypeInfo = IlluminanceMeasurement::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::IlluminanceMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -83852,11 +88154,17 @@
             using TypeInfo = IlluminanceMeasurement::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::IlluminanceMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRIlluminanceMeasurementAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -83917,10 +88225,16 @@
             using TypeInfo = IlluminanceMeasurement::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::IlluminanceMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -83980,10 +88294,16 @@
             using TypeInfo = IlluminanceMeasurement::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::IlluminanceMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -84416,10 +88736,16 @@
             using TypeInfo = TemperatureMeasurement::Attributes::MeasuredValue::TypeInfo;
 
             chip::Controller::TemperatureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -84479,10 +88805,16 @@
             using TypeInfo = TemperatureMeasurement::Attributes::MinMeasuredValue::TypeInfo;
 
             chip::Controller::TemperatureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -84542,10 +88874,16 @@
             using TypeInfo = TemperatureMeasurement::Attributes::MaxMeasuredValue::TypeInfo;
 
             chip::Controller::TemperatureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -84605,10 +88943,16 @@
             using TypeInfo = TemperatureMeasurement::Attributes::Tolerance::TypeInfo;
 
             chip::Controller::TemperatureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -84672,11 +89016,17 @@
             using TypeInfo = TemperatureMeasurement::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::TemperatureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -84742,11 +89092,17 @@
             using TypeInfo = TemperatureMeasurement::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::TemperatureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -84811,11 +89167,17 @@
             using TypeInfo = TemperatureMeasurement::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::TemperatureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTemperatureMeasurementAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -84876,10 +89238,16 @@
             using TypeInfo = TemperatureMeasurement::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::TemperatureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -84939,10 +89307,16 @@
             using TypeInfo = TemperatureMeasurement::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::TemperatureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85340,10 +89714,16 @@
             using TypeInfo = PressureMeasurement::Attributes::MeasuredValue::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85403,10 +89783,16 @@
             using TypeInfo = PressureMeasurement::Attributes::MinMeasuredValue::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85466,10 +89852,16 @@
             using TypeInfo = PressureMeasurement::Attributes::MaxMeasuredValue::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85529,10 +89921,16 @@
             using TypeInfo = PressureMeasurement::Attributes::Tolerance::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85592,10 +89990,16 @@
             using TypeInfo = PressureMeasurement::Attributes::ScaledValue::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85655,10 +90059,16 @@
             using TypeInfo = PressureMeasurement::Attributes::MinScaledValue::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85718,10 +90128,16 @@
             using TypeInfo = PressureMeasurement::Attributes::MaxScaledValue::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85781,10 +90197,16 @@
             using TypeInfo = PressureMeasurement::Attributes::ScaledTolerance::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85844,10 +90266,16 @@
             using TypeInfo = PressureMeasurement::Attributes::Scale::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85911,11 +90339,17 @@
             using TypeInfo = PressureMeasurement::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPressureMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -85981,11 +90415,17 @@
             using TypeInfo = PressureMeasurement::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPressureMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -86049,11 +90489,17 @@
             using TypeInfo = PressureMeasurement::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRPressureMeasurementAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -86114,10 +90560,16 @@
             using TypeInfo = PressureMeasurement::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -86177,10 +90629,16 @@
             using TypeInfo = PressureMeasurement::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::PressureMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -86746,10 +91204,16 @@
             using TypeInfo = FlowMeasurement::Attributes::MeasuredValue::TypeInfo;
 
             chip::Controller::FlowMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -86809,10 +91273,16 @@
             using TypeInfo = FlowMeasurement::Attributes::MinMeasuredValue::TypeInfo;
 
             chip::Controller::FlowMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -86872,10 +91342,16 @@
             using TypeInfo = FlowMeasurement::Attributes::MaxMeasuredValue::TypeInfo;
 
             chip::Controller::FlowMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -86935,10 +91411,16 @@
             using TypeInfo = FlowMeasurement::Attributes::Tolerance::TypeInfo;
 
             chip::Controller::FlowMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87002,11 +91484,17 @@
             using TypeInfo = FlowMeasurement::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::FlowMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFlowMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87072,11 +91560,17 @@
             using TypeInfo = FlowMeasurement::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::FlowMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFlowMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87140,11 +91634,17 @@
             using TypeInfo = FlowMeasurement::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::FlowMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRFlowMeasurementAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87205,10 +91705,16 @@
             using TypeInfo = FlowMeasurement::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::FlowMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87268,10 +91774,16 @@
             using TypeInfo = FlowMeasurement::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::FlowMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87669,10 +92181,16 @@
             using TypeInfo = RelativeHumidityMeasurement::Attributes::MeasuredValue::TypeInfo;
 
             chip::Controller::RelativeHumidityMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87732,10 +92250,16 @@
             using TypeInfo = RelativeHumidityMeasurement::Attributes::MinMeasuredValue::TypeInfo;
 
             chip::Controller::RelativeHumidityMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87795,10 +92319,16 @@
             using TypeInfo = RelativeHumidityMeasurement::Attributes::MaxMeasuredValue::TypeInfo;
 
             chip::Controller::RelativeHumidityMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87858,10 +92388,16 @@
             using TypeInfo = RelativeHumidityMeasurement::Attributes::Tolerance::TypeInfo;
 
             chip::Controller::RelativeHumidityMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87926,12 +92462,18 @@
             using TypeInfo = RelativeHumidityMeasurement::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::RelativeHumidityMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge::
                     OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -87997,11 +92539,17 @@
             using TypeInfo = RelativeHumidityMeasurement::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::RelativeHumidityMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -88066,11 +92614,17 @@
             using TypeInfo = RelativeHumidityMeasurement::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::RelativeHumidityMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -88131,10 +92685,16 @@
             using TypeInfo = RelativeHumidityMeasurement::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::RelativeHumidityMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -88194,10 +92754,16 @@
             using TypeInfo = RelativeHumidityMeasurement::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::RelativeHumidityMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -88595,10 +93161,16 @@
             using TypeInfo = OccupancySensing::Attributes::Occupancy::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -88659,10 +93231,16 @@
             using TypeInfo = OccupancySensing::Attributes::OccupancySensorType::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -88725,10 +93303,16 @@
             using TypeInfo = OccupancySensing::Attributes::OccupancySensorTypeBitmap::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -88829,10 +93413,16 @@
             using TypeInfo = OccupancySensing::Attributes::PirOccupiedToUnoccupiedDelay::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -88933,10 +93523,16 @@
             using TypeInfo = OccupancySensing::Attributes::PirUnoccupiedToOccupiedDelay::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89038,10 +93634,16 @@
             using TypeInfo = OccupancySensing::Attributes::PirUnoccupiedToOccupiedThreshold::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89143,10 +93745,16 @@
             using TypeInfo = OccupancySensing::Attributes::UltrasonicOccupiedToUnoccupiedDelay::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89248,10 +93856,16 @@
             using TypeInfo = OccupancySensing::Attributes::UltrasonicUnoccupiedToOccupiedDelay::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89355,10 +93969,16 @@
             using TypeInfo = OccupancySensing::Attributes::UltrasonicUnoccupiedToOccupiedThreshold::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89462,10 +94082,16 @@
             using TypeInfo = OccupancySensing::Attributes::PhysicalContactOccupiedToUnoccupiedDelay::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89570,10 +94196,16 @@
             using TypeInfo = OccupancySensing::Attributes::PhysicalContactUnoccupiedToOccupiedDelay::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89678,10 +94310,16 @@
             using TypeInfo = OccupancySensing::Attributes::PhysicalContactUnoccupiedToOccupiedThreshold::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89747,11 +94385,17 @@
             using TypeInfo = OccupancySensing::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROccupancySensingGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89817,11 +94461,17 @@
             using TypeInfo = OccupancySensing::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROccupancySensingAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89885,11 +94535,17 @@
             using TypeInfo = OccupancySensing::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROccupancySensingAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -89950,10 +94606,16 @@
             using TypeInfo = OccupancySensing::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -90013,10 +94675,16 @@
             using TypeInfo = OccupancySensing::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::OccupancySensingCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -90807,10 +95475,16 @@
             using TypeInfo = WakeOnLan::Attributes::MACAddress::TypeInfo;
 
             chip::Controller::WakeOnLanCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -90873,11 +95547,17 @@
             using TypeInfo = WakeOnLan::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::WakeOnLanCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWakeOnLanGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -90942,11 +95622,17 @@
             using TypeInfo = WakeOnLan::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::WakeOnLanCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWakeOnLanAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91008,11 +95694,17 @@
             using TypeInfo = WakeOnLan::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::WakeOnLanCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRWakeOnLanAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91072,10 +95764,16 @@
             using TypeInfo = WakeOnLan::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::WakeOnLanCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91135,10 +95833,16 @@
             using TypeInfo = WakeOnLan::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::WakeOnLanCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91512,10 +96216,16 @@
             using TypeInfo = Channel::Attributes::ChannelList::TypeInfo;
 
             chip::Controller::ChannelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRChannelChannelListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91577,10 +96287,16 @@
             using TypeInfo = Channel::Attributes::Lineup::TypeInfo;
 
             chip::Controller::ChannelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRChannelLineupStructAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91643,11 +96359,17 @@
             using TypeInfo = Channel::Attributes::CurrentChannel::TypeInfo;
 
             chip::Controller::ChannelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRChannelCurrentChannelStructAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91711,11 +96433,17 @@
             using TypeInfo = Channel::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ChannelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRChannelGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91778,11 +96506,17 @@
             using TypeInfo = Channel::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ChannelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRChannelAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91844,11 +96578,17 @@
             using TypeInfo = Channel::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ChannelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRChannelAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91908,10 +96648,16 @@
             using TypeInfo = Channel::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ChannelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -91971,10 +96717,16 @@
             using TypeInfo = Channel::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ChannelCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -92380,11 +97132,17 @@
             using TypeInfo = TargetNavigator::Attributes::TargetList::TypeInfo;
 
             chip::Controller::TargetNavigatorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTargetNavigatorTargetListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -92444,10 +97202,16 @@
             using TypeInfo = TargetNavigator::Attributes::CurrentTarget::TypeInfo;
 
             chip::Controller::TargetNavigatorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -92511,11 +97275,17 @@
             using TypeInfo = TargetNavigator::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::TargetNavigatorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTargetNavigatorGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -92581,11 +97351,17 @@
             using TypeInfo = TargetNavigator::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::TargetNavigatorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTargetNavigatorAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -92649,11 +97425,17 @@
             using TypeInfo = TargetNavigator::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::TargetNavigatorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTargetNavigatorAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -92714,10 +97496,16 @@
             using TypeInfo = TargetNavigator::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::TargetNavigatorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -92777,10 +97565,16 @@
             using TypeInfo = TargetNavigator::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::TargetNavigatorCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -93435,11 +98229,17 @@
             using TypeInfo = MediaPlayback::Attributes::CurrentState::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -93500,10 +98300,16 @@
             using TypeInfo = MediaPlayback::Attributes::StartTime::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -93563,10 +98369,16 @@
             using TypeInfo = MediaPlayback::Attributes::Duration::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -93630,11 +98442,17 @@
             using TypeInfo = MediaPlayback::Attributes::SampledPosition::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRMediaPlaybackSampledPositionStructAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -93696,10 +98514,16 @@
             using TypeInfo = MediaPlayback::Attributes::PlaybackSpeed::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRFloatAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRFloatAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -93759,10 +98583,16 @@
             using TypeInfo = MediaPlayback::Attributes::SeekRangeEnd::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -93822,10 +98652,16 @@
             using TypeInfo = MediaPlayback::Attributes::SeekRangeStart::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -93888,11 +98724,17 @@
             using TypeInfo = MediaPlayback::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRMediaPlaybackGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -93957,11 +98799,17 @@
             using TypeInfo = MediaPlayback::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRMediaPlaybackAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -94023,11 +98871,17 @@
             using TypeInfo = MediaPlayback::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRMediaPlaybackAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -94088,10 +98942,16 @@
             using TypeInfo = MediaPlayback::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -94151,10 +99011,16 @@
             using TypeInfo = MediaPlayback::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::MediaPlaybackCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -94877,11 +99743,17 @@
             using TypeInfo = MediaInput::Attributes::InputList::TypeInfo;
 
             chip::Controller::MediaInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRMediaInputInputListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -94941,10 +99813,16 @@
             using TypeInfo = MediaInput::Attributes::CurrentInput::TypeInfo;
 
             chip::Controller::MediaInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -95007,11 +99885,17 @@
             using TypeInfo = MediaInput::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::MediaInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRMediaInputGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -95076,11 +99960,17 @@
             using TypeInfo = MediaInput::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::MediaInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRMediaInputAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -95142,11 +100032,17 @@
             using TypeInfo = MediaInput::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::MediaInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRMediaInputAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -95206,10 +100102,16 @@
             using TypeInfo = MediaInput::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::MediaInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -95269,10 +100171,16 @@
             using TypeInfo = MediaInput::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::MediaInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -95661,11 +100569,17 @@
             using TypeInfo = LowPower::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::LowPowerCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRLowPowerGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -95730,11 +100644,17 @@
             using TypeInfo = LowPower::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::LowPowerCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRLowPowerAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -95796,11 +100716,17 @@
             using TypeInfo = LowPower::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::LowPowerCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRLowPowerAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -95860,10 +100786,16 @@
             using TypeInfo = LowPower::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::LowPowerCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -95923,10 +100855,16 @@
             using TypeInfo = LowPower::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::LowPowerCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -96223,11 +101161,17 @@
             using TypeInfo = KeypadInput::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::KeypadInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRKeypadInputGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -96292,11 +101236,17 @@
             using TypeInfo = KeypadInput::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::KeypadInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRKeypadInputAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -96358,11 +101308,17 @@
             using TypeInfo = KeypadInput::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::KeypadInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRKeypadInputAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -96422,10 +101378,16 @@
             using TypeInfo = KeypadInput::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::KeypadInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -96485,10 +101447,16 @@
             using TypeInfo = KeypadInput::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::KeypadInputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -96963,11 +101931,17 @@
             using TypeInfo = ContentLauncher::Attributes::AcceptHeader::TypeInfo;
 
             chip::Controller::ContentLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRContentLauncherAcceptHeaderListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -97067,10 +102041,16 @@
             using TypeInfo = ContentLauncher::Attributes::SupportedStreamingProtocols::TypeInfo;
 
             chip::Controller::ContentLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -97135,11 +102115,17 @@
             using TypeInfo = ContentLauncher::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ContentLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRContentLauncherGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -97205,11 +102191,17 @@
             using TypeInfo = ContentLauncher::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ContentLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRContentLauncherAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -97273,11 +102265,17 @@
             using TypeInfo = ContentLauncher::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ContentLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRContentLauncherAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -97338,10 +102336,16 @@
             using TypeInfo = ContentLauncher::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ContentLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -97401,10 +102405,16 @@
             using TypeInfo = ContentLauncher::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ContentLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -97813,11 +102823,17 @@
             using TypeInfo = AudioOutput::Attributes::OutputList::TypeInfo;
 
             chip::Controller::AudioOutputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAudioOutputOutputListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -97877,10 +102893,16 @@
             using TypeInfo = AudioOutput::Attributes::CurrentOutput::TypeInfo;
 
             chip::Controller::AudioOutputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -97943,11 +102965,17 @@
             using TypeInfo = AudioOutput::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::AudioOutputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAudioOutputGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -98012,11 +103040,17 @@
             using TypeInfo = AudioOutput::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::AudioOutputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAudioOutputAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -98078,11 +103112,17 @@
             using TypeInfo = AudioOutput::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::AudioOutputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAudioOutputAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -98142,10 +103182,16 @@
             using TypeInfo = AudioOutput::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::AudioOutputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -98205,10 +103251,16 @@
             using TypeInfo = AudioOutput::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::AudioOutputCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -98634,11 +103686,17 @@
             using TypeInfo = ApplicationLauncher::Attributes::CatalogList::TypeInfo;
 
             chip::Controller::ApplicationLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationLauncherCatalogListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -98753,11 +103811,17 @@
             using TypeInfo = ApplicationLauncher::Attributes::CurrentApp::TypeInfo;
 
             chip::Controller::ApplicationLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationLauncherCurrentAppStructAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -98823,11 +103887,17 @@
             using TypeInfo = ApplicationLauncher::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ApplicationLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationLauncherGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -98893,11 +103963,17 @@
             using TypeInfo = ApplicationLauncher::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ApplicationLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationLauncherAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -98961,11 +104037,17 @@
             using TypeInfo = ApplicationLauncher::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ApplicationLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationLauncherAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99026,10 +104108,16 @@
             using TypeInfo = ApplicationLauncher::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ApplicationLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99089,10 +104177,16 @@
             using TypeInfo = ApplicationLauncher::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ApplicationLauncherCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99450,10 +104544,16 @@
             using TypeInfo = ApplicationBasic::Attributes::VendorName::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99513,10 +104613,16 @@
             using TypeInfo = ApplicationBasic::Attributes::VendorID::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRVendorIdAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRVendorIdAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99576,10 +104682,16 @@
             using TypeInfo = ApplicationBasic::Attributes::ApplicationName::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99639,10 +104751,16 @@
             using TypeInfo = ApplicationBasic::Attributes::ProductID::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99706,11 +104824,17 @@
             using TypeInfo = ApplicationBasic::Attributes::Application::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationBasicApplicationStructAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99776,11 +104900,17 @@
             using TypeInfo = ApplicationBasic::Attributes::Status::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99842,10 +104972,16 @@
             using TypeInfo = ApplicationBasic::Attributes::ApplicationVersion::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99908,11 +105044,17 @@
             using TypeInfo = ApplicationBasic::Attributes::AllowedVendorList::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationBasicAllowedVendorListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -99977,11 +105119,17 @@
             using TypeInfo = ApplicationBasic::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -100047,11 +105195,17 @@
             using TypeInfo = ApplicationBasic::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -100115,11 +105269,17 @@
             using TypeInfo = ApplicationBasic::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRApplicationBasicAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -100180,10 +105340,16 @@
             using TypeInfo = ApplicationBasic::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -100243,10 +105409,16 @@
             using TypeInfo = ApplicationBasic::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ApplicationBasicCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -100873,11 +106045,17 @@
             using TypeInfo = AccountLogin::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::AccountLoginCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAccountLoginGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -100942,11 +106120,17 @@
             using TypeInfo = AccountLogin::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::AccountLoginCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAccountLoginAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101008,11 +106192,17 @@
             using TypeInfo = AccountLogin::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::AccountLoginCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRAccountLoginAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101072,10 +106262,16 @@
             using TypeInfo = AccountLogin::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::AccountLoginCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101135,10 +106331,16 @@
             using TypeInfo = AccountLogin::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::AccountLoginCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101479,10 +106681,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::MeasurementType::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101542,10 +106750,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcVoltage::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101605,10 +106819,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcVoltageMin::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101668,10 +106888,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcVoltageMax::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101731,10 +106957,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101794,10 +107026,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcCurrentMin::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101857,10 +107095,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcCurrentMax::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101920,10 +107164,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcPower::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -101983,10 +107233,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcPowerMin::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102046,10 +107302,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcPowerMax::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102110,10 +107372,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcVoltageMultiplier::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102174,10 +107442,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcVoltageDivisor::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102238,10 +107512,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcCurrentMultiplier::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102302,10 +107582,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcCurrentDivisor::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102365,10 +107651,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcPowerMultiplier::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102428,10 +107720,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::DcPowerDivisor::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102491,10 +107789,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcFrequency::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102554,10 +107858,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcFrequencyMin::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102617,10 +107927,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcFrequencyMax::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102680,10 +107996,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::NeutralCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102743,10 +108065,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::TotalActivePower::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102807,10 +108135,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::TotalReactivePower::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102872,10 +108206,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::TotalApparentPower::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -102938,10 +108278,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::Measured1stHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103004,10 +108350,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::Measured3rdHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103070,10 +108422,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::Measured5thHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103136,10 +108494,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::Measured7thHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103202,10 +108566,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::Measured9thHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103268,10 +108638,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::Measured11thHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103335,10 +108711,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::MeasuredPhase1stHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103402,10 +108784,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::MeasuredPhase3rdHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103469,10 +108857,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::MeasuredPhase5thHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103536,10 +108930,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::MeasuredPhase7thHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103603,10 +109003,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::MeasuredPhase9thHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103670,10 +109076,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::MeasuredPhase11thHarmonicCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103735,10 +109147,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcFrequencyMultiplier::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103800,10 +109218,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcFrequencyDivisor::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103864,10 +109288,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::PowerMultiplier::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103927,10 +109357,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::PowerDivisor::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -103992,10 +109428,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::HarmonicCurrentMultiplier::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104059,10 +109501,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::PhaseHarmonicCurrentMultiplier::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104124,10 +109572,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::InstantaneousVoltage::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104190,10 +109644,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::InstantaneousLineCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104256,10 +109716,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::InstantaneousActiveCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104323,10 +109789,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::InstantaneousReactiveCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104388,10 +109860,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::InstantaneousPower::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104452,10 +109930,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltage::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104515,10 +109999,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageMin::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104578,10 +110068,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageMax::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104641,10 +110137,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsCurrent::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104704,10 +110206,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsCurrentMin::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104767,10 +110275,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsCurrentMax::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104830,10 +110344,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActivePower::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104893,10 +110413,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActivePowerMin::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -104956,10 +110482,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActivePowerMax::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105019,10 +110551,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ReactivePower::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105082,10 +110620,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ApparentPower::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105145,10 +110689,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::PowerFactor::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105249,10 +110799,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AverageRmsVoltageMeasurementPeriod::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105353,10 +110909,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AverageRmsUnderVoltageCounter::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105456,10 +111018,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsExtremeOverVoltagePeriod::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105560,10 +111128,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsExtremeUnderVoltagePeriod::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105662,10 +111236,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageSagPeriod::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105764,10 +111344,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageSwellPeriod::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105829,10 +111415,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcVoltageMultiplier::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105893,10 +111485,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcVoltageDivisor::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -105957,10 +111555,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcCurrentMultiplier::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106021,10 +111625,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcCurrentDivisor::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106084,10 +111694,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcPowerMultiplier::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106147,10 +111763,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcPowerDivisor::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106248,10 +111870,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::OverloadAlarmsMask::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106312,10 +111940,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::VoltageOverload::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106375,10 +112009,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::CurrentOverload::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106476,10 +112116,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcOverloadAlarmsMask::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106540,10 +112186,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcVoltageOverload::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106603,10 +112255,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcCurrentOverload::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106667,10 +112325,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcActivePowerOverload::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106733,10 +112397,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcReactivePowerOverload::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106798,10 +112468,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AverageRmsOverVoltage::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106864,10 +112540,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AverageRmsUnderVoltage::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106929,10 +112611,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsExtremeOverVoltage::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -106995,10 +112683,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsExtremeUnderVoltage::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107059,10 +112753,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageSag::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107122,10 +112822,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageSwell::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107185,10 +112891,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::LineCurrentPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107249,10 +112961,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActiveCurrentPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107314,10 +113032,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ReactiveCurrentPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107378,10 +113102,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltagePhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107442,10 +113172,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageMinPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107507,10 +113243,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageMaxPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107571,10 +113313,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsCurrentPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107635,10 +113383,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsCurrentMinPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107700,10 +113454,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsCurrentMaxPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107764,10 +113524,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActivePowerPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107828,10 +113594,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActivePowerMinPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107893,10 +113665,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActivePowerMaxPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -107958,10 +113736,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ReactivePowerPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108023,10 +113807,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ApparentPowerPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108087,10 +113877,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::PowerFactorPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108153,10 +113949,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AverageRmsVoltageMeasurementPeriodPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108221,10 +114023,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AverageRmsOverVoltageCounterPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108288,10 +114096,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AverageRmsUnderVoltageCounterPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108355,10 +114169,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsExtremeOverVoltagePeriodPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108422,10 +114242,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsExtremeUnderVoltagePeriodPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108488,10 +114314,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageSagPeriodPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108554,10 +114386,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageSwellPeriodPhaseB::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108618,10 +114456,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::LineCurrentPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108682,10 +114526,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActiveCurrentPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108747,10 +114597,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ReactiveCurrentPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108811,10 +114667,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltagePhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108875,10 +114737,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageMinPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -108940,10 +114808,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageMaxPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109004,10 +114878,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsCurrentPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109068,10 +114948,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsCurrentMinPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109133,10 +115019,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsCurrentMaxPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109197,10 +115089,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActivePowerPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109261,10 +115159,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActivePowerMinPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109326,10 +115230,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ActivePowerMaxPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109391,10 +115301,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ReactivePowerPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109456,10 +115372,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ApparentPowerPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109520,10 +115442,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::PowerFactorPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109586,10 +115514,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AverageRmsVoltageMeasurementPeriodPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109654,10 +115588,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AverageRmsOverVoltageCounterPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109721,10 +115661,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AverageRmsUnderVoltageCounterPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109788,10 +115734,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsExtremeOverVoltagePeriodPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109855,10 +115807,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsExtremeUnderVoltagePeriodPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109921,10 +115879,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageSagPeriodPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -109987,10 +115951,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::RmsVoltageSwellPeriodPhaseC::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -110055,11 +116025,17 @@
             using TypeInfo = ElectricalMeasurement::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -110125,11 +116101,17 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -110194,11 +116176,17 @@
             using TypeInfo = ElectricalMeasurement::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRElectricalMeasurementAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -110259,10 +116247,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -110322,10 +116316,16 @@
             using TypeInfo = ElectricalMeasurement::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::ElectricalMeasurementCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -116597,10 +122597,16 @@
             using TypeInfo = TestCluster::Attributes::Boolean::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -116697,10 +122703,16 @@
             using TypeInfo = TestCluster::Attributes::Bitmap8::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterBitmap8AttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -116797,10 +122809,16 @@
             using TypeInfo = TestCluster::Attributes::Bitmap16::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterBitmap16AttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -116897,10 +122915,16 @@
             using TypeInfo = TestCluster::Attributes::Bitmap32::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterBitmap32AttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -116997,10 +123021,16 @@
             using TypeInfo = TestCluster::Attributes::Bitmap64::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterBitmap64AttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -117097,10 +123127,16 @@
             using TypeInfo = TestCluster::Attributes::Int8u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -117197,10 +123233,16 @@
             using TypeInfo = TestCluster::Attributes::Int16u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -117297,10 +123339,16 @@
             using TypeInfo = TestCluster::Attributes::Int24u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -117397,10 +123445,16 @@
             using TypeInfo = TestCluster::Attributes::Int32u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -117497,10 +123551,16 @@
             using TypeInfo = TestCluster::Attributes::Int40u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -117597,10 +123657,16 @@
             using TypeInfo = TestCluster::Attributes::Int48u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -117697,10 +123763,16 @@
             using TypeInfo = TestCluster::Attributes::Int56u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -117797,10 +123869,16 @@
             using TypeInfo = TestCluster::Attributes::Int64u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -117897,10 +123975,16 @@
             using TypeInfo = TestCluster::Attributes::Int8s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -117997,10 +124081,16 @@
             using TypeInfo = TestCluster::Attributes::Int16s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -118097,10 +124187,16 @@
             using TypeInfo = TestCluster::Attributes::Int24s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -118197,10 +124293,16 @@
             using TypeInfo = TestCluster::Attributes::Int32s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -118297,10 +124399,16 @@
             using TypeInfo = TestCluster::Attributes::Int40s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -118397,10 +124505,16 @@
             using TypeInfo = TestCluster::Attributes::Int48s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -118497,10 +124611,16 @@
             using TypeInfo = TestCluster::Attributes::Int56s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -118597,10 +124717,16 @@
             using TypeInfo = TestCluster::Attributes::Int64s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -118697,10 +124823,16 @@
             using TypeInfo = TestCluster::Attributes::Enum8::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -118797,10 +124929,16 @@
             using TypeInfo = TestCluster::Attributes::Enum16::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -118897,10 +125035,16 @@
             using TypeInfo = TestCluster::Attributes::FloatSingle::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRFloatAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRFloatAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -118997,10 +125141,16 @@
             using TypeInfo = TestCluster::Attributes::FloatDouble::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRDoubleAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRDoubleAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -119097,10 +125247,16 @@
             using TypeInfo = TestCluster::Attributes::OctetString::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROctetStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -119218,11 +125374,17 @@
             using TypeInfo = TestCluster::Attributes::ListInt8u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterListInt8uListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -119340,11 +125502,17 @@
             using TypeInfo = TestCluster::Attributes::ListOctetString::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterListOctetStringListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -119467,11 +125635,17 @@
             using TypeInfo = TestCluster::Attributes::ListStructOctetString::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterListStructOctetStringListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -119570,10 +125744,16 @@
             using TypeInfo = TestCluster::Attributes::LongOctetString::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTROctetStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -119670,10 +125850,16 @@
             using TypeInfo = TestCluster::Attributes::CharString::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -119770,10 +125956,16 @@
             using TypeInfo = TestCluster::Attributes::LongCharString::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -119870,10 +126062,16 @@
             using TypeInfo = TestCluster::Attributes::EpochUs::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -119970,10 +126168,16 @@
             using TypeInfo = TestCluster::Attributes::EpochS::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -120070,10 +126274,16 @@
             using TypeInfo = TestCluster::Attributes::VendorId::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRVendorIdAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRVendorIdAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -120369,11 +126579,17 @@
             using TypeInfo = TestCluster::Attributes::ListNullablesAndOptionalsStruct::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterListNullablesAndOptionalsStructListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
                 nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -120472,11 +126688,17 @@
             using TypeInfo = TestCluster::Attributes::EnumAttr::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterClusterSimpleEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -120583,11 +126805,17 @@
             using TypeInfo = TestCluster::Attributes::StructAttr::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterStructAttrStructAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -120686,10 +126914,16 @@
             using TypeInfo = TestCluster::Attributes::RangeRestrictedInt8u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -120788,10 +127022,16 @@
             using TypeInfo = TestCluster::Attributes::RangeRestrictedInt8s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -120890,10 +127130,16 @@
             using TypeInfo = TestCluster::Attributes::RangeRestrictedInt16u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -120992,10 +127238,16 @@
             using TypeInfo = TestCluster::Attributes::RangeRestrictedInt16s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -121117,11 +127369,17 @@
             using TypeInfo = TestCluster::Attributes::ListLongOctetString::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterListLongOctetStringListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -121301,11 +127559,17 @@
             using TypeInfo = TestCluster::Attributes::ListFabricScoped::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterListFabricScopedListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -121403,10 +127667,16 @@
             using TypeInfo = TestCluster::Attributes::TimedWriteBoolean::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -121504,10 +127774,16 @@
             using TypeInfo = TestCluster::Attributes::GeneralErrorBoolean::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -121606,10 +127882,16 @@
             using TypeInfo = TestCluster::Attributes::ClusterErrorBoolean::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -121707,10 +127989,16 @@
             using TypeInfo = TestCluster::Attributes::Unsupported::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -121812,10 +128100,16 @@
             using TypeInfo = TestCluster::Attributes::NullableBoolean::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableBooleanAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -121917,11 +128211,17 @@
             using TypeInfo = TestCluster::Attributes::NullableBitmap8::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterNullableBitmap8AttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -122023,11 +128323,17 @@
             using TypeInfo = TestCluster::Attributes::NullableBitmap16::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterNullableBitmap16AttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -122129,11 +128435,17 @@
             using TypeInfo = TestCluster::Attributes::NullableBitmap32::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterNullableBitmap32AttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -122235,11 +128547,17 @@
             using TypeInfo = TestCluster::Attributes::NullableBitmap64::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterNullableBitmap64AttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -122341,10 +128659,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt8u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -122446,10 +128770,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt16u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -122551,10 +128881,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt24u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -122656,10 +128992,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt32u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -122761,10 +129103,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt40u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -122866,10 +129214,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt48u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -122971,10 +129325,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt56u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -123076,10 +129436,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt64u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -123181,10 +129547,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt8s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -123286,10 +129658,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt16s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -123391,10 +129769,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt24s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -123496,10 +129880,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt32s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt32sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -123601,10 +129991,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt40s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -123706,10 +130102,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt48s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -123811,10 +130213,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt56s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -123916,10 +130324,16 @@
             using TypeInfo = TestCluster::Attributes::NullableInt64s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt64sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -124021,10 +130435,16 @@
             using TypeInfo = TestCluster::Attributes::NullableEnum8::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -124126,10 +130546,16 @@
             using TypeInfo = TestCluster::Attributes::NullableEnum16::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -124232,10 +130658,16 @@
             using TypeInfo = TestCluster::Attributes::NullableFloatSingle::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableFloatAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -124339,10 +130771,16 @@
             using TypeInfo = TestCluster::Attributes::NullableFloatDouble::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableDoubleAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -124445,10 +130883,16 @@
             using TypeInfo = TestCluster::Attributes::NullableOctetString::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableOctetStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -124551,10 +130995,16 @@
             using TypeInfo = TestCluster::Attributes::NullableCharString::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableCharStringAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -124659,11 +131109,17 @@
             using TypeInfo = TestCluster::Attributes::NullableEnumAttr::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableTestClusterClusterSimpleEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -124780,11 +131236,17 @@
             using TypeInfo = TestCluster::Attributes::NullableStruct::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterNullableStructStructAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -124891,10 +131353,16 @@
             using TypeInfo = TestCluster::Attributes::NullableRangeRestrictedInt8u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -125000,10 +131468,16 @@
             using TypeInfo = TestCluster::Attributes::NullableRangeRestrictedInt8s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt8sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -125109,10 +131583,16 @@
             using TypeInfo = TestCluster::Attributes::NullableRangeRestrictedInt16u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -125218,10 +131698,16 @@
             using TypeInfo = TestCluster::Attributes::NullableRangeRestrictedInt16s::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRNullableInt16sAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
-                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { delete typedBridge; });
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -125319,10 +131805,16 @@
             using TypeInfo = TestCluster::Attributes::WriteOnlyInt8u::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt8uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -125385,11 +131877,17 @@
             using TypeInfo = TestCluster::Attributes::GeneratedCommandList::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -125454,11 +131952,17 @@
             using TypeInfo = TestCluster::Attributes::AcceptedCommandList::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -125520,11 +132024,17 @@
             using TypeInfo = TestCluster::Attributes::AttributeList::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue],
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
                 MTRTestClusterAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil,
                 params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+                [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -125584,10 +132094,16 @@
             using TypeInfo = TestCluster::Attributes::FeatureMap::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
@@ -125647,10 +132163,16 @@
             using TypeInfo = TestCluster::Attributes::ClusterRevision::TypeInfo;
 
             chip::Controller::TestClusterCluster cppCluster(exchangeManager, session, self->_endpoint);
-            return cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb, [params.minInterval unsignedShortValue],
-                [params.maxInterval unsignedShortValue], MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished,
-                nil, params.filterByFabric, !params.replaceExistingSubscriptions, chip::NullOptional,
-                [typedBridge](void) { delete typedBridge; });
+            CHIP_ERROR err = cppCluster.SubscribeAttribute<TypeInfo>(bridge, successCb, failureCb,
+                [params.minInterval unsignedShortValue], [params.maxInterval unsignedShortValue],
+                MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, params.filterByFabric,
+                !params.replaceExistingSubscriptions, chip::NullOptional, [typedBridge](void) { typedBridge->OnDone(); });
+            if (err == CHIP_NO_ERROR) {
+                // Now that we kicked off the subscribe, flag our callback bridge
+                // to stay alive until we get an OnDone.
+                typedBridge->KeepAliveOnCallback();
+            }
+            return err;
         },
         subscriptionEstablished);
     std::move(*bridge).DispatchAction(self.device);
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h
index 5bd5d63..528d5d9 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h
@@ -1114,12 +1114,11 @@
 class MTRDefaultSuccessCallbackBridge : public MTRCallbackBridge<DefaultSuccessCallback>
 {
 public:
-    MTRDefaultSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DefaultSuccessCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDefaultSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DefaultSuccessCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDefaultSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                    bool keepAlive = false) :
-        MTRCallbackBridge<DefaultSuccessCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDefaultSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DefaultSuccessCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context);
 };
@@ -1127,12 +1126,11 @@
 class MTRCommandSuccessCallbackBridge : public MTRCallbackBridge<CommandSuccessCallback>
 {
 public:
-    MTRCommandSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<CommandSuccessCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRCommandSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<CommandSuccessCallback>(queue, handler, OnSuccessFn){};
 
-    MTRCommandSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                    bool keepAlive = false) :
-        MTRCallbackBridge<CommandSuccessCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRCommandSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<CommandSuccessCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::NullObjectType &);
 };
@@ -1140,12 +1138,11 @@
 class MTROctetStringAttributeCallbackBridge : public MTRCallbackBridge<OctetStringAttributeCallback>
 {
 public:
-    MTROctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<OctetStringAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OctetStringAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                          bool keepAlive = false) :
-        MTRCallbackBridge<OctetStringAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTROctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<OctetStringAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::ByteSpan value);
 };
@@ -1155,11 +1152,13 @@
 public:
     MTROctetStringAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROctetStringAttributeCallbackBridge(queue, handler, action, true),
+        MTROctetStringAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROctetStringAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROctetStringAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1168,12 +1167,11 @@
 class MTRNullableOctetStringAttributeCallbackBridge : public MTRCallbackBridge<NullableOctetStringAttributeCallback>
 {
 public:
-    MTRNullableOctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableOctetStringAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableOctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableOctetStringAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableOctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                  bool keepAlive = false) :
-        MTRCallbackBridge<NullableOctetStringAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableOctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableOctetStringAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<chip::ByteSpan> & value);
 };
@@ -1184,11 +1182,13 @@
     MTRNullableOctetStringAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action,
                                                               MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOctetStringAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOctetStringAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOctetStringAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOctetStringAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1197,12 +1197,11 @@
 class MTRCharStringAttributeCallbackBridge : public MTRCallbackBridge<CharStringAttributeCallback>
 {
 public:
-    MTRCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<CharStringAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<CharStringAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                         bool keepAlive = false) :
-        MTRCallbackBridge<CharStringAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<CharStringAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::CharSpan value);
 };
@@ -1212,11 +1211,13 @@
 public:
     MTRCharStringAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRCharStringAttributeCallbackBridge(queue, handler, action, true),
+        MTRCharStringAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRCharStringAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRCharStringAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1225,12 +1226,11 @@
 class MTRNullableCharStringAttributeCallbackBridge : public MTRCallbackBridge<NullableCharStringAttributeCallback>
 {
 public:
-    MTRNullableCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableCharStringAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableCharStringAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                 bool keepAlive = false) :
-        MTRCallbackBridge<NullableCharStringAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableCharStringAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<chip::CharSpan> & value);
 };
@@ -1240,11 +1240,13 @@
 public:
     MTRNullableCharStringAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableCharStringAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableCharStringAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableCharStringAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableCharStringAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1253,12 +1255,11 @@
 class MTRBooleanAttributeCallbackBridge : public MTRCallbackBridge<BooleanAttributeCallback>
 {
 public:
-    MTRBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<BooleanAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BooleanAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                      bool keepAlive = false) :
-        MTRCallbackBridge<BooleanAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<BooleanAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, bool value);
 };
@@ -1268,11 +1269,13 @@
 public:
     MTRBooleanAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBooleanAttributeCallbackBridge(queue, handler, action, true),
+        MTRBooleanAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBooleanAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBooleanAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1281,12 +1284,11 @@
 class MTRNullableBooleanAttributeCallbackBridge : public MTRCallbackBridge<NullableBooleanAttributeCallback>
 {
 public:
-    MTRNullableBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableBooleanAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableBooleanAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                              bool keepAlive = false) :
-        MTRCallbackBridge<NullableBooleanAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableBooleanAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<bool> & value);
 };
@@ -1296,11 +1298,13 @@
 public:
     MTRNullableBooleanAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableBooleanAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableBooleanAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableBooleanAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableBooleanAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1309,12 +1313,11 @@
 class MTRInt8uAttributeCallbackBridge : public MTRCallbackBridge<Int8uAttributeCallback>
 {
 public:
-    MTRInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<Int8uAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<Int8uAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                    bool keepAlive = false) :
-        MTRCallbackBridge<Int8uAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<Int8uAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, uint8_t value);
 };
@@ -1324,11 +1327,13 @@
 public:
     MTRInt8uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRInt8uAttributeCallbackBridge(queue, handler, action, true),
+        MTRInt8uAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRInt8uAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRInt8uAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1337,12 +1342,11 @@
 class MTRNullableInt8uAttributeCallbackBridge : public MTRCallbackBridge<NullableInt8uAttributeCallback>
 {
 public:
-    MTRNullableInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt8uAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableInt8uAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                            bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt8uAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableInt8uAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<uint8_t> & value);
 };
@@ -1352,11 +1356,13 @@
 public:
     MTRNullableInt8uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableInt8uAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableInt8uAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableInt8uAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableInt8uAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1365,12 +1371,11 @@
 class MTRInt8sAttributeCallbackBridge : public MTRCallbackBridge<Int8sAttributeCallback>
 {
 public:
-    MTRInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<Int8sAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<Int8sAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                    bool keepAlive = false) :
-        MTRCallbackBridge<Int8sAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<Int8sAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, int8_t value);
 };
@@ -1380,11 +1385,13 @@
 public:
     MTRInt8sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRInt8sAttributeCallbackBridge(queue, handler, action, true),
+        MTRInt8sAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRInt8sAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRInt8sAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1393,12 +1400,11 @@
 class MTRNullableInt8sAttributeCallbackBridge : public MTRCallbackBridge<NullableInt8sAttributeCallback>
 {
 public:
-    MTRNullableInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt8sAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableInt8sAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                            bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt8sAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableInt8sAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<int8_t> & value);
 };
@@ -1408,11 +1414,13 @@
 public:
     MTRNullableInt8sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableInt8sAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableInt8sAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableInt8sAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableInt8sAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1421,12 +1429,11 @@
 class MTRInt16uAttributeCallbackBridge : public MTRCallbackBridge<Int16uAttributeCallback>
 {
 public:
-    MTRInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<Int16uAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<Int16uAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                     bool keepAlive = false) :
-        MTRCallbackBridge<Int16uAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<Int16uAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, uint16_t value);
 };
@@ -1436,11 +1443,13 @@
 public:
     MTRInt16uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRInt16uAttributeCallbackBridge(queue, handler, action, true),
+        MTRInt16uAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRInt16uAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRInt16uAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1449,12 +1458,11 @@
 class MTRNullableInt16uAttributeCallbackBridge : public MTRCallbackBridge<NullableInt16uAttributeCallback>
 {
 public:
-    MTRNullableInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt16uAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableInt16uAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt16uAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableInt16uAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<uint16_t> & value);
 };
@@ -1464,11 +1472,13 @@
 public:
     MTRNullableInt16uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableInt16uAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableInt16uAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableInt16uAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableInt16uAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1477,12 +1487,11 @@
 class MTRInt16sAttributeCallbackBridge : public MTRCallbackBridge<Int16sAttributeCallback>
 {
 public:
-    MTRInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<Int16sAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<Int16sAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                     bool keepAlive = false) :
-        MTRCallbackBridge<Int16sAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<Int16sAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, int16_t value);
 };
@@ -1492,11 +1501,13 @@
 public:
     MTRInt16sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRInt16sAttributeCallbackBridge(queue, handler, action, true),
+        MTRInt16sAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRInt16sAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRInt16sAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1505,12 +1516,11 @@
 class MTRNullableInt16sAttributeCallbackBridge : public MTRCallbackBridge<NullableInt16sAttributeCallback>
 {
 public:
-    MTRNullableInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt16sAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableInt16sAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt16sAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableInt16sAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<int16_t> & value);
 };
@@ -1520,11 +1530,13 @@
 public:
     MTRNullableInt16sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableInt16sAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableInt16sAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableInt16sAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableInt16sAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1533,12 +1545,11 @@
 class MTRInt32uAttributeCallbackBridge : public MTRCallbackBridge<Int32uAttributeCallback>
 {
 public:
-    MTRInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<Int32uAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<Int32uAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                     bool keepAlive = false) :
-        MTRCallbackBridge<Int32uAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<Int32uAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, uint32_t value);
 };
@@ -1548,11 +1559,13 @@
 public:
     MTRInt32uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRInt32uAttributeCallbackBridge(queue, handler, action, true),
+        MTRInt32uAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRInt32uAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRInt32uAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1561,12 +1574,11 @@
 class MTRNullableInt32uAttributeCallbackBridge : public MTRCallbackBridge<NullableInt32uAttributeCallback>
 {
 public:
-    MTRNullableInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt32uAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableInt32uAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt32uAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableInt32uAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<uint32_t> & value);
 };
@@ -1576,11 +1588,13 @@
 public:
     MTRNullableInt32uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableInt32uAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableInt32uAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableInt32uAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableInt32uAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1589,12 +1603,11 @@
 class MTRInt32sAttributeCallbackBridge : public MTRCallbackBridge<Int32sAttributeCallback>
 {
 public:
-    MTRInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<Int32sAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<Int32sAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                     bool keepAlive = false) :
-        MTRCallbackBridge<Int32sAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<Int32sAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, int32_t value);
 };
@@ -1604,11 +1617,13 @@
 public:
     MTRInt32sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRInt32sAttributeCallbackBridge(queue, handler, action, true),
+        MTRInt32sAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRInt32sAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRInt32sAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1617,12 +1632,11 @@
 class MTRNullableInt32sAttributeCallbackBridge : public MTRCallbackBridge<NullableInt32sAttributeCallback>
 {
 public:
-    MTRNullableInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt32sAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableInt32sAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt32sAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableInt32sAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<int32_t> & value);
 };
@@ -1632,11 +1646,13 @@
 public:
     MTRNullableInt32sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableInt32sAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableInt32sAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableInt32sAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableInt32sAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1645,12 +1661,11 @@
 class MTRInt64uAttributeCallbackBridge : public MTRCallbackBridge<Int64uAttributeCallback>
 {
 public:
-    MTRInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<Int64uAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<Int64uAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                     bool keepAlive = false) :
-        MTRCallbackBridge<Int64uAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<Int64uAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, uint64_t value);
 };
@@ -1660,11 +1675,13 @@
 public:
     MTRInt64uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRInt64uAttributeCallbackBridge(queue, handler, action, true),
+        MTRInt64uAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRInt64uAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRInt64uAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1673,12 +1690,11 @@
 class MTRNullableInt64uAttributeCallbackBridge : public MTRCallbackBridge<NullableInt64uAttributeCallback>
 {
 public:
-    MTRNullableInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt64uAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableInt64uAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt64uAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableInt64uAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<uint64_t> & value);
 };
@@ -1688,11 +1704,13 @@
 public:
     MTRNullableInt64uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableInt64uAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableInt64uAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableInt64uAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableInt64uAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1701,12 +1719,11 @@
 class MTRInt64sAttributeCallbackBridge : public MTRCallbackBridge<Int64sAttributeCallback>
 {
 public:
-    MTRInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<Int64sAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<Int64sAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                     bool keepAlive = false) :
-        MTRCallbackBridge<Int64sAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<Int64sAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, int64_t value);
 };
@@ -1716,11 +1733,13 @@
 public:
     MTRInt64sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRInt64sAttributeCallbackBridge(queue, handler, action, true),
+        MTRInt64sAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRInt64sAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRInt64sAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1729,12 +1748,11 @@
 class MTRNullableInt64sAttributeCallbackBridge : public MTRCallbackBridge<NullableInt64sAttributeCallback>
 {
 public:
-    MTRNullableInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt64sAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableInt64sAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableInt64sAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableInt64sAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<int64_t> & value);
 };
@@ -1744,11 +1762,13 @@
 public:
     MTRNullableInt64sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableInt64sAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableInt64sAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableInt64sAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableInt64sAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1757,12 +1777,11 @@
 class MTRFloatAttributeCallbackBridge : public MTRCallbackBridge<FloatAttributeCallback>
 {
 public:
-    MTRFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<FloatAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FloatAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                    bool keepAlive = false) :
-        MTRCallbackBridge<FloatAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<FloatAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, float value);
 };
@@ -1772,11 +1791,13 @@
 public:
     MTRFloatAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFloatAttributeCallbackBridge(queue, handler, action, true),
+        MTRFloatAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFloatAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFloatAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1785,12 +1806,11 @@
 class MTRNullableFloatAttributeCallbackBridge : public MTRCallbackBridge<NullableFloatAttributeCallback>
 {
 public:
-    MTRNullableFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableFloatAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableFloatAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                            bool keepAlive = false) :
-        MTRCallbackBridge<NullableFloatAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableFloatAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<float> & value);
 };
@@ -1800,11 +1820,13 @@
 public:
     MTRNullableFloatAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableFloatAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableFloatAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableFloatAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableFloatAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1813,12 +1835,11 @@
 class MTRDoubleAttributeCallbackBridge : public MTRCallbackBridge<DoubleAttributeCallback>
 {
 public:
-    MTRDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoubleAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoubleAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                     bool keepAlive = false) :
-        MTRCallbackBridge<DoubleAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoubleAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, double value);
 };
@@ -1828,11 +1849,13 @@
 public:
     MTRDoubleAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoubleAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoubleAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoubleAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoubleAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1841,12 +1864,11 @@
 class MTRNullableDoubleAttributeCallbackBridge : public MTRCallbackBridge<NullableDoubleAttributeCallback>
 {
 public:
-    MTRNullableDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoubleAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoubleAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoubleAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoubleAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<double> & value);
 };
@@ -1856,11 +1878,13 @@
 public:
     MTRNullableDoubleAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoubleAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoubleAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoubleAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoubleAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1869,12 +1893,11 @@
 class MTRVendorIdAttributeCallbackBridge : public MTRCallbackBridge<VendorIdAttributeCallback>
 {
 public:
-    MTRVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<VendorIdAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<VendorIdAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                       bool keepAlive = false) :
-        MTRCallbackBridge<VendorIdAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<VendorIdAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::VendorId value);
 };
@@ -1884,11 +1907,13 @@
 public:
     MTRVendorIdAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRVendorIdAttributeCallbackBridge(queue, handler, action, true),
+        MTRVendorIdAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRVendorIdAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRVendorIdAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1897,12 +1922,11 @@
 class MTRNullableVendorIdAttributeCallbackBridge : public MTRCallbackBridge<NullableVendorIdAttributeCallback>
 {
 public:
-    MTRNullableVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<NullableVendorIdAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableVendorIdAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                               bool keepAlive = false) :
-        MTRCallbackBridge<NullableVendorIdAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRNullableVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<NullableVendorIdAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<chip::VendorId> & value);
 };
@@ -1912,11 +1936,13 @@
 public:
     MTRNullableVendorIdAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableVendorIdAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableVendorIdAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableVendorIdAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableVendorIdAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1926,13 +1952,12 @@
     : public MTRCallbackBridge<IdentifyGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRIdentifyGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRIdentifyGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<IdentifyGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRIdentifyGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<IdentifyGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -1944,11 +1969,13 @@
     MTRIdentifyGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRIdentifyGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRIdentifyGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRIdentifyGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRIdentifyGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1958,13 +1985,12 @@
     : public MTRCallbackBridge<IdentifyAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRIdentifyAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRIdentifyAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<IdentifyAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRIdentifyAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<IdentifyAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -1976,11 +2002,13 @@
     MTRIdentifyAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRIdentifyAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRIdentifyAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRIdentifyAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRIdentifyAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -1989,12 +2017,11 @@
 class MTRIdentifyAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<IdentifyAttributeListListAttributeCallback>
 {
 public:
-    MTRIdentifyAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRIdentifyAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<IdentifyAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRIdentifyAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                        bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRIdentifyAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<IdentifyAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -2005,11 +2032,13 @@
     MTRIdentifyAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRIdentifyAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRIdentifyAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRIdentifyAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRIdentifyAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2019,13 +2048,12 @@
     : public MTRCallbackBridge<GroupsGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRGroupsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<GroupsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRGroupsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<GroupsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRGroupsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<GroupsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2037,11 +2065,13 @@
     MTRGroupsGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGroupsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGroupsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGroupsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGroupsGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2051,13 +2081,12 @@
     : public MTRCallbackBridge<GroupsAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRGroupsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<GroupsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRGroupsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<GroupsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRGroupsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<GroupsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2069,11 +2098,13 @@
     MTRGroupsAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGroupsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGroupsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGroupsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGroupsAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2082,12 +2113,11 @@
 class MTRGroupsAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<GroupsAttributeListListAttributeCallback>
 {
 public:
-    MTRGroupsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<GroupsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRGroupsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                      bool keepAlive = false) :
-        MTRCallbackBridge<GroupsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRGroupsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<GroupsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -2098,11 +2128,13 @@
     MTRGroupsAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGroupsAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGroupsAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGroupsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGroupsAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2112,13 +2144,12 @@
     : public MTRCallbackBridge<ScenesGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRScenesGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ScenesGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRScenesGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ScenesGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<ScenesGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2130,11 +2161,13 @@
     MTRScenesGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRScenesGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRScenesGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRScenesGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRScenesGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2144,13 +2177,12 @@
     : public MTRCallbackBridge<ScenesAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRScenesAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ScenesAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRScenesAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ScenesAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<ScenesAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2162,11 +2194,13 @@
     MTRScenesAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRScenesAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRScenesAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRScenesAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRScenesAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2175,12 +2209,11 @@
 class MTRScenesAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<ScenesAttributeListListAttributeCallback>
 {
 public:
-    MTRScenesAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ScenesAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRScenesAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                      bool keepAlive = false) :
-        MTRCallbackBridge<ScenesAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ScenesAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -2191,11 +2224,13 @@
     MTRScenesAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRScenesAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRScenesAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRScenesAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRScenesAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2205,13 +2240,12 @@
     : public MTRCallbackBridge<OnOffGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTROnOffGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<OnOffGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROnOffGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OnOffGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROnOffGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<OnOffGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTROnOffGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<OnOffGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2223,11 +2257,13 @@
     MTROnOffGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROnOffGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROnOffGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROnOffGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROnOffGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2237,13 +2273,11 @@
     : public MTRCallbackBridge<OnOffAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTROnOffAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<OnOffAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROnOffAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OnOffAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROnOffAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<OnOffAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTROnOffAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<OnOffAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2255,11 +2289,13 @@
     MTROnOffAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROnOffAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROnOffAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROnOffAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROnOffAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2268,12 +2304,11 @@
 class MTROnOffAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<OnOffAttributeListListAttributeCallback>
 {
 public:
-    MTROnOffAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<OnOffAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROnOffAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OnOffAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROnOffAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                     bool keepAlive = false) :
-        MTRCallbackBridge<OnOffAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTROnOffAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<OnOffAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -2284,11 +2319,13 @@
     MTROnOffAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROnOffAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROnOffAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROnOffAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROnOffAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2298,15 +2335,12 @@
     : public MTRCallbackBridge<OnOffSwitchConfigurationGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               bool keepAlive = false) :
-        MTRCallbackBridge<OnOffSwitchConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OnOffSwitchConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OnOffSwitchConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                               MTRActionBlock action) :
+        MTRCallbackBridge<OnOffSwitchConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2318,11 +2352,13 @@
     MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2332,15 +2368,12 @@
     : public MTRCallbackBridge<OnOffSwitchConfigurationAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<OnOffSwitchConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OnOffSwitchConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OnOffSwitchConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<OnOffSwitchConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2352,11 +2385,13 @@
     MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2366,14 +2401,12 @@
     : public MTRCallbackBridge<OnOffSwitchConfigurationAttributeListListAttributeCallback>
 {
 public:
-    MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<OnOffSwitchConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OnOffSwitchConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OnOffSwitchConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<OnOffSwitchConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -2385,11 +2418,13 @@
     MTROnOffSwitchConfigurationAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2399,13 +2434,12 @@
     : public MTRCallbackBridge<LevelControlGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRLevelControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<LevelControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRLevelControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LevelControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRLevelControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<LevelControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<LevelControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2417,11 +2451,13 @@
     MTRLevelControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLevelControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRLevelControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLevelControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLevelControlGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2431,13 +2467,12 @@
     : public MTRCallbackBridge<LevelControlAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRLevelControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<LevelControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRLevelControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LevelControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRLevelControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<LevelControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<LevelControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2449,11 +2484,13 @@
     MTRLevelControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLevelControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRLevelControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLevelControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLevelControlAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2463,13 +2500,12 @@
     : public MTRCallbackBridge<LevelControlAttributeListListAttributeCallback>
 {
 public:
-    MTRLevelControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<LevelControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRLevelControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LevelControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRLevelControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<LevelControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRLevelControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<LevelControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -2481,11 +2517,13 @@
     MTRLevelControlAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLevelControlAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRLevelControlAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLevelControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLevelControlAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2495,14 +2533,12 @@
     : public MTRCallbackBridge<BinaryInputBasicGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<BinaryInputBasicGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BinaryInputBasicGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BinaryInputBasicGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<BinaryInputBasicGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2514,11 +2550,13 @@
     MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2528,14 +2566,12 @@
     : public MTRCallbackBridge<BinaryInputBasicAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<BinaryInputBasicAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BinaryInputBasicAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BinaryInputBasicAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<BinaryInputBasicAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2547,11 +2583,13 @@
     MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2561,13 +2599,12 @@
     : public MTRCallbackBridge<BinaryInputBasicAttributeListListAttributeCallback>
 {
 public:
-    MTRBinaryInputBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<BinaryInputBasicAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBinaryInputBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BinaryInputBasicAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBinaryInputBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BinaryInputBasicAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<BinaryInputBasicAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -2579,11 +2616,13 @@
     MTRBinaryInputBasicAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBinaryInputBasicAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBinaryInputBasicAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBinaryInputBasicAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBinaryInputBasicAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2593,13 +2632,11 @@
     : public MTRCallbackBridge<DescriptorDeviceTypeListListAttributeCallback>
 {
 public:
-    MTRDescriptorDeviceTypeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorDeviceTypeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDescriptorDeviceTypeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DescriptorDeviceTypeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDescriptorDeviceTypeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorDeviceTypeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDescriptorDeviceTypeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DescriptorDeviceTypeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -2614,11 +2651,13 @@
     MTRDescriptorDeviceTypeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDescriptorDeviceTypeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDescriptorDeviceTypeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDescriptorDeviceTypeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDescriptorDeviceTypeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2627,12 +2666,11 @@
 class MTRDescriptorServerListListAttributeCallbackBridge : public MTRCallbackBridge<DescriptorServerListListAttributeCallback>
 {
 public:
-    MTRDescriptorServerListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorServerListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDescriptorServerListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DescriptorServerListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDescriptorServerListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                       bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorServerListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDescriptorServerListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DescriptorServerListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::ClusterId> & value);
 };
@@ -2643,11 +2681,13 @@
     MTRDescriptorServerListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDescriptorServerListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDescriptorServerListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDescriptorServerListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDescriptorServerListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2656,12 +2696,11 @@
 class MTRDescriptorClientListListAttributeCallbackBridge : public MTRCallbackBridge<DescriptorClientListListAttributeCallback>
 {
 public:
-    MTRDescriptorClientListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorClientListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDescriptorClientListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DescriptorClientListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDescriptorClientListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                       bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorClientListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDescriptorClientListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DescriptorClientListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::ClusterId> & value);
 };
@@ -2672,11 +2711,13 @@
     MTRDescriptorClientListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDescriptorClientListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDescriptorClientListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDescriptorClientListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDescriptorClientListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2685,12 +2726,11 @@
 class MTRDescriptorPartsListListAttributeCallbackBridge : public MTRCallbackBridge<DescriptorPartsListListAttributeCallback>
 {
 public:
-    MTRDescriptorPartsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorPartsListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDescriptorPartsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DescriptorPartsListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDescriptorPartsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                      bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorPartsListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDescriptorPartsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DescriptorPartsListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EndpointId> & value);
 };
@@ -2701,11 +2741,13 @@
     MTRDescriptorPartsListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDescriptorPartsListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDescriptorPartsListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDescriptorPartsListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDescriptorPartsListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2715,13 +2757,12 @@
     : public MTRCallbackBridge<DescriptorGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRDescriptorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDescriptorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DescriptorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDescriptorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<DescriptorGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2733,11 +2774,13 @@
     MTRDescriptorGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDescriptorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDescriptorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDescriptorGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDescriptorGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2747,13 +2790,12 @@
     : public MTRCallbackBridge<DescriptorAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRDescriptorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDescriptorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DescriptorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDescriptorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<DescriptorAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2765,11 +2807,13 @@
     MTRDescriptorAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDescriptorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDescriptorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDescriptorAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDescriptorAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2778,12 +2822,11 @@
 class MTRDescriptorAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<DescriptorAttributeListListAttributeCallback>
 {
 public:
-    MTRDescriptorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDescriptorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DescriptorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDescriptorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<DescriptorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDescriptorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DescriptorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -2795,11 +2838,13 @@
     MTRDescriptorAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDescriptorAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDescriptorAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDescriptorAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDescriptorAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2808,12 +2853,11 @@
 class MTRBindingBindingListAttributeCallbackBridge : public MTRCallbackBridge<BindingBindingListAttributeCallback>
 {
 public:
-    MTRBindingBindingListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<BindingBindingListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBindingBindingListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BindingBindingListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRBindingBindingListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                 bool keepAlive = false) :
-        MTRCallbackBridge<BindingBindingListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRBindingBindingListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<BindingBindingListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -2825,11 +2869,13 @@
 public:
     MTRBindingBindingListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBindingBindingListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBindingBindingListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBindingBindingListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBindingBindingListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2839,13 +2885,12 @@
     : public MTRCallbackBridge<BindingGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRBindingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<BindingGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBindingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BindingGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBindingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BindingGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<BindingGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2857,11 +2902,13 @@
     MTRBindingGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBindingGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBindingGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBindingGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBindingGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2871,13 +2918,12 @@
     : public MTRCallbackBridge<BindingAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRBindingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<BindingAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBindingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BindingAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRBindingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<BindingAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRBindingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<BindingAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -2889,11 +2935,13 @@
     MTRBindingAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBindingAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBindingAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBindingAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBindingAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2902,12 +2950,11 @@
 class MTRBindingAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<BindingAttributeListListAttributeCallback>
 {
 public:
-    MTRBindingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<BindingAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBindingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BindingAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRBindingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                       bool keepAlive = false) :
-        MTRCallbackBridge<BindingAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRBindingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<BindingAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -2918,11 +2965,13 @@
     MTRBindingAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBindingAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBindingAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBindingAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBindingAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2931,12 +2980,11 @@
 class MTRAccessControlAclListAttributeCallbackBridge : public MTRCallbackBridge<AccessControlAclListAttributeCallback>
 {
 public:
-    MTRAccessControlAclListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlAclListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccessControlAclListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccessControlAclListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRAccessControlAclListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                   bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlAclListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRAccessControlAclListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<AccessControlAclListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -2950,11 +2998,13 @@
     MTRAccessControlAclListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action,
                                                                MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccessControlAclListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccessControlAclListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccessControlAclListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccessControlAclListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2963,12 +3013,11 @@
 class MTRAccessControlExtensionListAttributeCallbackBridge : public MTRCallbackBridge<AccessControlExtensionListAttributeCallback>
 {
 public:
-    MTRAccessControlExtensionListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlExtensionListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccessControlExtensionListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccessControlExtensionListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRAccessControlExtensionListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlExtensionListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRAccessControlExtensionListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<AccessControlExtensionListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -2982,11 +3031,13 @@
     MTRAccessControlExtensionListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccessControlExtensionListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccessControlExtensionListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccessControlExtensionListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccessControlExtensionListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -2996,13 +3047,12 @@
     : public MTRCallbackBridge<AccessControlGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRAccessControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccessControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccessControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAccessControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<AccessControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3014,11 +3064,13 @@
     MTRAccessControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccessControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccessControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccessControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccessControlGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3028,13 +3080,12 @@
     : public MTRCallbackBridge<AccessControlAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRAccessControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccessControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccessControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAccessControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<AccessControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3046,11 +3097,13 @@
     MTRAccessControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccessControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccessControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccessControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccessControlAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3060,13 +3113,12 @@
     : public MTRCallbackBridge<AccessControlAttributeListListAttributeCallback>
 {
 public:
-    MTRAccessControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccessControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccessControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRAccessControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRAccessControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<AccessControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -3078,11 +3130,13 @@
     MTRAccessControlAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccessControlAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccessControlAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccessControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccessControlAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3091,12 +3145,11 @@
 class MTRActionsActionListListAttributeCallbackBridge : public MTRCallbackBridge<ActionsActionListListAttributeCallback>
 {
 public:
-    MTRActionsActionListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ActionsActionListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRActionsActionListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ActionsActionListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRActionsActionListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                    bool keepAlive = false) :
-        MTRCallbackBridge<ActionsActionListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRActionsActionListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ActionsActionListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -3109,11 +3162,13 @@
     MTRActionsActionListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action,
                                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRActionsActionListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRActionsActionListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRActionsActionListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRActionsActionListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3122,12 +3177,11 @@
 class MTRActionsEndpointListsListAttributeCallbackBridge : public MTRCallbackBridge<ActionsEndpointListsListAttributeCallback>
 {
 public:
-    MTRActionsEndpointListsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ActionsEndpointListsListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRActionsEndpointListsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ActionsEndpointListsListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRActionsEndpointListsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                       bool keepAlive = false) :
-        MTRCallbackBridge<ActionsEndpointListsListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRActionsEndpointListsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ActionsEndpointListsListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -3141,11 +3195,13 @@
     MTRActionsEndpointListsListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRActionsEndpointListsListAttributeCallbackBridge(queue, handler, action, true),
+        MTRActionsEndpointListsListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRActionsEndpointListsListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRActionsEndpointListsListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3155,13 +3211,12 @@
     : public MTRCallbackBridge<ActionsGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRActionsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<ActionsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRActionsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ActionsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRActionsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ActionsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<ActionsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3173,11 +3228,13 @@
     MTRActionsGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRActionsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRActionsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRActionsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRActionsGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3187,13 +3244,12 @@
     : public MTRCallbackBridge<ActionsAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRActionsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ActionsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRActionsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ActionsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRActionsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ActionsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRActionsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<ActionsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3205,11 +3261,13 @@
     MTRActionsAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRActionsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRActionsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRActionsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRActionsAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3218,12 +3276,11 @@
 class MTRActionsAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<ActionsAttributeListListAttributeCallback>
 {
 public:
-    MTRActionsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ActionsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRActionsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ActionsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRActionsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                       bool keepAlive = false) :
-        MTRCallbackBridge<ActionsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRActionsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ActionsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -3234,11 +3291,13 @@
     MTRActionsAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRActionsAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRActionsAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRActionsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRActionsAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3247,12 +3306,11 @@
 class MTRBasicCapabilityMinimaStructAttributeCallbackBridge : public MTRCallbackBridge<BasicCapabilityMinimaStructAttributeCallback>
 {
 public:
-    MTRBasicCapabilityMinimaStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<BasicCapabilityMinimaStructAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBasicCapabilityMinimaStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BasicCapabilityMinimaStructAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRBasicCapabilityMinimaStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<BasicCapabilityMinimaStructAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRBasicCapabilityMinimaStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<BasicCapabilityMinimaStructAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::Basic::Structs::CapabilityMinimaStruct::DecodableType & value);
@@ -3265,11 +3323,13 @@
     MTRBasicCapabilityMinimaStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBasicCapabilityMinimaStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRBasicCapabilityMinimaStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBasicCapabilityMinimaStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBasicCapabilityMinimaStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3279,13 +3339,12 @@
     : public MTRCallbackBridge<BasicGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<BasicGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BasicGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<BasicGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<BasicGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3297,11 +3356,13 @@
     MTRBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBasicGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBasicGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBasicGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBasicGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3311,13 +3372,11 @@
     : public MTRCallbackBridge<BasicAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<BasicAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BasicAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<BasicAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<BasicAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3329,11 +3388,13 @@
     MTRBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBasicAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBasicAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBasicAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBasicAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3342,12 +3403,11 @@
 class MTRBasicAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<BasicAttributeListListAttributeCallback>
 {
 public:
-    MTRBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<BasicAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BasicAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                     bool keepAlive = false) :
-        MTRCallbackBridge<BasicAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<BasicAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -3358,11 +3418,13 @@
     MTRBasicAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBasicAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBasicAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBasicAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBasicAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3372,15 +3434,13 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3392,11 +3452,13 @@
     MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3406,15 +3468,12 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                               MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3426,11 +3485,13 @@
     MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3440,14 +3501,12 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateProviderAttributeListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -3459,11 +3518,13 @@
     MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3473,15 +3534,13 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<
@@ -3495,11 +3554,13 @@
     MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3509,15 +3570,13 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                               keepAlive){};
+    MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                               keepAlive){};
+                                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                               OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3529,11 +3588,13 @@
     MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3543,15 +3604,13 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3563,11 +3622,13 @@
     MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3577,14 +3638,12 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateRequestorAttributeListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -3596,11 +3655,13 @@
     MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3610,14 +3671,12 @@
     : public MTRCallbackBridge<LocalizationConfigurationSupportedLocalesListAttributeCallback>
 {
 public:
-    MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<LocalizationConfigurationSupportedLocalesListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LocalizationConfigurationSupportedLocalesListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<LocalizationConfigurationSupportedLocalesListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<LocalizationConfigurationSupportedLocalesListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CharSpan> & value);
 };
@@ -3629,11 +3688,13 @@
     MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge(queue, handler, action, true),
+        MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3643,15 +3704,13 @@
     : public MTRCallbackBridge<LocalizationConfigurationGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<LocalizationConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LocalizationConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<LocalizationConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<LocalizationConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3663,11 +3722,13 @@
     MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3677,15 +3738,12 @@
     : public MTRCallbackBridge<LocalizationConfigurationAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               bool keepAlive = false) :
-        MTRCallbackBridge<LocalizationConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LocalizationConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<LocalizationConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                               MTRActionBlock action) :
+        MTRCallbackBridge<LocalizationConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3697,11 +3755,13 @@
     MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3711,14 +3771,12 @@
     : public MTRCallbackBridge<LocalizationConfigurationAttributeListListAttributeCallback>
 {
 public:
-    MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<LocalizationConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LocalizationConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<LocalizationConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<LocalizationConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -3730,11 +3788,13 @@
     MTRLocalizationConfigurationAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3744,15 +3804,12 @@
     : public MTRCallbackBridge<TimeFormatLocalizationSupportedCalendarTypesListAttributeCallback>
 {
 public:
-    MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationSupportedCalendarTypesListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TimeFormatLocalizationSupportedCalendarTypesListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationSupportedCalendarTypesListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                               MTRActionBlock action) :
+        MTRCallbackBridge<TimeFormatLocalizationSupportedCalendarTypesListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -3766,11 +3823,13 @@
     MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3780,15 +3839,12 @@
     : public MTRCallbackBridge<TimeFormatLocalizationGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                           keepAlive){};
+    MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TimeFormatLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                           keepAlive){};
+                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<TimeFormatLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3800,11 +3856,13 @@
     MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3814,14 +3872,12 @@
     : public MTRCallbackBridge<TimeFormatLocalizationAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TimeFormatLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<TimeFormatLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3833,11 +3889,13 @@
     MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3847,14 +3905,12 @@
     : public MTRCallbackBridge<TimeFormatLocalizationAttributeListListAttributeCallback>
 {
 public:
-    MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TimeFormatLocalizationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<TimeFormatLocalizationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -3866,11 +3922,13 @@
     MTRTimeFormatLocalizationAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3880,14 +3938,12 @@
     : public MTRCallbackBridge<UnitLocalizationGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<UnitLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<UnitLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<UnitLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<UnitLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3899,11 +3955,13 @@
     MTRUnitLocalizationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3913,14 +3971,12 @@
     : public MTRCallbackBridge<UnitLocalizationAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<UnitLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<UnitLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<UnitLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<UnitLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -3932,11 +3988,13 @@
     MTRUnitLocalizationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3946,13 +4004,12 @@
     : public MTRCallbackBridge<UnitLocalizationAttributeListListAttributeCallback>
 {
 public:
-    MTRUnitLocalizationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<UnitLocalizationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRUnitLocalizationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<UnitLocalizationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRUnitLocalizationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<UnitLocalizationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<UnitLocalizationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -3964,11 +4021,13 @@
     MTRUnitLocalizationAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRUnitLocalizationAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRUnitLocalizationAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRUnitLocalizationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRUnitLocalizationAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3978,13 +4037,12 @@
     : public MTRCallbackBridge<PowerSourceConfigurationSourcesListAttributeCallback>
 {
 public:
-    MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceConfigurationSourcesListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceConfigurationSourcesListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceConfigurationSourcesListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceConfigurationSourcesListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<uint8_t> & value);
 };
@@ -3996,11 +4054,13 @@
     MTRPowerSourceConfigurationSourcesListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4010,15 +4070,12 @@
     : public MTRCallbackBridge<PowerSourceConfigurationGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                               MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4030,11 +4087,13 @@
     MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4044,15 +4103,12 @@
     : public MTRCallbackBridge<PowerSourceConfigurationAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4064,11 +4120,13 @@
     MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4078,14 +4136,12 @@
     : public MTRCallbackBridge<PowerSourceConfigurationAttributeListListAttributeCallback>
 {
 public:
-    MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -4097,11 +4153,13 @@
     MTRPowerSourceConfigurationAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4111,13 +4169,12 @@
     : public MTRCallbackBridge<PowerSourceActiveWiredFaultsListAttributeCallback>
 {
 public:
-    MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceActiveWiredFaultsListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceActiveWiredFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceActiveWiredFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceActiveWiredFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::WiredFault> & value);
@@ -4130,11 +4187,13 @@
     MTRPowerSourceActiveWiredFaultsListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4144,13 +4203,12 @@
     : public MTRCallbackBridge<PowerSourceActiveBatFaultsListAttributeCallback>
 {
 public:
-    MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceActiveBatFaultsListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceActiveBatFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceActiveBatFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceActiveBatFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatFault> & value);
@@ -4163,11 +4221,13 @@
     MTRPowerSourceActiveBatFaultsListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4177,13 +4237,12 @@
     : public MTRCallbackBridge<PowerSourceActiveBatChargeFaultsListAttributeCallback>
 {
 public:
-    MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceActiveBatChargeFaultsListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceActiveBatChargeFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceActiveBatChargeFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceActiveBatChargeFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatChargeFault> & value);
@@ -4196,11 +4255,13 @@
     MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4210,13 +4271,12 @@
     : public MTRCallbackBridge<PowerSourceGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4228,11 +4288,13 @@
     MTRPowerSourceGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4242,13 +4304,12 @@
     : public MTRCallbackBridge<PowerSourceAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4260,11 +4321,13 @@
     MTRPowerSourceAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4274,13 +4337,11 @@
     : public MTRCallbackBridge<PowerSourceAttributeListListAttributeCallback>
 {
 public:
-    MTRPowerSourceAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRPowerSourceAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRPowerSourceAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -4292,11 +4353,13 @@
     MTRPowerSourceAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4306,15 +4369,12 @@
     : public MTRCallbackBridge<GeneralCommissioningBasicCommissioningInfoStructAttributeCallback>
 {
 public:
-    MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningBasicCommissioningInfoStructAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralCommissioningBasicCommissioningInfoStructAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningBasicCommissioningInfoStructAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                               MTRActionBlock action) :
+        MTRCallbackBridge<GeneralCommissioningBasicCommissioningInfoStructAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -4328,11 +4388,13 @@
     MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4342,14 +4404,12 @@
     : public MTRCallbackBridge<GeneralCommissioningGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<GeneralCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4361,11 +4421,13 @@
     MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4375,14 +4437,12 @@
     : public MTRCallbackBridge<GeneralCommissioningAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<GeneralCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4394,11 +4454,13 @@
     MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4408,13 +4470,12 @@
     : public MTRCallbackBridge<GeneralCommissioningAttributeListListAttributeCallback>
 {
 public:
-    MTRGeneralCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralCommissioningAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<GeneralCommissioningAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -4426,11 +4487,13 @@
     MTRGeneralCommissioningAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralCommissioningAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralCommissioningAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralCommissioningAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralCommissioningAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4440,13 +4503,12 @@
     : public MTRCallbackBridge<NetworkCommissioningNetworksListAttributeCallback>
 {
 public:
-    MTRNetworkCommissioningNetworksListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningNetworksListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNetworkCommissioningNetworksListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NetworkCommissioningNetworksListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNetworkCommissioningNetworksListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningNetworksListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<NetworkCommissioningNetworksListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -4461,11 +4523,13 @@
     MTRNetworkCommissioningNetworksListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNetworkCommissioningNetworksListAttributeCallbackBridge(queue, handler, action, true),
+        MTRNetworkCommissioningNetworksListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNetworkCommissioningNetworksListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNetworkCommissioningNetworksListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4475,14 +4539,12 @@
     : public MTRCallbackBridge<NetworkCommissioningGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NetworkCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<NetworkCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4494,11 +4556,13 @@
     MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4508,14 +4572,12 @@
     : public MTRCallbackBridge<NetworkCommissioningAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NetworkCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<NetworkCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4527,11 +4589,13 @@
     MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4541,13 +4605,12 @@
     : public MTRCallbackBridge<NetworkCommissioningAttributeListListAttributeCallback>
 {
 public:
-    MTRNetworkCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNetworkCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NetworkCommissioningAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNetworkCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<NetworkCommissioningAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -4559,11 +4622,13 @@
     MTRNetworkCommissioningAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNetworkCommissioningAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRNetworkCommissioningAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNetworkCommissioningAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNetworkCommissioningAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4573,14 +4638,12 @@
     : public MTRCallbackBridge<DiagnosticLogsGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DiagnosticLogsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<DiagnosticLogsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4592,11 +4655,13 @@
     MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4606,13 +4671,12 @@
     : public MTRCallbackBridge<DiagnosticLogsAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DiagnosticLogsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<DiagnosticLogsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4624,11 +4688,13 @@
     MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4638,13 +4704,12 @@
     : public MTRCallbackBridge<DiagnosticLogsAttributeListListAttributeCallback>
 {
 public:
-    MTRDiagnosticLogsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDiagnosticLogsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DiagnosticLogsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDiagnosticLogsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<DiagnosticLogsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -4656,11 +4721,13 @@
     MTRDiagnosticLogsAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDiagnosticLogsAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDiagnosticLogsAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDiagnosticLogsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDiagnosticLogsAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4670,14 +4737,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsNetworkInterfacesListAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsNetworkInterfacesListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsNetworkInterfacesListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsNetworkInterfacesListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsNetworkInterfacesListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<
@@ -4691,11 +4756,13 @@
     MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4705,14 +4772,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsActiveHardwareFaultsListAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsActiveHardwareFaultsListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsActiveHardwareFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsActiveHardwareFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsActiveHardwareFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<uint8_t> & value);
 };
@@ -4724,11 +4789,13 @@
     MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4738,14 +4805,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsActiveRadioFaultsListAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsActiveRadioFaultsListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsActiveRadioFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsActiveRadioFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsActiveRadioFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<uint8_t> & value);
 };
@@ -4757,11 +4822,13 @@
     MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4771,14 +4838,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsActiveNetworkFaultsListAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsActiveNetworkFaultsListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsActiveNetworkFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsActiveNetworkFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsActiveNetworkFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<uint8_t> & value);
 };
@@ -4790,11 +4855,13 @@
     MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4804,14 +4871,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4823,11 +4888,13 @@
     MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4837,14 +4904,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4856,11 +4921,13 @@
     MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4870,13 +4937,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsAttributeListListAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -4888,11 +4954,13 @@
     MTRGeneralDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4902,13 +4970,12 @@
     : public MTRCallbackBridge<SoftwareDiagnosticsThreadMetricsListAttributeCallback>
 {
 public:
-    MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<SoftwareDiagnosticsThreadMetricsListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<SoftwareDiagnosticsThreadMetricsListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<SoftwareDiagnosticsThreadMetricsListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<SoftwareDiagnosticsThreadMetricsListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -4923,11 +4990,13 @@
     MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge(queue, handler, action, true),
+        MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4937,14 +5006,12 @@
     : public MTRCallbackBridge<SoftwareDiagnosticsGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<SoftwareDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<SoftwareDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<SoftwareDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<SoftwareDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4956,11 +5023,13 @@
     MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -4970,14 +5039,12 @@
     : public MTRCallbackBridge<SoftwareDiagnosticsAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<SoftwareDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<SoftwareDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<SoftwareDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<SoftwareDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -4989,11 +5056,13 @@
     MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5003,13 +5072,12 @@
     : public MTRCallbackBridge<SoftwareDiagnosticsAttributeListListAttributeCallback>
 {
 public:
-    MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<SoftwareDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<SoftwareDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<SoftwareDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<SoftwareDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -5021,11 +5089,13 @@
     MTRSoftwareDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5035,14 +5105,12 @@
     : public MTRCallbackBridge<ThreadNetworkDiagnosticsNeighborTableListListAttributeCallback>
 {
 public:
-    MTRThreadNetworkDiagnosticsNeighborTableListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsNeighborTableListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThreadNetworkDiagnosticsNeighborTableListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsNeighborTableListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsNeighborTableListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsNeighborTableListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsNeighborTableListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<
@@ -5056,11 +5124,13 @@
     MTRThreadNetworkDiagnosticsNeighborTableListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsNeighborTableListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsNeighborTableListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsNeighborTableListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsNeighborTableListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5070,14 +5140,12 @@
     : public MTRCallbackBridge<ThreadNetworkDiagnosticsRouteTableListListAttributeCallback>
 {
 public:
-    MTRThreadNetworkDiagnosticsRouteTableListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsRouteTableListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThreadNetworkDiagnosticsRouteTableListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsRouteTableListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsRouteTableListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsRouteTableListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsRouteTableListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<
@@ -5091,11 +5159,13 @@
     MTRThreadNetworkDiagnosticsRouteTableListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsRouteTableListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsRouteTableListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsRouteTableListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsRouteTableListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5105,14 +5175,12 @@
     : public MTRCallbackBridge<ThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallback>
 {
 public:
-    MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<
@@ -5126,11 +5194,13 @@
     MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5141,17 +5211,15 @@
 {
 public:
     MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                         ResponseHandler handler,
-                                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                       keepAlive){};
+                                                                                         ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallback>(queue, handler,
+                                                                                                       OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
-                                                                                         MTRActionBlock action,
-                                                                                         bool keepAlive = false) :
+                                                                                         MTRActionBlock action) :
         MTRCallbackBridge<ThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallback>(queue, handler, action,
-                                                                                                       OnSuccessFn, keepAlive){};
+                                                                                                       OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -5166,11 +5234,13 @@
     MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5180,15 +5250,13 @@
     : public MTRCallbackBridge<ThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallback>
 {
 public:
-    MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -5202,11 +5270,13 @@
     MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5216,15 +5286,12 @@
     : public MTRCallbackBridge<ThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                               MTRActionBlock action) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5236,11 +5303,13 @@
     MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5250,15 +5319,12 @@
     : public MTRCallbackBridge<ThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5270,11 +5336,13 @@
     MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5284,14 +5352,12 @@
     : public MTRCallbackBridge<ThreadNetworkDiagnosticsAttributeListListAttributeCallback>
 {
 public:
-    MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -5303,11 +5369,13 @@
     MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5317,15 +5385,12 @@
     : public MTRCallbackBridge<WiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                           keepAlive){};
+    MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                           keepAlive){};
+                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5337,11 +5402,13 @@
     MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5351,14 +5418,12 @@
     : public MTRCallbackBridge<WiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5370,11 +5435,13 @@
     MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5384,14 +5451,12 @@
     : public MTRCallbackBridge<WiFiNetworkDiagnosticsAttributeListListAttributeCallback>
 {
 public:
-    MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -5403,11 +5468,13 @@
     MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5417,15 +5484,13 @@
     : public MTRCallbackBridge<EthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<EthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                               keepAlive){};
+    MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<EthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<EthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                               keepAlive){};
+                                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<EthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                               OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5437,11 +5502,13 @@
     MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5451,15 +5518,13 @@
     : public MTRCallbackBridge<EthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<EthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<EthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<EthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<EthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5471,11 +5536,13 @@
     MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5485,14 +5552,12 @@
     : public MTRCallbackBridge<EthernetNetworkDiagnosticsAttributeListListAttributeCallback>
 {
 public:
-    MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<EthernetNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<EthernetNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<EthernetNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<EthernetNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -5504,11 +5569,13 @@
     MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5518,14 +5585,12 @@
     : public MTRCallbackBridge<BridgedDeviceBasicGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRBridgedDeviceBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<BridgedDeviceBasicGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBridgedDeviceBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BridgedDeviceBasicGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBridgedDeviceBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BridgedDeviceBasicGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<BridgedDeviceBasicGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5537,11 +5602,13 @@
     MTRBridgedDeviceBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBridgedDeviceBasicGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBridgedDeviceBasicGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBridgedDeviceBasicGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBridgedDeviceBasicGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5551,14 +5618,12 @@
     : public MTRCallbackBridge<BridgedDeviceBasicAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRBridgedDeviceBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<BridgedDeviceBasicAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBridgedDeviceBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BridgedDeviceBasicAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBridgedDeviceBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BridgedDeviceBasicAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<BridgedDeviceBasicAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5570,11 +5635,13 @@
     MTRBridgedDeviceBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBridgedDeviceBasicAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBridgedDeviceBasicAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBridgedDeviceBasicAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBridgedDeviceBasicAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5584,13 +5651,12 @@
     : public MTRCallbackBridge<BridgedDeviceBasicAttributeListListAttributeCallback>
 {
 public:
-    MTRBridgedDeviceBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<BridgedDeviceBasicAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBridgedDeviceBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BridgedDeviceBasicAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBridgedDeviceBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BridgedDeviceBasicAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<BridgedDeviceBasicAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -5602,11 +5668,13 @@
     MTRBridgedDeviceBasicAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBridgedDeviceBasicAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBridgedDeviceBasicAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBridgedDeviceBasicAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBridgedDeviceBasicAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5616,13 +5684,12 @@
     : public MTRCallbackBridge<SwitchGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRSwitchGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<SwitchGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRSwitchGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<SwitchGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRSwitchGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<SwitchGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRSwitchGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<SwitchGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5634,11 +5701,13 @@
     MTRSwitchGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRSwitchGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRSwitchGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRSwitchGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRSwitchGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5648,13 +5717,12 @@
     : public MTRCallbackBridge<SwitchAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRSwitchAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<SwitchAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRSwitchAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<SwitchAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRSwitchAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<SwitchAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRSwitchAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<SwitchAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5666,11 +5734,13 @@
     MTRSwitchAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRSwitchAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRSwitchAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRSwitchAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRSwitchAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5679,12 +5749,11 @@
 class MTRSwitchAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<SwitchAttributeListListAttributeCallback>
 {
 public:
-    MTRSwitchAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<SwitchAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRSwitchAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<SwitchAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRSwitchAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                      bool keepAlive = false) :
-        MTRCallbackBridge<SwitchAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRSwitchAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<SwitchAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -5695,11 +5764,13 @@
     MTRSwitchAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRSwitchAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRSwitchAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRSwitchAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRSwitchAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5709,15 +5780,13 @@
     : public MTRCallbackBridge<AdministratorCommissioningGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<AdministratorCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                               keepAlive){};
+    MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AdministratorCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AdministratorCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                               keepAlive){};
+                                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<AdministratorCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                               OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5729,11 +5798,13 @@
     MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5743,15 +5814,13 @@
     : public MTRCallbackBridge<AdministratorCommissioningAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<AdministratorCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AdministratorCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AdministratorCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<AdministratorCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5763,11 +5832,13 @@
     MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5777,14 +5848,12 @@
     : public MTRCallbackBridge<AdministratorCommissioningAttributeListListAttributeCallback>
 {
 public:
-    MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<AdministratorCommissioningAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AdministratorCommissioningAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AdministratorCommissioningAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<AdministratorCommissioningAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -5796,11 +5865,13 @@
     MTRAdministratorCommissioningAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5810,13 +5881,12 @@
     : public MTRCallbackBridge<OperationalCredentialsNOCsListAttributeCallback>
 {
 public:
-    MTROperationalCredentialsNOCsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsNOCsListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROperationalCredentialsNOCsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsNOCsListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROperationalCredentialsNOCsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsNOCsListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTROperationalCredentialsNOCsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsNOCsListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -5831,11 +5901,13 @@
     MTROperationalCredentialsNOCsListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROperationalCredentialsNOCsListAttributeCallbackBridge(queue, handler, action, true),
+        MTROperationalCredentialsNOCsListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROperationalCredentialsNOCsListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROperationalCredentialsNOCsListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5845,13 +5917,12 @@
     : public MTRCallbackBridge<OperationalCredentialsFabricsListAttributeCallback>
 {
 public:
-    MTROperationalCredentialsFabricsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsFabricsListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROperationalCredentialsFabricsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsFabricsListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROperationalCredentialsFabricsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsFabricsListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsFabricsListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<
@@ -5865,11 +5936,13 @@
     MTROperationalCredentialsFabricsListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROperationalCredentialsFabricsListAttributeCallbackBridge(queue, handler, action, true),
+        MTROperationalCredentialsFabricsListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROperationalCredentialsFabricsListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROperationalCredentialsFabricsListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5879,15 +5952,13 @@
     : public MTRCallbackBridge<OperationalCredentialsTrustedRootCertificatesListAttributeCallback>
 {
 public:
-    MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsTrustedRootCertificatesListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsTrustedRootCertificatesListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsTrustedRootCertificatesListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsTrustedRootCertificatesListAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::ByteSpan> & value);
 };
@@ -5899,11 +5970,13 @@
     MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge(queue, handler, action, true),
+        MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5913,15 +5986,12 @@
     : public MTRCallbackBridge<OperationalCredentialsGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                           keepAlive){};
+    MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                           keepAlive){};
+                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5933,11 +6003,13 @@
     MTROperationalCredentialsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5947,14 +6019,12 @@
     : public MTRCallbackBridge<OperationalCredentialsAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -5966,11 +6036,13 @@
     MTROperationalCredentialsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -5980,14 +6052,12 @@
     : public MTRCallbackBridge<OperationalCredentialsAttributeListListAttributeCallback>
 {
 public:
-    MTROperationalCredentialsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROperationalCredentialsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROperationalCredentialsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -5999,11 +6069,13 @@
     MTROperationalCredentialsAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROperationalCredentialsAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROperationalCredentialsAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROperationalCredentialsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROperationalCredentialsAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6013,13 +6085,12 @@
     : public MTRCallbackBridge<GroupKeyManagementGroupKeyMapListAttributeCallback>
 {
 public:
-    MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementGroupKeyMapListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupKeyManagementGroupKeyMapListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementGroupKeyMapListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<GroupKeyManagementGroupKeyMapListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<
@@ -6033,11 +6104,13 @@
     MTRGroupKeyManagementGroupKeyMapListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6047,13 +6120,12 @@
     : public MTRCallbackBridge<GroupKeyManagementGroupTableListAttributeCallback>
 {
 public:
-    MTRGroupKeyManagementGroupTableListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementGroupTableListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupKeyManagementGroupTableListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupKeyManagementGroupTableListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGroupKeyManagementGroupTableListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementGroupTableListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<GroupKeyManagementGroupTableListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<
@@ -6067,11 +6139,13 @@
     MTRGroupKeyManagementGroupTableListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGroupKeyManagementGroupTableListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGroupKeyManagementGroupTableListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGroupKeyManagementGroupTableListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGroupKeyManagementGroupTableListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6081,14 +6155,12 @@
     : public MTRCallbackBridge<GroupKeyManagementGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupKeyManagementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<GroupKeyManagementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6100,11 +6172,13 @@
     MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6114,14 +6188,12 @@
     : public MTRCallbackBridge<GroupKeyManagementAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupKeyManagementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<GroupKeyManagementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6133,11 +6205,13 @@
     MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6147,13 +6221,12 @@
     : public MTRCallbackBridge<GroupKeyManagementAttributeListListAttributeCallback>
 {
 public:
-    MTRGroupKeyManagementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupKeyManagementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupKeyManagementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGroupKeyManagementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<GroupKeyManagementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -6165,11 +6238,13 @@
     MTRGroupKeyManagementAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGroupKeyManagementAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRGroupKeyManagementAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGroupKeyManagementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGroupKeyManagementAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6178,12 +6253,11 @@
 class MTRFixedLabelLabelListListAttributeCallbackBridge : public MTRCallbackBridge<FixedLabelLabelListListAttributeCallback>
 {
 public:
-    MTRFixedLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<FixedLabelLabelListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFixedLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FixedLabelLabelListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRFixedLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                      bool keepAlive = false) :
-        MTRCallbackBridge<FixedLabelLabelListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRFixedLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<FixedLabelLabelListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -6196,11 +6270,13 @@
     MTRFixedLabelLabelListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFixedLabelLabelListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRFixedLabelLabelListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFixedLabelLabelListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFixedLabelLabelListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6210,13 +6286,12 @@
     : public MTRCallbackBridge<FixedLabelGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<FixedLabelGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FixedLabelGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<FixedLabelGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<FixedLabelGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6228,11 +6303,13 @@
     MTRFixedLabelGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6242,13 +6319,12 @@
     : public MTRCallbackBridge<FixedLabelAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<FixedLabelAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FixedLabelAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<FixedLabelAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<FixedLabelAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6260,11 +6336,13 @@
     MTRFixedLabelAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6273,12 +6351,11 @@
 class MTRFixedLabelAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<FixedLabelAttributeListListAttributeCallback>
 {
 public:
-    MTRFixedLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<FixedLabelAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFixedLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FixedLabelAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRFixedLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<FixedLabelAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRFixedLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<FixedLabelAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -6290,11 +6367,13 @@
     MTRFixedLabelAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFixedLabelAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRFixedLabelAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFixedLabelAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFixedLabelAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6303,12 +6382,11 @@
 class MTRUserLabelLabelListListAttributeCallbackBridge : public MTRCallbackBridge<UserLabelLabelListListAttributeCallback>
 {
 public:
-    MTRUserLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<UserLabelLabelListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRUserLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<UserLabelLabelListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRUserLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                     bool keepAlive = false) :
-        MTRCallbackBridge<UserLabelLabelListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRUserLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<UserLabelLabelListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -6321,11 +6399,13 @@
     MTRUserLabelLabelListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRUserLabelLabelListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRUserLabelLabelListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRUserLabelLabelListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRUserLabelLabelListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6335,13 +6415,12 @@
     : public MTRCallbackBridge<UserLabelGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRUserLabelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<UserLabelGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRUserLabelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<UserLabelGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRUserLabelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<UserLabelGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<UserLabelGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6353,11 +6432,13 @@
     MTRUserLabelGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRUserLabelGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRUserLabelGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRUserLabelGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRUserLabelGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6367,13 +6448,12 @@
     : public MTRCallbackBridge<UserLabelAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRUserLabelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<UserLabelAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRUserLabelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<UserLabelAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRUserLabelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<UserLabelAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<UserLabelAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6385,11 +6465,13 @@
     MTRUserLabelAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRUserLabelAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRUserLabelAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRUserLabelAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRUserLabelAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6398,12 +6480,11 @@
 class MTRUserLabelAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<UserLabelAttributeListListAttributeCallback>
 {
 public:
-    MTRUserLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<UserLabelAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRUserLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<UserLabelAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRUserLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<UserLabelAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRUserLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<UserLabelAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -6414,11 +6495,13 @@
     MTRUserLabelAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRUserLabelAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRUserLabelAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRUserLabelAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRUserLabelAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6428,13 +6511,12 @@
     : public MTRCallbackBridge<BooleanStateGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<BooleanStateGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BooleanStateGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BooleanStateGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<BooleanStateGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6446,11 +6528,13 @@
     MTRBooleanStateGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6460,13 +6544,12 @@
     : public MTRCallbackBridge<BooleanStateAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<BooleanStateAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BooleanStateAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BooleanStateAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<BooleanStateAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6478,11 +6561,13 @@
     MTRBooleanStateAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6492,13 +6577,12 @@
     : public MTRCallbackBridge<BooleanStateAttributeListListAttributeCallback>
 {
 public:
-    MTRBooleanStateAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<BooleanStateAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBooleanStateAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BooleanStateAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRBooleanStateAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<BooleanStateAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRBooleanStateAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<BooleanStateAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -6510,11 +6594,13 @@
     MTRBooleanStateAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBooleanStateAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBooleanStateAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBooleanStateAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBooleanStateAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6524,13 +6610,11 @@
     : public MTRCallbackBridge<ModeSelectSupportedModesListAttributeCallback>
 {
 public:
-    MTRModeSelectSupportedModesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ModeSelectSupportedModesListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRModeSelectSupportedModesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ModeSelectSupportedModesListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRModeSelectSupportedModesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ModeSelectSupportedModesListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRModeSelectSupportedModesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ModeSelectSupportedModesListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -6545,11 +6629,13 @@
     MTRModeSelectSupportedModesListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRModeSelectSupportedModesListAttributeCallbackBridge(queue, handler, action, true),
+        MTRModeSelectSupportedModesListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRModeSelectSupportedModesListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRModeSelectSupportedModesListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6559,13 +6645,12 @@
     : public MTRCallbackBridge<ModeSelectGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRModeSelectGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<ModeSelectGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRModeSelectGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ModeSelectGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRModeSelectGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ModeSelectGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<ModeSelectGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6577,11 +6662,13 @@
     MTRModeSelectGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRModeSelectGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRModeSelectGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRModeSelectGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRModeSelectGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6591,13 +6678,12 @@
     : public MTRCallbackBridge<ModeSelectAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRModeSelectAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<ModeSelectAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRModeSelectAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ModeSelectAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRModeSelectAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ModeSelectAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<ModeSelectAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6609,11 +6695,13 @@
     MTRModeSelectAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRModeSelectAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRModeSelectAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRModeSelectAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRModeSelectAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6622,12 +6710,11 @@
 class MTRModeSelectAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<ModeSelectAttributeListListAttributeCallback>
 {
 public:
-    MTRModeSelectAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ModeSelectAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRModeSelectAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ModeSelectAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRModeSelectAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<ModeSelectAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRModeSelectAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ModeSelectAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -6639,11 +6726,13 @@
     MTRModeSelectAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRModeSelectAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRModeSelectAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRModeSelectAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRModeSelectAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6653,13 +6742,12 @@
     : public MTRCallbackBridge<DoorLockCredentialRulesSupportAttributeCallback>
 {
 public:
-    MTRDoorLockCredentialRulesSupportAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockCredentialRulesSupportAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockCredentialRulesSupportAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockCredentialRulesSupportAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockCredentialRulesSupportAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockCredentialRulesSupportAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockCredentialRulesSupportAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockCredentialRulesSupportAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::DoorLock::DlCredentialRuleMask> value);
 };
@@ -6671,11 +6759,13 @@
     MTRDoorLockCredentialRulesSupportAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockCredentialRulesSupportAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockCredentialRulesSupportAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockCredentialRulesSupportAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockCredentialRulesSupportAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6685,13 +6775,12 @@
     : public MTRCallbackBridge<DoorLockSupportedOperatingModesAttributeCallback>
 {
 public:
-    MTRDoorLockSupportedOperatingModesAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockSupportedOperatingModesAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockSupportedOperatingModesAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockSupportedOperatingModesAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockSupportedOperatingModesAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockSupportedOperatingModesAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockSupportedOperatingModesAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::DoorLock::DlSupportedOperatingModes> value);
 };
@@ -6703,11 +6792,13 @@
     MTRDoorLockSupportedOperatingModesAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockSupportedOperatingModesAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockSupportedOperatingModesAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockSupportedOperatingModesAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockSupportedOperatingModesAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6717,13 +6808,12 @@
     : public MTRCallbackBridge<DoorLockDefaultConfigurationRegisterAttributeCallback>
 {
 public:
-    MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockDefaultConfigurationRegisterAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockDefaultConfigurationRegisterAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockDefaultConfigurationRegisterAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockDefaultConfigurationRegisterAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::DoorLock::DlDefaultConfigurationRegister> value);
 };
@@ -6735,11 +6825,13 @@
     MTRDoorLockDefaultConfigurationRegisterAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6749,13 +6841,12 @@
     : public MTRCallbackBridge<DoorLockLocalProgrammingFeaturesAttributeCallback>
 {
 public:
-    MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockLocalProgrammingFeaturesAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockLocalProgrammingFeaturesAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockLocalProgrammingFeaturesAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockLocalProgrammingFeaturesAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::DoorLock::DlLocalProgrammingFeatures> value);
 };
@@ -6767,11 +6858,13 @@
     MTRDoorLockLocalProgrammingFeaturesAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6781,13 +6874,12 @@
     : public MTRCallbackBridge<DoorLockGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRDoorLockGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6799,11 +6891,13 @@
     MTRDoorLockGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6813,13 +6907,12 @@
     : public MTRCallbackBridge<DoorLockAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRDoorLockAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -6831,11 +6924,13 @@
     MTRDoorLockAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6844,12 +6939,11 @@
 class MTRDoorLockAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<DoorLockAttributeListListAttributeCallback>
 {
 public:
-    MTRDoorLockAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                        bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -6860,11 +6954,13 @@
     MTRDoorLockAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6873,12 +6969,11 @@
 class MTRWindowCoveringConfigStatusAttributeCallbackBridge : public MTRCallbackBridge<WindowCoveringConfigStatusAttributeCallback>
 {
 public:
-    MTRWindowCoveringConfigStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringConfigStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringConfigStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WindowCoveringConfigStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRWindowCoveringConfigStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringConfigStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringConfigStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<WindowCoveringConfigStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value);
 };
@@ -6889,11 +6984,13 @@
     MTRWindowCoveringConfigStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWindowCoveringConfigStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRWindowCoveringConfigStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWindowCoveringConfigStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWindowCoveringConfigStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6903,13 +7000,12 @@
     : public MTRCallbackBridge<WindowCoveringOperationalStatusAttributeCallback>
 {
 public:
-    MTRWindowCoveringOperationalStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringOperationalStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringOperationalStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WindowCoveringOperationalStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWindowCoveringOperationalStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringOperationalStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<WindowCoveringOperationalStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value);
 };
@@ -6921,11 +7017,13 @@
     MTRWindowCoveringOperationalStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWindowCoveringOperationalStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRWindowCoveringOperationalStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWindowCoveringOperationalStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWindowCoveringOperationalStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6934,12 +7032,11 @@
 class MTRWindowCoveringModeAttributeCallbackBridge : public MTRCallbackBridge<WindowCoveringModeAttributeCallback>
 {
 public:
-    MTRWindowCoveringModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WindowCoveringModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRWindowCoveringModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                 bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<WindowCoveringModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value);
 };
@@ -6949,11 +7046,13 @@
 public:
     MTRWindowCoveringModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWindowCoveringModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRWindowCoveringModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWindowCoveringModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWindowCoveringModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6962,12 +7061,11 @@
 class MTRWindowCoveringSafetyStatusAttributeCallbackBridge : public MTRCallbackBridge<WindowCoveringSafetyStatusAttributeCallback>
 {
 public:
-    MTRWindowCoveringSafetyStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringSafetyStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringSafetyStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WindowCoveringSafetyStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRWindowCoveringSafetyStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringSafetyStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringSafetyStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<WindowCoveringSafetyStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::WindowCovering::SafetyStatus> value);
 };
@@ -6978,11 +7076,13 @@
     MTRWindowCoveringSafetyStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWindowCoveringSafetyStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRWindowCoveringSafetyStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWindowCoveringSafetyStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWindowCoveringSafetyStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -6992,14 +7092,12 @@
     : public MTRCallbackBridge<WindowCoveringGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WindowCoveringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<WindowCoveringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7011,11 +7109,13 @@
     MTRWindowCoveringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7025,13 +7125,12 @@
     : public MTRCallbackBridge<WindowCoveringAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WindowCoveringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<WindowCoveringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7043,11 +7142,13 @@
     MTRWindowCoveringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7057,13 +7158,12 @@
     : public MTRCallbackBridge<WindowCoveringAttributeListListAttributeCallback>
 {
 public:
-    MTRWindowCoveringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WindowCoveringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWindowCoveringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<WindowCoveringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -7075,11 +7175,13 @@
     MTRWindowCoveringAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWindowCoveringAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRWindowCoveringAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWindowCoveringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWindowCoveringAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7089,14 +7191,12 @@
     : public MTRCallbackBridge<BarrierControlGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<BarrierControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BarrierControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BarrierControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<BarrierControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7108,11 +7208,13 @@
     MTRBarrierControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7122,13 +7224,12 @@
     : public MTRCallbackBridge<BarrierControlAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<BarrierControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BarrierControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BarrierControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<BarrierControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7140,11 +7241,13 @@
     MTRBarrierControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7154,13 +7257,12 @@
     : public MTRCallbackBridge<BarrierControlAttributeListListAttributeCallback>
 {
 public:
-    MTRBarrierControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<BarrierControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBarrierControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BarrierControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBarrierControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BarrierControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<BarrierControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -7172,11 +7274,13 @@
     MTRBarrierControlAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBarrierControlAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBarrierControlAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBarrierControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBarrierControlAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7186,13 +7290,12 @@
     : public MTRCallbackBridge<PumpConfigurationAndControlPumpStatusAttributeCallback>
 {
 public:
-    MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlPumpStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PumpConfigurationAndControlPumpStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlPumpStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<PumpConfigurationAndControlPumpStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::PumpConfigurationAndControl::PumpStatus> value);
 };
@@ -7204,11 +7307,13 @@
     MTRPumpConfigurationAndControlPumpStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7218,15 +7323,13 @@
     : public MTRCallbackBridge<PumpConfigurationAndControlGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PumpConfigurationAndControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<PumpConfigurationAndControlGeneratedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7238,11 +7341,13 @@
     MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7252,15 +7357,13 @@
     : public MTRCallbackBridge<PumpConfigurationAndControlAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                               keepAlive){};
+    MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PumpConfigurationAndControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                               keepAlive){};
+                                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<PumpConfigurationAndControlAcceptedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                               OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7272,11 +7375,13 @@
     MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7286,14 +7391,12 @@
     : public MTRCallbackBridge<PumpConfigurationAndControlAttributeListListAttributeCallback>
 {
 public:
-    MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PumpConfigurationAndControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<PumpConfigurationAndControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -7305,11 +7408,13 @@
     MTRPumpConfigurationAndControlAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7319,13 +7424,12 @@
     : public MTRCallbackBridge<ThermostatGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRThermostatGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThermostatGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThermostatGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThermostatGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<ThermostatGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7337,11 +7441,13 @@
     MTRThermostatGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThermostatGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThermostatGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThermostatGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThermostatGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7351,13 +7457,12 @@
     : public MTRCallbackBridge<ThermostatAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRThermostatAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThermostatAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThermostatAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThermostatAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<ThermostatAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7369,11 +7474,13 @@
     MTRThermostatAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThermostatAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThermostatAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThermostatAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThermostatAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7382,12 +7489,11 @@
 class MTRThermostatAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<ThermostatAttributeListListAttributeCallback>
 {
 public:
-    MTRThermostatAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThermostatAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThermostatAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRThermostatAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRThermostatAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ThermostatAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -7399,11 +7505,13 @@
     MTRThermostatAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThermostatAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThermostatAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThermostatAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThermostatAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7413,13 +7521,12 @@
     : public MTRCallbackBridge<FanControlGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRFanControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<FanControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFanControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FanControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRFanControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<FanControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<FanControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7431,11 +7538,13 @@
     MTRFanControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFanControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRFanControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFanControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFanControlGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7445,13 +7554,12 @@
     : public MTRCallbackBridge<FanControlAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRFanControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<FanControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFanControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FanControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRFanControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<FanControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<FanControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7463,11 +7571,13 @@
     MTRFanControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFanControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRFanControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFanControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFanControlAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7476,12 +7586,11 @@
 class MTRFanControlAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<FanControlAttributeListListAttributeCallback>
 {
 public:
-    MTRFanControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<FanControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFanControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FanControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRFanControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<FanControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRFanControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<FanControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -7493,11 +7602,13 @@
     MTRFanControlAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFanControlAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRFanControlAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFanControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFanControlAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7508,17 +7619,15 @@
 {
 public:
     MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                           ResponseHandler handler,
-                                                                                           bool keepAlive = false) :
+                                                                                           ResponseHandler handler) :
         MTRCallbackBridge<ThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallback>(queue, handler,
-                                                                                                         OnSuccessFn, keepAlive){};
+                                                                                                         OnSuccessFn){};
 
     MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
-                                                                                           MTRActionBlock action,
-                                                                                           bool keepAlive = false) :
+                                                                                           MTRActionBlock action) :
         MTRCallbackBridge<ThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action,
-                                                                                                         OnSuccessFn, keepAlive){};
+                                                                                                         OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7530,11 +7639,13 @@
     MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7545,17 +7656,15 @@
 {
 public:
     MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                          ResponseHandler handler,
-                                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                        keepAlive){};
+                                                                                          ResponseHandler handler) :
+        MTRCallbackBridge<ThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler,
+                                                                                                        OnSuccessFn){};
 
     MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
-                                                                                          MTRActionBlock action,
-                                                                                          bool keepAlive = false) :
+                                                                                          MTRActionBlock action) :
         MTRCallbackBridge<ThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action,
-                                                                                                        OnSuccessFn, keepAlive){};
+                                                                                                        OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7567,11 +7676,13 @@
     MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7581,15 +7692,14 @@
     : public MTRCallbackBridge<ThermostatUserInterfaceConfigurationAttributeListListAttributeCallback>
 {
 public:
-    MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatUserInterfaceConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                  keepAlive){};
+    MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                    ResponseHandler handler) :
+        MTRCallbackBridge<ThermostatUserInterfaceConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                    MTRActionBlock action, bool keepAlive = false) :
+                                                                                    MTRActionBlock action) :
         MTRCallbackBridge<ThermostatUserInterfaceConfigurationAttributeListListAttributeCallback>(queue, handler, action,
-                                                                                                  OnSuccessFn, keepAlive){};
+                                                                                                  OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -7601,11 +7711,13 @@
     MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7615,13 +7727,12 @@
     : public MTRCallbackBridge<ColorControlGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRColorControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRColorControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7633,11 +7744,13 @@
     MTRColorControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7647,13 +7760,12 @@
     : public MTRCallbackBridge<ColorControlAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRColorControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRColorControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7665,11 +7777,13 @@
     MTRColorControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7679,13 +7793,12 @@
     : public MTRCallbackBridge<ColorControlAttributeListListAttributeCallback>
 {
 public:
-    MTRColorControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRColorControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRColorControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -7697,11 +7810,13 @@
     MTRColorControlAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7711,14 +7826,12 @@
     : public MTRCallbackBridge<BallastConfigurationGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<BallastConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BallastConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BallastConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<BallastConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7730,11 +7843,13 @@
     MTRBallastConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7744,14 +7859,12 @@
     : public MTRCallbackBridge<BallastConfigurationAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<BallastConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BallastConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BallastConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<BallastConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7763,11 +7876,13 @@
     MTRBallastConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7777,13 +7892,12 @@
     : public MTRCallbackBridge<BallastConfigurationAttributeListListAttributeCallback>
 {
 public:
-    MTRBallastConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<BallastConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRBallastConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<BallastConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRBallastConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<BallastConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<BallastConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -7795,11 +7909,13 @@
     MTRBallastConfigurationAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRBallastConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRBallastConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRBallastConfigurationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRBallastConfigurationAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7809,15 +7925,12 @@
     : public MTRCallbackBridge<IlluminanceMeasurementGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<IlluminanceMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                           keepAlive){};
+    MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<IlluminanceMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<IlluminanceMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                           keepAlive){};
+                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<IlluminanceMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7829,11 +7942,13 @@
     MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7843,14 +7958,12 @@
     : public MTRCallbackBridge<IlluminanceMeasurementAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<IlluminanceMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<IlluminanceMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<IlluminanceMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<IlluminanceMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7862,11 +7975,13 @@
     MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7876,14 +7991,12 @@
     : public MTRCallbackBridge<IlluminanceMeasurementAttributeListListAttributeCallback>
 {
 public:
-    MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<IlluminanceMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<IlluminanceMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<IlluminanceMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<IlluminanceMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -7895,11 +8008,13 @@
     MTRIlluminanceMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7909,15 +8024,12 @@
     : public MTRCallbackBridge<TemperatureMeasurementGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<TemperatureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                           keepAlive){};
+    MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TemperatureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TemperatureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                           keepAlive){};
+                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<TemperatureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7929,11 +8041,13 @@
     MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7943,14 +8057,12 @@
     : public MTRCallbackBridge<TemperatureMeasurementAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<TemperatureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TemperatureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TemperatureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<TemperatureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -7962,11 +8074,13 @@
     MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -7976,14 +8090,12 @@
     : public MTRCallbackBridge<TemperatureMeasurementAttributeListListAttributeCallback>
 {
 public:
-    MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<TemperatureMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TemperatureMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TemperatureMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<TemperatureMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -7995,11 +8107,13 @@
     MTRTemperatureMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8009,14 +8123,12 @@
     : public MTRCallbackBridge<PressureMeasurementGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<PressureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PressureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PressureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<PressureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8028,11 +8140,13 @@
     MTRPressureMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8042,14 +8156,12 @@
     : public MTRCallbackBridge<PressureMeasurementAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<PressureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PressureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PressureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<PressureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8061,11 +8173,13 @@
     MTRPressureMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8075,13 +8189,12 @@
     : public MTRCallbackBridge<PressureMeasurementAttributeListListAttributeCallback>
 {
 public:
-    MTRPressureMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<PressureMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPressureMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PressureMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPressureMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PressureMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<PressureMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -8093,11 +8206,13 @@
     MTRPressureMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPressureMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRPressureMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPressureMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPressureMeasurementAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8107,14 +8222,12 @@
     : public MTRCallbackBridge<FlowMeasurementGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<FlowMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FlowMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<FlowMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<FlowMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8126,11 +8239,13 @@
     MTRFlowMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8140,14 +8255,12 @@
     : public MTRCallbackBridge<FlowMeasurementAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<FlowMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FlowMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<FlowMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<FlowMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8159,11 +8272,13 @@
     MTRFlowMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8173,13 +8288,12 @@
     : public MTRCallbackBridge<FlowMeasurementAttributeListListAttributeCallback>
 {
 public:
-    MTRFlowMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<FlowMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFlowMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FlowMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRFlowMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<FlowMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<FlowMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -8191,11 +8305,13 @@
     MTRFlowMeasurementAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFlowMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRFlowMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFlowMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFlowMeasurementAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8205,15 +8321,13 @@
     : public MTRCallbackBridge<RelativeHumidityMeasurementGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<RelativeHumidityMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<RelativeHumidityMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<RelativeHumidityMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<RelativeHumidityMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8225,11 +8339,13 @@
     MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8239,15 +8355,13 @@
     : public MTRCallbackBridge<RelativeHumidityMeasurementAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<RelativeHumidityMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                               keepAlive){};
+    MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<RelativeHumidityMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<RelativeHumidityMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                               keepAlive){};
+                                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<RelativeHumidityMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
+                                                                                               OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8259,11 +8373,13 @@
     MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8273,14 +8389,12 @@
     : public MTRCallbackBridge<RelativeHumidityMeasurementAttributeListListAttributeCallback>
 {
 public:
-    MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<RelativeHumidityMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<RelativeHumidityMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<RelativeHumidityMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<RelativeHumidityMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -8292,11 +8406,13 @@
     MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8306,14 +8422,12 @@
     : public MTRCallbackBridge<OccupancySensingGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<OccupancySensingGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OccupancySensingGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OccupancySensingGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<OccupancySensingGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8325,11 +8439,13 @@
     MTROccupancySensingGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8339,14 +8455,12 @@
     : public MTRCallbackBridge<OccupancySensingAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<OccupancySensingAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OccupancySensingAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OccupancySensingAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<OccupancySensingAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8358,11 +8472,13 @@
     MTROccupancySensingAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8372,13 +8488,12 @@
     : public MTRCallbackBridge<OccupancySensingAttributeListListAttributeCallback>
 {
 public:
-    MTROccupancySensingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<OccupancySensingAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROccupancySensingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OccupancySensingAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROccupancySensingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OccupancySensingAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<OccupancySensingAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -8390,11 +8505,13 @@
     MTROccupancySensingAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROccupancySensingAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTROccupancySensingAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROccupancySensingAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROccupancySensingAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8404,13 +8521,12 @@
     : public MTRCallbackBridge<WakeOnLanGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<WakeOnLanGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WakeOnLanGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WakeOnLanGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<WakeOnLanGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8422,11 +8538,13 @@
     MTRWakeOnLanGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8436,13 +8554,12 @@
     : public MTRCallbackBridge<WakeOnLanAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<WakeOnLanAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WakeOnLanAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WakeOnLanAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<WakeOnLanAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8454,11 +8571,13 @@
     MTRWakeOnLanAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8467,12 +8586,11 @@
 class MTRWakeOnLanAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<WakeOnLanAttributeListListAttributeCallback>
 {
 public:
-    MTRWakeOnLanAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<WakeOnLanAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWakeOnLanAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WakeOnLanAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRWakeOnLanAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<WakeOnLanAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRWakeOnLanAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<WakeOnLanAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -8483,11 +8601,13 @@
     MTRWakeOnLanAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWakeOnLanAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRWakeOnLanAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWakeOnLanAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWakeOnLanAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8496,12 +8616,11 @@
 class MTRChannelChannelListListAttributeCallbackBridge : public MTRCallbackBridge<ChannelChannelListListAttributeCallback>
 {
 public:
-    MTRChannelChannelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ChannelChannelListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRChannelChannelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ChannelChannelListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRChannelChannelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                     bool keepAlive = false) :
-        MTRCallbackBridge<ChannelChannelListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRChannelChannelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ChannelChannelListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -8514,11 +8633,13 @@
     MTRChannelChannelListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRChannelChannelListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRChannelChannelListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRChannelChannelListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRChannelChannelListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8527,12 +8648,11 @@
 class MTRChannelLineupStructAttributeCallbackBridge : public MTRCallbackBridge<ChannelLineupStructAttributeCallback>
 {
 public:
-    MTRChannelLineupStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ChannelLineupStructAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRChannelLineupStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ChannelLineupStructAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRChannelLineupStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                  bool keepAlive = false) :
-        MTRCallbackBridge<ChannelLineupStructAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRChannelLineupStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ChannelLineupStructAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -8545,11 +8665,13 @@
     MTRChannelLineupStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action,
                                                               MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRChannelLineupStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRChannelLineupStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRChannelLineupStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRChannelLineupStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8558,12 +8680,11 @@
 class MTRChannelCurrentChannelStructAttributeCallbackBridge : public MTRCallbackBridge<ChannelCurrentChannelStructAttributeCallback>
 {
 public:
-    MTRChannelCurrentChannelStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ChannelCurrentChannelStructAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRChannelCurrentChannelStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ChannelCurrentChannelStructAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRChannelCurrentChannelStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<ChannelCurrentChannelStructAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRChannelCurrentChannelStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ChannelCurrentChannelStructAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -8577,11 +8698,13 @@
     MTRChannelCurrentChannelStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRChannelCurrentChannelStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRChannelCurrentChannelStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRChannelCurrentChannelStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRChannelCurrentChannelStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8591,13 +8714,12 @@
     : public MTRCallbackBridge<ChannelGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRChannelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<ChannelGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRChannelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ChannelGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRChannelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ChannelGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<ChannelGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8609,11 +8731,13 @@
     MTRChannelGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRChannelGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRChannelGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRChannelGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRChannelGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8623,13 +8747,12 @@
     : public MTRCallbackBridge<ChannelAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRChannelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ChannelAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRChannelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ChannelAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRChannelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ChannelAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRChannelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<ChannelAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8641,11 +8764,13 @@
     MTRChannelAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRChannelAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRChannelAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRChannelAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRChannelAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8654,12 +8779,11 @@
 class MTRChannelAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<ChannelAttributeListListAttributeCallback>
 {
 public:
-    MTRChannelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ChannelAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRChannelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ChannelAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRChannelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                       bool keepAlive = false) :
-        MTRCallbackBridge<ChannelAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRChannelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ChannelAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -8670,11 +8794,13 @@
     MTRChannelAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRChannelAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRChannelAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRChannelAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRChannelAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8684,13 +8810,12 @@
     : public MTRCallbackBridge<TargetNavigatorTargetListListAttributeCallback>
 {
 public:
-    MTRTargetNavigatorTargetListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorTargetListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTargetNavigatorTargetListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TargetNavigatorTargetListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTargetNavigatorTargetListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorTargetListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTargetNavigatorTargetListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<TargetNavigatorTargetListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -8705,11 +8830,13 @@
     MTRTargetNavigatorTargetListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTargetNavigatorTargetListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTargetNavigatorTargetListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTargetNavigatorTargetListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTargetNavigatorTargetListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8719,14 +8846,12 @@
     : public MTRCallbackBridge<TargetNavigatorGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TargetNavigatorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<TargetNavigatorGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8738,11 +8863,13 @@
     MTRTargetNavigatorGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8752,14 +8879,12 @@
     : public MTRCallbackBridge<TargetNavigatorAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TargetNavigatorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<TargetNavigatorAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8771,11 +8896,13 @@
     MTRTargetNavigatorAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8785,13 +8912,12 @@
     : public MTRCallbackBridge<TargetNavigatorAttributeListListAttributeCallback>
 {
 public:
-    MTRTargetNavigatorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTargetNavigatorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TargetNavigatorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTargetNavigatorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<TargetNavigatorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -8803,11 +8929,13 @@
     MTRTargetNavigatorAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTargetNavigatorAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTargetNavigatorAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTargetNavigatorAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTargetNavigatorAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8817,13 +8945,12 @@
     : public MTRCallbackBridge<MediaPlaybackSampledPositionStructAttributeCallback>
 {
 public:
-    MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackSampledPositionStructAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaPlaybackSampledPositionStructAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackSampledPositionStructAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<MediaPlaybackSampledPositionStructAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -8837,11 +8964,13 @@
     MTRMediaPlaybackSampledPositionStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8851,13 +8980,12 @@
     : public MTRCallbackBridge<MediaPlaybackGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaPlaybackGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<MediaPlaybackGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8869,11 +8997,13 @@
     MTRMediaPlaybackGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8883,13 +9013,12 @@
     : public MTRCallbackBridge<MediaPlaybackAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaPlaybackAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<MediaPlaybackAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8901,11 +9030,13 @@
     MTRMediaPlaybackAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8915,13 +9046,12 @@
     : public MTRCallbackBridge<MediaPlaybackAttributeListListAttributeCallback>
 {
 public:
-    MTRMediaPlaybackAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaPlaybackAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaPlaybackAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRMediaPlaybackAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRMediaPlaybackAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<MediaPlaybackAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -8933,11 +9063,13 @@
     MTRMediaPlaybackAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaPlaybackAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaPlaybackAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaPlaybackAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaPlaybackAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8946,12 +9078,11 @@
 class MTRMediaInputInputListListAttributeCallbackBridge : public MTRCallbackBridge<MediaInputInputListListAttributeCallback>
 {
 public:
-    MTRMediaInputInputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<MediaInputInputListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaInputInputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaInputInputListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRMediaInputInputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                      bool keepAlive = false) :
-        MTRCallbackBridge<MediaInputInputListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRMediaInputInputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<MediaInputInputListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -8964,11 +9095,13 @@
     MTRMediaInputInputListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaInputInputListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaInputInputListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaInputInputListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaInputInputListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8978,13 +9111,12 @@
     : public MTRCallbackBridge<MediaInputGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRMediaInputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<MediaInputGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaInputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaInputGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRMediaInputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<MediaInputGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<MediaInputGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -8996,11 +9128,13 @@
     MTRMediaInputGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaInputGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaInputGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaInputGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaInputGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9010,13 +9144,12 @@
     : public MTRCallbackBridge<MediaInputAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRMediaInputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<MediaInputAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaInputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaInputAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRMediaInputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<MediaInputAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<MediaInputAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9028,11 +9161,13 @@
     MTRMediaInputAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaInputAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaInputAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaInputAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaInputAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9041,12 +9176,11 @@
 class MTRMediaInputAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<MediaInputAttributeListListAttributeCallback>
 {
 public:
-    MTRMediaInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<MediaInputAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaInputAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRMediaInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<MediaInputAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRMediaInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<MediaInputAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -9058,11 +9192,13 @@
     MTRMediaInputAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaInputAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaInputAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaInputAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaInputAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9072,13 +9208,12 @@
     : public MTRCallbackBridge<LowPowerGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRLowPowerGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<LowPowerGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRLowPowerGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LowPowerGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRLowPowerGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<LowPowerGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<LowPowerGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9090,11 +9225,13 @@
     MTRLowPowerGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLowPowerGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRLowPowerGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLowPowerGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLowPowerGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9104,13 +9241,12 @@
     : public MTRCallbackBridge<LowPowerAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRLowPowerAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<LowPowerAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRLowPowerAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LowPowerAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRLowPowerAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<LowPowerAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<LowPowerAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9122,11 +9258,13 @@
     MTRLowPowerAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLowPowerAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRLowPowerAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLowPowerAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLowPowerAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9135,12 +9273,11 @@
 class MTRLowPowerAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<LowPowerAttributeListListAttributeCallback>
 {
 public:
-    MTRLowPowerAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<LowPowerAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRLowPowerAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LowPowerAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRLowPowerAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                        bool keepAlive = false) :
-        MTRCallbackBridge<LowPowerAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRLowPowerAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<LowPowerAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -9151,11 +9288,13 @@
     MTRLowPowerAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLowPowerAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRLowPowerAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLowPowerAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLowPowerAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9165,13 +9304,12 @@
     : public MTRCallbackBridge<KeypadInputGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<KeypadInputGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<KeypadInputGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9183,11 +9321,13 @@
     MTRKeypadInputGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9197,13 +9337,12 @@
     : public MTRCallbackBridge<KeypadInputAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<KeypadInputAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<KeypadInputAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9215,11 +9354,13 @@
     MTRKeypadInputAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9229,13 +9370,11 @@
     : public MTRCallbackBridge<KeypadInputAttributeListListAttributeCallback>
 {
 public:
-    MTRKeypadInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRKeypadInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<KeypadInputAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRKeypadInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRKeypadInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<KeypadInputAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -9247,11 +9386,13 @@
     MTRKeypadInputAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRKeypadInputAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRKeypadInputAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRKeypadInputAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRKeypadInputAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9261,13 +9402,12 @@
     : public MTRCallbackBridge<ContentLauncherAcceptHeaderListAttributeCallback>
 {
 public:
-    MTRContentLauncherAcceptHeaderListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherAcceptHeaderListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRContentLauncherAcceptHeaderListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ContentLauncherAcceptHeaderListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRContentLauncherAcceptHeaderListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherAcceptHeaderListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<ContentLauncherAcceptHeaderListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CharSpan> & value);
 };
@@ -9279,11 +9419,13 @@
     MTRContentLauncherAcceptHeaderListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRContentLauncherAcceptHeaderListAttributeCallbackBridge(queue, handler, action, true),
+        MTRContentLauncherAcceptHeaderListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRContentLauncherAcceptHeaderListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRContentLauncherAcceptHeaderListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9293,14 +9435,12 @@
     : public MTRCallbackBridge<ContentLauncherGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ContentLauncherGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<ContentLauncherGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9312,11 +9452,13 @@
     MTRContentLauncherGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9326,14 +9468,12 @@
     : public MTRCallbackBridge<ContentLauncherAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ContentLauncherAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<ContentLauncherAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9345,11 +9485,13 @@
     MTRContentLauncherAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9359,13 +9501,12 @@
     : public MTRCallbackBridge<ContentLauncherAttributeListListAttributeCallback>
 {
 public:
-    MTRContentLauncherAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRContentLauncherAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ContentLauncherAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRContentLauncherAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<ContentLauncherAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -9377,11 +9518,13 @@
     MTRContentLauncherAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRContentLauncherAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRContentLauncherAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRContentLauncherAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRContentLauncherAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9390,12 +9533,11 @@
 class MTRAudioOutputOutputListListAttributeCallbackBridge : public MTRCallbackBridge<AudioOutputOutputListListAttributeCallback>
 {
 public:
-    MTRAudioOutputOutputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<AudioOutputOutputListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAudioOutputOutputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AudioOutputOutputListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRAudioOutputOutputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                        bool keepAlive = false) :
-        MTRCallbackBridge<AudioOutputOutputListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRAudioOutputOutputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<AudioOutputOutputListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -9408,11 +9550,13 @@
     MTRAudioOutputOutputListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAudioOutputOutputListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAudioOutputOutputListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAudioOutputOutputListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAudioOutputOutputListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9422,13 +9566,12 @@
     : public MTRCallbackBridge<AudioOutputGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<AudioOutputGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AudioOutputGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AudioOutputGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<AudioOutputGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9440,11 +9583,13 @@
     MTRAudioOutputGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9454,13 +9599,12 @@
     : public MTRCallbackBridge<AudioOutputAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<AudioOutputAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AudioOutputAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AudioOutputAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<AudioOutputAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9472,11 +9616,13 @@
     MTRAudioOutputAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9486,13 +9632,11 @@
     : public MTRCallbackBridge<AudioOutputAttributeListListAttributeCallback>
 {
 public:
-    MTRAudioOutputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<AudioOutputAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAudioOutputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AudioOutputAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRAudioOutputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<AudioOutputAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRAudioOutputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<AudioOutputAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -9504,11 +9648,13 @@
     MTRAudioOutputAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAudioOutputAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAudioOutputAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAudioOutputAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAudioOutputAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9518,13 +9664,12 @@
     : public MTRCallbackBridge<ApplicationLauncherCatalogListListAttributeCallback>
 {
 public:
-    MTRApplicationLauncherCatalogListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherCatalogListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationLauncherCatalogListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationLauncherCatalogListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationLauncherCatalogListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherCatalogListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationLauncherCatalogListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<uint16_t> & value);
 };
@@ -9536,11 +9681,13 @@
     MTRApplicationLauncherCatalogListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationLauncherCatalogListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationLauncherCatalogListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationLauncherCatalogListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationLauncherCatalogListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9550,13 +9697,12 @@
     : public MTRCallbackBridge<ApplicationLauncherCurrentAppStructAttributeCallback>
 {
 public:
-    MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherCurrentAppStructAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationLauncherCurrentAppStructAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherCurrentAppStructAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationLauncherCurrentAppStructAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -9571,11 +9717,13 @@
     MTRApplicationLauncherCurrentAppStructAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9585,14 +9733,12 @@
     : public MTRCallbackBridge<ApplicationLauncherGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationLauncherGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationLauncherGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9604,11 +9750,13 @@
     MTRApplicationLauncherGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9618,14 +9766,12 @@
     : public MTRCallbackBridge<ApplicationLauncherAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationLauncherAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationLauncherAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9637,11 +9783,13 @@
     MTRApplicationLauncherAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9651,13 +9799,12 @@
     : public MTRCallbackBridge<ApplicationLauncherAttributeListListAttributeCallback>
 {
 public:
-    MTRApplicationLauncherAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationLauncherAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationLauncherAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationLauncherAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationLauncherAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -9669,11 +9816,13 @@
     MTRApplicationLauncherAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationLauncherAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationLauncherAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationLauncherAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationLauncherAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9683,13 +9832,12 @@
     : public MTRCallbackBridge<ApplicationBasicApplicationStructAttributeCallback>
 {
 public:
-    MTRApplicationBasicApplicationStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicApplicationStructAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationBasicApplicationStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationBasicApplicationStructAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationBasicApplicationStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicApplicationStructAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationBasicApplicationStructAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -9703,11 +9851,13 @@
     MTRApplicationBasicApplicationStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationBasicApplicationStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationBasicApplicationStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationBasicApplicationStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationBasicApplicationStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9717,13 +9867,12 @@
     : public MTRCallbackBridge<ApplicationBasicAllowedVendorListListAttributeCallback>
 {
 public:
-    MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicAllowedVendorListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationBasicAllowedVendorListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicAllowedVendorListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationBasicAllowedVendorListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::VendorId> & value);
 };
@@ -9735,11 +9884,13 @@
     MTRApplicationBasicAllowedVendorListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9749,14 +9900,12 @@
     : public MTRCallbackBridge<ApplicationBasicGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationBasicGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationBasicGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9768,11 +9917,13 @@
     MTRApplicationBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9782,14 +9933,12 @@
     : public MTRCallbackBridge<ApplicationBasicAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationBasicAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationBasicAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9801,11 +9950,13 @@
     MTRApplicationBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9815,13 +9966,12 @@
     : public MTRCallbackBridge<ApplicationBasicAttributeListListAttributeCallback>
 {
 public:
-    MTRApplicationBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationBasicAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationBasicAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -9833,11 +9983,13 @@
     MTRApplicationBasicAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationBasicAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationBasicAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationBasicAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationBasicAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9847,13 +9999,12 @@
     : public MTRCallbackBridge<AccountLoginGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<AccountLoginGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccountLoginGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AccountLoginGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<AccountLoginGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9865,11 +10016,13 @@
     MTRAccountLoginGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9879,13 +10032,12 @@
     : public MTRCallbackBridge<AccountLoginAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<AccountLoginAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccountLoginAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AccountLoginAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<AccountLoginAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9897,11 +10049,13 @@
     MTRAccountLoginAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9911,13 +10065,12 @@
     : public MTRCallbackBridge<AccountLoginAttributeListListAttributeCallback>
 {
 public:
-    MTRAccountLoginAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<AccountLoginAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccountLoginAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccountLoginAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRAccountLoginAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<AccountLoginAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRAccountLoginAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<AccountLoginAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -9929,11 +10082,13 @@
     MTRAccountLoginAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccountLoginAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccountLoginAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccountLoginAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccountLoginAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9943,14 +10098,12 @@
     : public MTRCallbackBridge<ElectricalMeasurementGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ElectricalMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ElectricalMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ElectricalMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<ElectricalMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9962,11 +10115,13 @@
     MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -9976,14 +10131,12 @@
     : public MTRCallbackBridge<ElectricalMeasurementAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ElectricalMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ElectricalMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ElectricalMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<ElectricalMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -9995,11 +10148,13 @@
     MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10009,14 +10164,12 @@
     : public MTRCallbackBridge<ElectricalMeasurementAttributeListListAttributeCallback>
 {
 public:
-    MTRElectricalMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<ElectricalMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRElectricalMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ElectricalMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRElectricalMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ElectricalMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<ElectricalMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -10028,11 +10181,13 @@
     MTRElectricalMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRElectricalMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRElectricalMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRElectricalMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRElectricalMeasurementAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10041,12 +10196,11 @@
 class MTRTestClusterBitmap8AttributeCallbackBridge : public MTRCallbackBridge<TestClusterBitmap8AttributeCallback>
 {
 public:
-    MTRTestClusterBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterBitmap8AttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterBitmap8AttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                 bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterBitmap8AttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterBitmap8AttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::TestCluster::Bitmap8MaskMap> value);
 };
@@ -10056,11 +10210,13 @@
 public:
     MTRTestClusterBitmap8AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterBitmap8AttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterBitmap8AttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterBitmap8AttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterBitmap8AttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10069,12 +10225,11 @@
 class MTRTestClusterBitmap16AttributeCallbackBridge : public MTRCallbackBridge<TestClusterBitmap16AttributeCallback>
 {
 public:
-    MTRTestClusterBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterBitmap16AttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterBitmap16AttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                  bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterBitmap16AttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterBitmap16AttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap> value);
 };
@@ -10085,11 +10240,13 @@
     MTRTestClusterBitmap16AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action,
                                                               MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterBitmap16AttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterBitmap16AttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterBitmap16AttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterBitmap16AttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10098,12 +10255,11 @@
 class MTRTestClusterBitmap32AttributeCallbackBridge : public MTRCallbackBridge<TestClusterBitmap32AttributeCallback>
 {
 public:
-    MTRTestClusterBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterBitmap32AttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterBitmap32AttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                  bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterBitmap32AttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterBitmap32AttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap> value);
 };
@@ -10114,11 +10270,13 @@
     MTRTestClusterBitmap32AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action,
                                                               MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterBitmap32AttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterBitmap32AttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterBitmap32AttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterBitmap32AttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10127,12 +10285,11 @@
 class MTRTestClusterBitmap64AttributeCallbackBridge : public MTRCallbackBridge<TestClusterBitmap64AttributeCallback>
 {
 public:
-    MTRTestClusterBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterBitmap64AttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterBitmap64AttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                  bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterBitmap64AttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterBitmap64AttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::TestCluster::Bitmap64MaskMap> value);
 };
@@ -10143,11 +10300,13 @@
     MTRTestClusterBitmap64AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action,
                                                               MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterBitmap64AttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterBitmap64AttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterBitmap64AttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterBitmap64AttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10156,12 +10315,11 @@
 class MTRTestClusterListInt8uListAttributeCallbackBridge : public MTRCallbackBridge<TestClusterListInt8uListAttributeCallback>
 {
 public:
-    MTRTestClusterListInt8uListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListInt8uListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterListInt8uListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterListInt8uListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterListInt8uListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                       bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListInt8uListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterListInt8uListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterListInt8uListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<uint8_t> & value);
 };
@@ -10172,11 +10330,13 @@
     MTRTestClusterListInt8uListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterListInt8uListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterListInt8uListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterListInt8uListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterListInt8uListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10186,13 +10346,12 @@
     : public MTRCallbackBridge<TestClusterListOctetStringListAttributeCallback>
 {
 public:
-    MTRTestClusterListOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListOctetStringListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterListOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterListOctetStringListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterListOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListOctetStringListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterListOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterListOctetStringListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::ByteSpan> & value);
 };
@@ -10204,11 +10363,13 @@
     MTRTestClusterListOctetStringListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterListOctetStringListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterListOctetStringListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterListOctetStringListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterListOctetStringListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10218,13 +10379,12 @@
     : public MTRCallbackBridge<TestClusterListStructOctetStringListAttributeCallback>
 {
 public:
-    MTRTestClusterListStructOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListStructOctetStringListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterListStructOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterListStructOctetStringListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterListStructOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListStructOctetStringListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterListStructOctetStringListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -10239,11 +10399,13 @@
     MTRTestClusterListStructOctetStringListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterListStructOctetStringListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterListStructOctetStringListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterListStructOctetStringListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterListStructOctetStringListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10253,15 +10415,12 @@
     : public MTRCallbackBridge<TestClusterListNullablesAndOptionalsStructListAttributeCallback>
 {
 public:
-    MTRTestClusterListNullablesAndOptionalsStructListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListNullablesAndOptionalsStructListAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                           keepAlive){};
+    MTRTestClusterListNullablesAndOptionalsStructListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterListNullablesAndOptionalsStructListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterListNullablesAndOptionalsStructListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListNullablesAndOptionalsStructListAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                           keepAlive){};
+                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterListNullablesAndOptionalsStructListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::DecodableList<
@@ -10275,11 +10434,13 @@
     MTRTestClusterListNullablesAndOptionalsStructListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterListNullablesAndOptionalsStructListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterListNullablesAndOptionalsStructListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterListNullablesAndOptionalsStructListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterListNullablesAndOptionalsStructListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10288,12 +10449,11 @@
 class MTRTestClusterStructAttrStructAttributeCallbackBridge : public MTRCallbackBridge<TestClusterStructAttrStructAttributeCallback>
 {
 public:
-    MTRTestClusterStructAttrStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterStructAttrStructAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterStructAttrStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterStructAttrStructAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterStructAttrStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterStructAttrStructAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterStructAttrStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterStructAttrStructAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::Clusters::TestCluster::Structs::SimpleStruct::DecodableType & value);
 };
@@ -10305,11 +10465,13 @@
     MTRTestClusterStructAttrStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterStructAttrStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterStructAttrStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterStructAttrStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterStructAttrStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10319,13 +10481,12 @@
     : public MTRCallbackBridge<TestClusterListLongOctetStringListAttributeCallback>
 {
 public:
-    MTRTestClusterListLongOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListLongOctetStringListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterListLongOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterListLongOctetStringListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterListLongOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListLongOctetStringListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterListLongOctetStringListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::ByteSpan> & value);
 };
@@ -10337,11 +10498,13 @@
     MTRTestClusterListLongOctetStringListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterListLongOctetStringListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterListLongOctetStringListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterListLongOctetStringListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterListLongOctetStringListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10351,13 +10514,12 @@
     : public MTRCallbackBridge<TestClusterListFabricScopedListAttributeCallback>
 {
 public:
-    MTRTestClusterListFabricScopedListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListFabricScopedListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterListFabricScopedListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterListFabricScopedListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterListFabricScopedListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterListFabricScopedListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterListFabricScopedListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -10372,11 +10534,13 @@
     MTRTestClusterListFabricScopedListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterListFabricScopedListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterListFabricScopedListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterListFabricScopedListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterListFabricScopedListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10385,12 +10549,11 @@
 class MTRTestClusterNullableBitmap8AttributeCallbackBridge : public MTRCallbackBridge<TestClusterNullableBitmap8AttributeCallback>
 {
 public:
-    MTRTestClusterNullableBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterNullableBitmap8AttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterNullableBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterNullableBitmap8AttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterNullableBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterNullableBitmap8AttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterNullableBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterNullableBitmap8AttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -10403,11 +10566,13 @@
     MTRTestClusterNullableBitmap8AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterNullableBitmap8AttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterNullableBitmap8AttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterNullableBitmap8AttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterNullableBitmap8AttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10416,12 +10581,11 @@
 class MTRTestClusterNullableBitmap16AttributeCallbackBridge : public MTRCallbackBridge<TestClusterNullableBitmap16AttributeCallback>
 {
 public:
-    MTRTestClusterNullableBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterNullableBitmap16AttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterNullableBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterNullableBitmap16AttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterNullableBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterNullableBitmap16AttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterNullableBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterNullableBitmap16AttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -10435,11 +10599,13 @@
     MTRTestClusterNullableBitmap16AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterNullableBitmap16AttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterNullableBitmap16AttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterNullableBitmap16AttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterNullableBitmap16AttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10448,12 +10614,11 @@
 class MTRTestClusterNullableBitmap32AttributeCallbackBridge : public MTRCallbackBridge<TestClusterNullableBitmap32AttributeCallback>
 {
 public:
-    MTRTestClusterNullableBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterNullableBitmap32AttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterNullableBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterNullableBitmap32AttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterNullableBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterNullableBitmap32AttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterNullableBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterNullableBitmap32AttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -10467,11 +10632,13 @@
     MTRTestClusterNullableBitmap32AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterNullableBitmap32AttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterNullableBitmap32AttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterNullableBitmap32AttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterNullableBitmap32AttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10480,12 +10647,11 @@
 class MTRTestClusterNullableBitmap64AttributeCallbackBridge : public MTRCallbackBridge<TestClusterNullableBitmap64AttributeCallback>
 {
 public:
-    MTRTestClusterNullableBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterNullableBitmap64AttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterNullableBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterNullableBitmap64AttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterNullableBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterNullableBitmap64AttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterNullableBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterNullableBitmap64AttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -10499,11 +10665,13 @@
     MTRTestClusterNullableBitmap64AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterNullableBitmap64AttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterNullableBitmap64AttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterNullableBitmap64AttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterNullableBitmap64AttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10513,13 +10681,12 @@
     : public MTRCallbackBridge<TestClusterNullableStructStructAttributeCallback>
 {
 public:
-    MTRTestClusterNullableStructStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterNullableStructStructAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterNullableStructStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterNullableStructStructAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterNullableStructStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterNullableStructStructAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterNullableStructStructAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -10533,11 +10700,13 @@
     MTRTestClusterNullableStructStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterNullableStructStructAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterNullableStructStructAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterNullableStructStructAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterNullableStructStructAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10547,13 +10716,12 @@
     : public MTRCallbackBridge<TestClusterGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRTestClusterGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -10565,11 +10733,13 @@
     MTRTestClusterGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterGeneratedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10579,13 +10749,12 @@
     : public MTRCallbackBridge<TestClusterAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRTestClusterAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
@@ -10597,11 +10766,13 @@
     MTRTestClusterAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterAcceptedCommandListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10611,13 +10782,11 @@
     : public MTRCallbackBridge<TestClusterAttributeListListAttributeCallback>
 {
 public:
-    MTRTestClusterAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterAttributeListListAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
@@ -10629,11 +10798,13 @@
     MTRTestClusterAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterAttributeListListAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -10642,12 +10813,11 @@
 class MTRGroupsClusterAddGroupResponseCallbackBridge : public MTRCallbackBridge<GroupsClusterAddGroupResponseCallbackType>
 {
 public:
-    MTRGroupsClusterAddGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<GroupsClusterAddGroupResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupsClusterAddGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupsClusterAddGroupResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRGroupsClusterAddGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                   bool keepAlive = false) :
-        MTRCallbackBridge<GroupsClusterAddGroupResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRGroupsClusterAddGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<GroupsClusterAddGroupResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType & data);
 };
@@ -10655,12 +10825,11 @@
 class MTRGroupsClusterViewGroupResponseCallbackBridge : public MTRCallbackBridge<GroupsClusterViewGroupResponseCallbackType>
 {
 public:
-    MTRGroupsClusterViewGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<GroupsClusterViewGroupResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupsClusterViewGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupsClusterViewGroupResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRGroupsClusterViewGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                    bool keepAlive = false) :
-        MTRCallbackBridge<GroupsClusterViewGroupResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRGroupsClusterViewGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<GroupsClusterViewGroupResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType & data);
 };
@@ -10669,13 +10838,12 @@
     : public MTRCallbackBridge<GroupsClusterGetGroupMembershipResponseCallbackType>
 {
 public:
-    MTRGroupsClusterGetGroupMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<GroupsClusterGetGroupMembershipResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupsClusterGetGroupMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupsClusterGetGroupMembershipResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRGroupsClusterGetGroupMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<GroupsClusterGetGroupMembershipResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRGroupsClusterGetGroupMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<GroupsClusterGetGroupMembershipResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType & data);
@@ -10684,12 +10852,11 @@
 class MTRGroupsClusterRemoveGroupResponseCallbackBridge : public MTRCallbackBridge<GroupsClusterRemoveGroupResponseCallbackType>
 {
 public:
-    MTRGroupsClusterRemoveGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<GroupsClusterRemoveGroupResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupsClusterRemoveGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupsClusterRemoveGroupResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRGroupsClusterRemoveGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                      bool keepAlive = false) :
-        MTRCallbackBridge<GroupsClusterRemoveGroupResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRGroupsClusterRemoveGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<GroupsClusterRemoveGroupResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType & data);
 };
@@ -10697,12 +10864,11 @@
 class MTRScenesClusterAddSceneResponseCallbackBridge : public MTRCallbackBridge<ScenesClusterAddSceneResponseCallbackType>
 {
 public:
-    MTRScenesClusterAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterAddSceneResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesClusterAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesClusterAddSceneResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRScenesClusterAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                   bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterAddSceneResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesClusterAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ScenesClusterAddSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::AddSceneResponse::DecodableType & data);
 };
@@ -10710,12 +10876,11 @@
 class MTRScenesClusterViewSceneResponseCallbackBridge : public MTRCallbackBridge<ScenesClusterViewSceneResponseCallbackType>
 {
 public:
-    MTRScenesClusterViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterViewSceneResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesClusterViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesClusterViewSceneResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRScenesClusterViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                    bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterViewSceneResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesClusterViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ScenesClusterViewSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::ViewSceneResponse::DecodableType & data);
 };
@@ -10723,12 +10888,11 @@
 class MTRScenesClusterRemoveSceneResponseCallbackBridge : public MTRCallbackBridge<ScenesClusterRemoveSceneResponseCallbackType>
 {
 public:
-    MTRScenesClusterRemoveSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterRemoveSceneResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesClusterRemoveSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesClusterRemoveSceneResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRScenesClusterRemoveSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                      bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterRemoveSceneResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesClusterRemoveSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ScenesClusterRemoveSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::RemoveSceneResponse::DecodableType & data);
 };
@@ -10737,12 +10901,11 @@
     : public MTRCallbackBridge<ScenesClusterRemoveAllScenesResponseCallbackType>
 {
 public:
-    MTRScenesClusterRemoveAllScenesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterRemoveAllScenesResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesClusterRemoveAllScenesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesClusterRemoveAllScenesResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRScenesClusterRemoveAllScenesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterRemoveAllScenesResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesClusterRemoveAllScenesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ScenesClusterRemoveAllScenesResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType & data);
@@ -10751,12 +10914,11 @@
 class MTRScenesClusterStoreSceneResponseCallbackBridge : public MTRCallbackBridge<ScenesClusterStoreSceneResponseCallbackType>
 {
 public:
-    MTRScenesClusterStoreSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterStoreSceneResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesClusterStoreSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesClusterStoreSceneResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRScenesClusterStoreSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                     bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterStoreSceneResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesClusterStoreSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ScenesClusterStoreSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType & data);
 };
@@ -10765,13 +10927,12 @@
     : public MTRCallbackBridge<ScenesClusterGetSceneMembershipResponseCallbackType>
 {
 public:
-    MTRScenesClusterGetSceneMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterGetSceneMembershipResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesClusterGetSceneMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesClusterGetSceneMembershipResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRScenesClusterGetSceneMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterGetSceneMembershipResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesClusterGetSceneMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<ScenesClusterGetSceneMembershipResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType & data);
@@ -10781,13 +10942,11 @@
     : public MTRCallbackBridge<ScenesClusterEnhancedAddSceneResponseCallbackType>
 {
 public:
-    MTRScenesClusterEnhancedAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterEnhancedAddSceneResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesClusterEnhancedAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesClusterEnhancedAddSceneResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRScenesClusterEnhancedAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterEnhancedAddSceneResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesClusterEnhancedAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ScenesClusterEnhancedAddSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::Scenes::Commands::EnhancedAddSceneResponse::DecodableType & data);
@@ -10797,13 +10956,12 @@
     : public MTRCallbackBridge<ScenesClusterEnhancedViewSceneResponseCallbackType>
 {
 public:
-    MTRScenesClusterEnhancedViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterEnhancedViewSceneResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesClusterEnhancedViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesClusterEnhancedViewSceneResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRScenesClusterEnhancedViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterEnhancedViewSceneResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesClusterEnhancedViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<ScenesClusterEnhancedViewSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::Scenes::Commands::EnhancedViewSceneResponse::DecodableType & data);
@@ -10812,12 +10970,11 @@
 class MTRScenesClusterCopySceneResponseCallbackBridge : public MTRCallbackBridge<ScenesClusterCopySceneResponseCallbackType>
 {
 public:
-    MTRScenesClusterCopySceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterCopySceneResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRScenesClusterCopySceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ScenesClusterCopySceneResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRScenesClusterCopySceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                    bool keepAlive = false) :
-        MTRCallbackBridge<ScenesClusterCopySceneResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRScenesClusterCopySceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ScenesClusterCopySceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::CopySceneResponse::DecodableType & data);
 };
@@ -10826,14 +10983,12 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType>
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROtaSoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -10844,15 +10999,12 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>(queue, handler, OnSuccessFn,
-                                                                                           keepAlive){};
+    MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                           keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -10863,14 +11015,12 @@
     : public MTRCallbackBridge<GeneralCommissioningClusterArmFailSafeResponseCallbackType>
 {
 public:
-    MTRGeneralCommissioningClusterArmFailSafeResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningClusterArmFailSafeResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralCommissioningClusterArmFailSafeResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralCommissioningClusterArmFailSafeResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRGeneralCommissioningClusterArmFailSafeResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningClusterArmFailSafeResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<GeneralCommissioningClusterArmFailSafeResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType & data);
@@ -10880,15 +11030,13 @@
     : public MTRCallbackBridge<GeneralCommissioningClusterSetRegulatoryConfigResponseCallbackType>
 {
 public:
-    MTRGeneralCommissioningClusterSetRegulatoryConfigResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningClusterSetRegulatoryConfigResponseCallbackType>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRGeneralCommissioningClusterSetRegulatoryConfigResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralCommissioningClusterSetRegulatoryConfigResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRGeneralCommissioningClusterSetRegulatoryConfigResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningClusterSetRegulatoryConfigResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<GeneralCommissioningClusterSetRegulatoryConfigResponseCallbackType>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -10899,15 +11047,13 @@
     : public MTRCallbackBridge<GeneralCommissioningClusterCommissioningCompleteResponseCallbackType>
 {
 public:
-    MTRGeneralCommissioningClusterCommissioningCompleteResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningClusterCommissioningCompleteResponseCallbackType>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTRGeneralCommissioningClusterCommissioningCompleteResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralCommissioningClusterCommissioningCompleteResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRGeneralCommissioningClusterCommissioningCompleteResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningClusterCommissioningCompleteResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<GeneralCommissioningClusterCommissioningCompleteResponseCallbackType>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -10918,14 +11064,12 @@
     : public MTRCallbackBridge<NetworkCommissioningClusterScanNetworksResponseCallbackType>
 {
 public:
-    MTRNetworkCommissioningClusterScanNetworksResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningClusterScanNetworksResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNetworkCommissioningClusterScanNetworksResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NetworkCommissioningClusterScanNetworksResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRNetworkCommissioningClusterScanNetworksResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningClusterScanNetworksResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<NetworkCommissioningClusterScanNetworksResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::NetworkCommissioning::Commands::ScanNetworksResponse::DecodableType & data);
@@ -10935,14 +11079,12 @@
     : public MTRCallbackBridge<NetworkCommissioningClusterNetworkConfigResponseCallbackType>
 {
 public:
-    MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningClusterNetworkConfigResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NetworkCommissioningClusterNetworkConfigResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningClusterNetworkConfigResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<NetworkCommissioningClusterNetworkConfigResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::NetworkCommissioning::Commands::NetworkConfigResponse::DecodableType & data);
@@ -10952,14 +11094,12 @@
     : public MTRCallbackBridge<NetworkCommissioningClusterConnectNetworkResponseCallbackType>
 {
 public:
-    MTRNetworkCommissioningClusterConnectNetworkResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningClusterConnectNetworkResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNetworkCommissioningClusterConnectNetworkResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NetworkCommissioningClusterConnectNetworkResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRNetworkCommissioningClusterConnectNetworkResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningClusterConnectNetworkResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<NetworkCommissioningClusterConnectNetworkResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -10970,13 +11110,12 @@
     : public MTRCallbackBridge<DiagnosticLogsClusterRetrieveLogsResponseCallbackType>
 {
 public:
-    MTRDiagnosticLogsClusterRetrieveLogsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsClusterRetrieveLogsResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDiagnosticLogsClusterRetrieveLogsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DiagnosticLogsClusterRetrieveLogsResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRDiagnosticLogsClusterRetrieveLogsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsClusterRetrieveLogsResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<DiagnosticLogsClusterRetrieveLogsResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::DiagnosticLogs::Commands::RetrieveLogsResponse::DecodableType & data);
@@ -10986,14 +11125,12 @@
     : public MTRCallbackBridge<OperationalCredentialsClusterAttestationResponseCallbackType>
 {
 public:
-    MTROperationalCredentialsClusterAttestationResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsClusterAttestationResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROperationalCredentialsClusterAttestationResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsClusterAttestationResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTROperationalCredentialsClusterAttestationResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsClusterAttestationResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsClusterAttestationResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::OperationalCredentials::Commands::AttestationResponse::DecodableType & data);
@@ -11003,15 +11140,12 @@
     : public MTRCallbackBridge<OperationalCredentialsClusterCertificateChainResponseCallbackType>
 {
 public:
-    MTROperationalCredentialsClusterCertificateChainResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsClusterCertificateChainResponseCallbackType>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTROperationalCredentialsClusterCertificateChainResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsClusterCertificateChainResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTROperationalCredentialsClusterCertificateChainResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsClusterCertificateChainResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsClusterCertificateChainResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -11022,13 +11156,12 @@
     : public MTRCallbackBridge<OperationalCredentialsClusterCSRResponseCallbackType>
 {
 public:
-    MTROperationalCredentialsClusterCSRResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsClusterCSRResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROperationalCredentialsClusterCSRResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsClusterCSRResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTROperationalCredentialsClusterCSRResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsClusterCSRResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsClusterCSRResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::OperationalCredentials::Commands::CSRResponse::DecodableType & data);
@@ -11038,13 +11171,12 @@
     : public MTRCallbackBridge<OperationalCredentialsClusterNOCResponseCallbackType>
 {
 public:
-    MTROperationalCredentialsClusterNOCResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsClusterNOCResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROperationalCredentialsClusterNOCResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsClusterNOCResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTROperationalCredentialsClusterNOCResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsClusterNOCResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsClusterNOCResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType & data);
@@ -11054,14 +11186,12 @@
     : public MTRCallbackBridge<GroupKeyManagementClusterKeySetReadResponseCallbackType>
 {
 public:
-    MTRGroupKeyManagementClusterKeySetReadResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGroupKeyManagementClusterKeySetReadResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRGroupKeyManagementClusterKeySetReadResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadResponse::DecodableType & data);
@@ -11071,15 +11201,12 @@
     : public MTRCallbackBridge<GroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackType>
 {
 public:
-    MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackType>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -11090,13 +11217,12 @@
     : public MTRCallbackBridge<DoorLockClusterGetWeekDayScheduleResponseCallbackType>
 {
 public:
-    MTRDoorLockClusterGetWeekDayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterGetWeekDayScheduleResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterGetWeekDayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterGetWeekDayScheduleResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterGetWeekDayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterGetWeekDayScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterGetWeekDayScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType & data);
@@ -11106,13 +11232,12 @@
     : public MTRCallbackBridge<DoorLockClusterGetYearDayScheduleResponseCallbackType>
 {
 public:
-    MTRDoorLockClusterGetYearDayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterGetYearDayScheduleResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterGetYearDayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterGetYearDayScheduleResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterGetYearDayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterGetYearDayScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterGetYearDayScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType & data);
@@ -11122,13 +11247,12 @@
     : public MTRCallbackBridge<DoorLockClusterGetHolidayScheduleResponseCallbackType>
 {
 public:
-    MTRDoorLockClusterGetHolidayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterGetHolidayScheduleResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterGetHolidayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterGetHolidayScheduleResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterGetHolidayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterGetHolidayScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterGetHolidayScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType & data);
@@ -11137,12 +11261,11 @@
 class MTRDoorLockClusterGetUserResponseCallbackBridge : public MTRCallbackBridge<DoorLockClusterGetUserResponseCallbackType>
 {
 public:
-    MTRDoorLockClusterGetUserResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterGetUserResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterGetUserResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterGetUserResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterGetUserResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                    bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterGetUserResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterGetUserResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterGetUserResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType & data);
 };
@@ -11151,12 +11274,11 @@
     : public MTRCallbackBridge<DoorLockClusterSetCredentialResponseCallbackType>
 {
 public:
-    MTRDoorLockClusterSetCredentialResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterSetCredentialResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterSetCredentialResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterSetCredentialResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterSetCredentialResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterSetCredentialResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterSetCredentialResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterSetCredentialResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType & data);
@@ -11166,13 +11288,12 @@
     : public MTRCallbackBridge<DoorLockClusterGetCredentialStatusResponseCallbackType>
 {
 public:
-    MTRDoorLockClusterGetCredentialStatusResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterGetCredentialStatusResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterGetCredentialStatusResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterGetCredentialStatusResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterGetCredentialStatusResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterGetCredentialStatusResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterGetCredentialStatusResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType & data);
@@ -11182,13 +11303,12 @@
     : public MTRCallbackBridge<ThermostatClusterGetWeeklyScheduleResponseCallbackType>
 {
 public:
-    MTRThermostatClusterGetWeeklyScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatClusterGetWeeklyScheduleResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThermostatClusterGetWeeklyScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThermostatClusterGetWeeklyScheduleResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRThermostatClusterGetWeeklyScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatClusterGetWeeklyScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<ThermostatClusterGetWeeklyScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::Thermostat::Commands::GetWeeklyScheduleResponse::DecodableType & data);
@@ -11198,12 +11318,11 @@
     : public MTRCallbackBridge<ChannelClusterChangeChannelResponseCallbackType>
 {
 public:
-    MTRChannelClusterChangeChannelResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ChannelClusterChangeChannelResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRChannelClusterChangeChannelResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ChannelClusterChangeChannelResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRChannelClusterChangeChannelResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<ChannelClusterChangeChannelResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRChannelClusterChangeChannelResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ChannelClusterChangeChannelResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::Channel::Commands::ChangeChannelResponse::DecodableType & data);
@@ -11213,14 +11332,12 @@
     : public MTRCallbackBridge<TargetNavigatorClusterNavigateTargetResponseCallbackType>
 {
 public:
-    MTRTargetNavigatorClusterNavigateTargetResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorClusterNavigateTargetResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTargetNavigatorClusterNavigateTargetResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TargetNavigatorClusterNavigateTargetResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRTargetNavigatorClusterNavigateTargetResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorClusterNavigateTargetResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<TargetNavigatorClusterNavigateTargetResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::DecodableType & data);
@@ -11230,12 +11347,11 @@
     : public MTRCallbackBridge<MediaPlaybackClusterPlaybackResponseCallbackType>
 {
 public:
-    MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackClusterPlaybackResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaPlaybackClusterPlaybackResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackClusterPlaybackResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<MediaPlaybackClusterPlaybackResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType & data);
@@ -11244,12 +11360,11 @@
 class MTRKeypadInputClusterSendKeyResponseCallbackBridge : public MTRCallbackBridge<KeypadInputClusterSendKeyResponseCallbackType>
 {
 public:
-    MTRKeypadInputClusterSendKeyResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputClusterSendKeyResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRKeypadInputClusterSendKeyResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<KeypadInputClusterSendKeyResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRKeypadInputClusterSendKeyResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                       bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputClusterSendKeyResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRKeypadInputClusterSendKeyResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<KeypadInputClusterSendKeyResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType & data);
@@ -11259,12 +11374,11 @@
     : public MTRCallbackBridge<ContentLauncherClusterLaunchResponseCallbackType>
 {
 public:
-    MTRContentLauncherClusterLaunchResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherClusterLaunchResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRContentLauncherClusterLaunchResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ContentLauncherClusterLaunchResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRContentLauncherClusterLaunchResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherClusterLaunchResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRContentLauncherClusterLaunchResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ContentLauncherClusterLaunchResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::ContentLauncher::Commands::LaunchResponse::DecodableType & data);
@@ -11274,13 +11388,12 @@
     : public MTRCallbackBridge<ApplicationLauncherClusterLauncherResponseCallbackType>
 {
 public:
-    MTRApplicationLauncherClusterLauncherResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherClusterLauncherResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationLauncherClusterLauncherResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationLauncherClusterLauncherResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRApplicationLauncherClusterLauncherResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherClusterLauncherResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationLauncherClusterLauncherResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType & data);
@@ -11290,13 +11403,12 @@
     : public MTRCallbackBridge<AccountLoginClusterGetSetupPINResponseCallbackType>
 {
 public:
-    MTRAccountLoginClusterGetSetupPINResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<AccountLoginClusterGetSetupPINResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccountLoginClusterGetSetupPINResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccountLoginClusterGetSetupPINResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRAccountLoginClusterGetSetupPINResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<AccountLoginClusterGetSetupPINResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRAccountLoginClusterGetSetupPINResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<AccountLoginClusterGetSetupPINResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::AccountLogin::Commands::GetSetupPINResponse::DecodableType & data);
@@ -11306,13 +11418,12 @@
     : public MTRCallbackBridge<TestClusterClusterTestSpecificResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterTestSpecificResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestSpecificResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterTestSpecificResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterTestSpecificResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterClusterTestSpecificResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestSpecificResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterTestSpecificResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterTestSpecificResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::TestCluster::Commands::TestSpecificResponse::DecodableType & data);
@@ -11322,13 +11433,12 @@
     : public MTRCallbackBridge<TestClusterClusterTestAddArgumentsResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterTestAddArgumentsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestAddArgumentsResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterTestAddArgumentsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterTestAddArgumentsResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterClusterTestAddArgumentsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestAddArgumentsResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterTestAddArgumentsResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::TestCluster::Commands::TestAddArgumentsResponse::DecodableType & data);
@@ -11338,14 +11448,12 @@
     : public MTRCallbackBridge<TestClusterClusterTestSimpleArgumentResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterTestSimpleArgumentResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestSimpleArgumentResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterTestSimpleArgumentResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterTestSimpleArgumentResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterClusterTestSimpleArgumentResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestSimpleArgumentResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterTestSimpleArgumentResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::TestCluster::Commands::TestSimpleArgumentResponse::DecodableType & data);
@@ -11355,14 +11463,12 @@
     : public MTRCallbackBridge<TestClusterClusterTestStructArrayArgumentResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterTestStructArrayArgumentResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestStructArrayArgumentResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterTestStructArrayArgumentResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterTestStructArrayArgumentResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterClusterTestStructArrayArgumentResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestStructArrayArgumentResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterTestStructArrayArgumentResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -11373,14 +11479,12 @@
     : public MTRCallbackBridge<TestClusterClusterTestListInt8UReverseResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterTestListInt8UReverseResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestListInt8UReverseResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterTestListInt8UReverseResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterTestListInt8UReverseResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterClusterTestListInt8UReverseResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestListInt8UReverseResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterTestListInt8UReverseResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::TestCluster::Commands::TestListInt8UReverseResponse::DecodableType & data);
@@ -11390,12 +11494,11 @@
     : public MTRCallbackBridge<TestClusterClusterTestEnumsResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterTestEnumsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestEnumsResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterTestEnumsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterTestEnumsResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterClusterTestEnumsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestEnumsResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterTestEnumsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterTestEnumsResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::TestCluster::Commands::TestEnumsResponse::DecodableType & data);
@@ -11405,14 +11508,12 @@
     : public MTRCallbackBridge<TestClusterClusterTestNullableOptionalResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterTestNullableOptionalResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestNullableOptionalResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterTestNullableOptionalResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterTestNullableOptionalResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterClusterTestNullableOptionalResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestNullableOptionalResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterTestNullableOptionalResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::TestCluster::Commands::TestNullableOptionalResponse::DecodableType & data);
@@ -11422,15 +11523,12 @@
     : public MTRCallbackBridge<TestClusterClusterTestComplexNullableOptionalResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterTestComplexNullableOptionalResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestComplexNullableOptionalResponseCallbackType>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTRTestClusterClusterTestComplexNullableOptionalResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterTestComplexNullableOptionalResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterClusterTestComplexNullableOptionalResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestComplexNullableOptionalResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterTestComplexNullableOptionalResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -11440,12 +11538,11 @@
 class MTRTestClusterClusterBooleanResponseCallbackBridge : public MTRCallbackBridge<TestClusterClusterBooleanResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterBooleanResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterBooleanResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterBooleanResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterBooleanResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterClusterBooleanResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                       bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterBooleanResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterBooleanResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterBooleanResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::TestCluster::Commands::BooleanResponse::DecodableType & data);
@@ -11455,13 +11552,12 @@
     : public MTRCallbackBridge<TestClusterClusterSimpleStructResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterSimpleStructResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterSimpleStructResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterSimpleStructResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterSimpleStructResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterClusterSimpleStructResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterSimpleStructResponseCallbackType>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterSimpleStructResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterSimpleStructResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::TestCluster::Commands::SimpleStructResponse::DecodableType & data);
@@ -11471,14 +11567,12 @@
     : public MTRCallbackBridge<TestClusterClusterTestEmitTestEventResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterTestEmitTestEventResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestEmitTestEventResponseCallbackType>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterTestEmitTestEventResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterTestEmitTestEventResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterClusterTestEmitTestEventResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestEmitTestEventResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterTestEmitTestEventResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::Clusters::TestCluster::Commands::TestEmitTestEventResponse::DecodableType & data);
@@ -11488,15 +11582,13 @@
     : public MTRCallbackBridge<TestClusterClusterTestEmitTestFabricScopedEventResponseCallbackType>
 {
 public:
-    MTRTestClusterClusterTestEmitTestFabricScopedEventResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestEmitTestFabricScopedEventResponseCallbackType>(queue, handler, OnSuccessFn,
-                                                                                               keepAlive){};
+    MTRTestClusterClusterTestEmitTestFabricScopedEventResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterTestEmitTestFabricScopedEventResponseCallbackType>(queue, handler, OnSuccessFn){};
 
     MTRTestClusterClusterTestEmitTestFabricScopedEventResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterTestEmitTestFabricScopedEventResponseCallbackType>(queue, handler, action, OnSuccessFn,
-                                                                                               keepAlive){};
+                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterTestEmitTestFabricScopedEventResponseCallbackType>(queue, handler, action,
+                                                                                               OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -11507,14 +11599,12 @@
     : public MTRCallbackBridge<IdentifyClusterIdentifyEffectIdentifierAttributeCallback>
 {
 public:
-    MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<IdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<IdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Identify::IdentifyEffectIdentifier value);
 };
@@ -11526,11 +11616,13 @@
     MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(queue, handler, action, true),
+        MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11540,15 +11632,12 @@
     : public MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectIdentifierAttributeCallback>
 {
 public:
-    MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Identify::IdentifyEffectIdentifier> & value);
@@ -11561,11 +11650,13 @@
     MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11575,13 +11666,12 @@
     : public MTRCallbackBridge<IdentifyClusterIdentifyEffectVariantAttributeCallback>
 {
 public:
-    MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<IdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<IdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Identify::IdentifyEffectVariant value);
 };
@@ -11593,11 +11683,13 @@
     MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(queue, handler, action, true),
+        MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11607,14 +11699,12 @@
     : public MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectVariantAttributeCallback>
 {
 public:
-    MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Identify::IdentifyEffectVariant> & value);
@@ -11627,11 +11717,13 @@
     MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11641,13 +11733,12 @@
     : public MTRCallbackBridge<IdentifyClusterIdentifyIdentifyTypeAttributeCallback>
 {
 public:
-    MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<IdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<IdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<IdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Identify::IdentifyIdentifyType value);
 };
@@ -11659,11 +11750,13 @@
     MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11673,14 +11766,12 @@
     : public MTRCallbackBridge<NullableIdentifyClusterIdentifyIdentifyTypeAttributeCallback>
 {
 public:
-    MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NullableIdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableIdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableIdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<NullableIdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Identify::IdentifyIdentifyType> & value);
@@ -11693,11 +11784,13 @@
     MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11707,14 +11800,12 @@
     : public MTRCallbackBridge<OnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>
 {
 public:
-    MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<OnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<OnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OnOff::OnOffDelayedAllOffEffectVariant value);
 };
@@ -11726,11 +11817,13 @@
     MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(queue, handler, action, true),
+        MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11740,15 +11833,13 @@
     : public MTRCallbackBridge<NullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>
 {
 public:
-    MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<NullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<NullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -11762,11 +11853,13 @@
     MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11776,14 +11869,12 @@
     : public MTRCallbackBridge<OnOffClusterOnOffDyingLightEffectVariantAttributeCallback>
 {
 public:
-    MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<OnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<OnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OnOff::OnOffDyingLightEffectVariant value);
 };
@@ -11795,11 +11886,13 @@
     MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(queue, handler, action, true),
+        MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11809,15 +11902,12 @@
     : public MTRCallbackBridge<NullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallback>
 {
 public:
-    MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               bool keepAlive = false) :
-        MTRCallbackBridge<NullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                               MTRActionBlock action) :
+        MTRCallbackBridge<NullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffDyingLightEffectVariant> & value);
@@ -11830,11 +11920,13 @@
     MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11844,13 +11936,12 @@
     : public MTRCallbackBridge<OnOffClusterOnOffEffectIdentifierAttributeCallback>
 {
 public:
-    MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<OnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<OnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OnOff::OnOffEffectIdentifier value);
 };
@@ -11862,11 +11953,13 @@
     MTROnOffClusterOnOffEffectIdentifierAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(queue, handler, action, true),
+        MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11876,14 +11969,12 @@
     : public MTRCallbackBridge<NullableOnOffClusterOnOffEffectIdentifierAttributeCallback>
 {
 public:
-    MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<NullableOnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableOnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableOnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<NullableOnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffEffectIdentifier> & value);
@@ -11896,11 +11987,13 @@
     MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11910,13 +12003,12 @@
     : public MTRCallbackBridge<OnOffClusterOnOffStartUpOnOffAttributeCallback>
 {
 public:
-    MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<OnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<OnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<OnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OnOff::OnOffStartUpOnOff value);
 };
@@ -11928,11 +12020,13 @@
     MTROnOffClusterOnOffStartUpOnOffAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(queue, handler, action, true),
+        MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11942,13 +12036,12 @@
     : public MTRCallbackBridge<NullableOnOffClusterOnOffStartUpOnOffAttributeCallback>
 {
 public:
-    MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<NullableOnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableOnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableOnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<NullableOnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> & value);
@@ -11961,11 +12054,13 @@
     MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11974,12 +12069,11 @@
 class MTRLevelControlClusterMoveModeAttributeCallbackBridge : public MTRCallbackBridge<LevelControlClusterMoveModeAttributeCallback>
 {
 public:
-    MTRLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<LevelControlClusterMoveModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LevelControlClusterMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<LevelControlClusterMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<LevelControlClusterMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::LevelControl::MoveMode value);
 };
@@ -11991,11 +12085,13 @@
     MTRLevelControlClusterMoveModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLevelControlClusterMoveModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRLevelControlClusterMoveModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLevelControlClusterMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLevelControlClusterMoveModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12005,13 +12101,12 @@
     : public MTRCallbackBridge<NullableLevelControlClusterMoveModeAttributeCallback>
 {
 public:
-    MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<NullableLevelControlClusterMoveModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableLevelControlClusterMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableLevelControlClusterMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<NullableLevelControlClusterMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::LevelControl::MoveMode> & value);
@@ -12024,11 +12119,13 @@
     MTRNullableLevelControlClusterMoveModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12037,12 +12134,11 @@
 class MTRLevelControlClusterStepModeAttributeCallbackBridge : public MTRCallbackBridge<LevelControlClusterStepModeAttributeCallback>
 {
 public:
-    MTRLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<LevelControlClusterStepModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<LevelControlClusterStepModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<LevelControlClusterStepModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<LevelControlClusterStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::LevelControl::StepMode value);
 };
@@ -12054,11 +12150,13 @@
     MTRLevelControlClusterStepModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRLevelControlClusterStepModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRLevelControlClusterStepModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRLevelControlClusterStepModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRLevelControlClusterStepModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12068,13 +12166,12 @@
     : public MTRCallbackBridge<NullableLevelControlClusterStepModeAttributeCallback>
 {
 public:
-    MTRNullableLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<NullableLevelControlClusterStepModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableLevelControlClusterStepModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableLevelControlClusterStepModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<NullableLevelControlClusterStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::LevelControl::StepMode> & value);
@@ -12087,11 +12184,13 @@
     MTRNullableLevelControlClusterStepModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableLevelControlClusterStepModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableLevelControlClusterStepModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableLevelControlClusterStepModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableLevelControlClusterStepModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12101,13 +12200,11 @@
     : public MTRCallbackBridge<AccessControlClusterAuthModeAttributeCallback>
 {
 public:
-    MTRAccessControlClusterAuthModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlClusterAuthModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccessControlClusterAuthModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccessControlClusterAuthModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRAccessControlClusterAuthModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlClusterAuthModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRAccessControlClusterAuthModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<AccessControlClusterAuthModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::AccessControl::AuthMode value);
 };
@@ -12119,11 +12216,13 @@
     MTRAccessControlClusterAuthModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccessControlClusterAuthModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccessControlClusterAuthModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccessControlClusterAuthModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccessControlClusterAuthModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12133,13 +12232,12 @@
     : public MTRCallbackBridge<NullableAccessControlClusterAuthModeAttributeCallback>
 {
 public:
-    MTRNullableAccessControlClusterAuthModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullableAccessControlClusterAuthModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableAccessControlClusterAuthModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableAccessControlClusterAuthModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableAccessControlClusterAuthModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableAccessControlClusterAuthModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<NullableAccessControlClusterAuthModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::AccessControl::AuthMode> & value);
@@ -12152,11 +12250,13 @@
     MTRNullableAccessControlClusterAuthModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableAccessControlClusterAuthModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableAccessControlClusterAuthModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableAccessControlClusterAuthModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableAccessControlClusterAuthModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12166,13 +12266,12 @@
     : public MTRCallbackBridge<AccessControlClusterChangeTypeEnumAttributeCallback>
 {
 public:
-    MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<AccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::AccessControl::ChangeTypeEnum value);
 };
@@ -12184,11 +12283,13 @@
     MTRAccessControlClusterChangeTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12198,14 +12299,12 @@
     : public MTRCallbackBridge<NullableAccessControlClusterChangeTypeEnumAttributeCallback>
 {
 public:
-    MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<NullableAccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableAccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableAccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<NullableAccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::AccessControl::ChangeTypeEnum> & value);
@@ -12218,11 +12317,13 @@
     MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12232,13 +12333,12 @@
     : public MTRCallbackBridge<AccessControlClusterPrivilegeAttributeCallback>
 {
 public:
-    MTRAccessControlClusterPrivilegeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlClusterPrivilegeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAccessControlClusterPrivilegeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccessControlClusterPrivilegeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRAccessControlClusterPrivilegeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<AccessControlClusterPrivilegeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRAccessControlClusterPrivilegeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<AccessControlClusterPrivilegeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::AccessControl::Privilege value);
 };
@@ -12250,11 +12350,13 @@
     MTRAccessControlClusterPrivilegeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccessControlClusterPrivilegeAttributeCallbackBridge(queue, handler, action, true),
+        MTRAccessControlClusterPrivilegeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAccessControlClusterPrivilegeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccessControlClusterPrivilegeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12264,13 +12366,12 @@
     : public MTRCallbackBridge<NullableAccessControlClusterPrivilegeAttributeCallback>
 {
 public:
-    MTRNullableAccessControlClusterPrivilegeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<NullableAccessControlClusterPrivilegeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableAccessControlClusterPrivilegeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableAccessControlClusterPrivilegeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableAccessControlClusterPrivilegeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableAccessControlClusterPrivilegeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<NullableAccessControlClusterPrivilegeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::AccessControl::Privilege> & value);
@@ -12283,11 +12384,13 @@
     MTRNullableAccessControlClusterPrivilegeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableAccessControlClusterPrivilegeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableAccessControlClusterPrivilegeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableAccessControlClusterPrivilegeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableAccessControlClusterPrivilegeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12297,13 +12400,12 @@
     : public MTRCallbackBridge<ActionsClusterActionErrorEnumAttributeCallback>
 {
 public:
-    MTRActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ActionsClusterActionErrorEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ActionsClusterActionErrorEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ActionsClusterActionErrorEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<ActionsClusterActionErrorEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Actions::ActionErrorEnum value);
 };
@@ -12315,11 +12417,13 @@
     MTRActionsClusterActionErrorEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRActionsClusterActionErrorEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRActionsClusterActionErrorEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRActionsClusterActionErrorEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRActionsClusterActionErrorEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12329,13 +12433,12 @@
     : public MTRCallbackBridge<NullableActionsClusterActionErrorEnumAttributeCallback>
 {
 public:
-    MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<NullableActionsClusterActionErrorEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableActionsClusterActionErrorEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableActionsClusterActionErrorEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<NullableActionsClusterActionErrorEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::ActionErrorEnum> & value);
@@ -12348,11 +12451,13 @@
     MTRNullableActionsClusterActionErrorEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12362,13 +12467,12 @@
     : public MTRCallbackBridge<ActionsClusterActionStateEnumAttributeCallback>
 {
 public:
-    MTRActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ActionsClusterActionStateEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ActionsClusterActionStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ActionsClusterActionStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<ActionsClusterActionStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Actions::ActionStateEnum value);
 };
@@ -12380,11 +12484,13 @@
     MTRActionsClusterActionStateEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRActionsClusterActionStateEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRActionsClusterActionStateEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRActionsClusterActionStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRActionsClusterActionStateEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12394,13 +12500,12 @@
     : public MTRCallbackBridge<NullableActionsClusterActionStateEnumAttributeCallback>
 {
 public:
-    MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<NullableActionsClusterActionStateEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableActionsClusterActionStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableActionsClusterActionStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<NullableActionsClusterActionStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::ActionStateEnum> & value);
@@ -12413,11 +12518,13 @@
     MTRNullableActionsClusterActionStateEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12427,13 +12534,11 @@
     : public MTRCallbackBridge<ActionsClusterActionTypeEnumAttributeCallback>
 {
 public:
-    MTRActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ActionsClusterActionTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ActionsClusterActionTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ActionsClusterActionTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ActionsClusterActionTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Actions::ActionTypeEnum value);
 };
@@ -12445,11 +12550,13 @@
     MTRActionsClusterActionTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRActionsClusterActionTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRActionsClusterActionTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRActionsClusterActionTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRActionsClusterActionTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12459,13 +12566,12 @@
     : public MTRCallbackBridge<NullableActionsClusterActionTypeEnumAttributeCallback>
 {
 public:
-    MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullableActionsClusterActionTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableActionsClusterActionTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableActionsClusterActionTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<NullableActionsClusterActionTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::ActionTypeEnum> & value);
@@ -12478,11 +12584,13 @@
     MTRNullableActionsClusterActionTypeEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12492,13 +12600,12 @@
     : public MTRCallbackBridge<ActionsClusterEndpointListTypeEnumAttributeCallback>
 {
 public:
-    MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<ActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<ActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Actions::EndpointListTypeEnum value);
 };
@@ -12510,11 +12617,13 @@
     MTRActionsClusterEndpointListTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12524,14 +12633,12 @@
     : public MTRCallbackBridge<NullableActionsClusterEndpointListTypeEnumAttributeCallback>
 {
 public:
-    MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<NullableActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<NullableActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::EndpointListTypeEnum> & value);
@@ -12544,11 +12651,13 @@
     MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12558,15 +12667,14 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                 keepAlive){};
+    MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                   ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   MTRActionBlock action, bool keepAlive = false) :
+                                                                                   MTRActionBlock action) :
         MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, action,
-                                                                                                 OnSuccessFn, keepAlive){};
+                                                                                                 OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction value);
 };
@@ -12578,11 +12686,13 @@
     MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12593,17 +12703,15 @@
 {
 public:
     MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                           ResponseHandler handler,
-                                                                                           bool keepAlive = false) :
+                                                                                           ResponseHandler handler) :
         MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler,
-                                                                                                         OnSuccessFn, keepAlive){};
+                                                                                                         OnSuccessFn){};
 
     MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
-                                                                                           MTRActionBlock action,
-                                                                                           bool keepAlive = false) :
+                                                                                           MTRActionBlock action) :
         MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, action,
-                                                                                                         OnSuccessFn, keepAlive){};
+                                                                                                         OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -12617,11 +12725,13 @@
     MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12631,15 +12741,13 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol value);
 };
@@ -12651,11 +12759,13 @@
     MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12666,17 +12776,15 @@
 {
 public:
     MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                          ResponseHandler handler,
-                                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                        keepAlive){};
+                                                                                          ResponseHandler handler) :
+        MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler,
+                                                                                                        OnSuccessFn){};
 
     MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
-                                                                                          MTRActionBlock action,
-                                                                                          bool keepAlive = false) :
+                                                                                          MTRActionBlock action) :
         MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, action,
-                                                                                                        OnSuccessFn, keepAlive){};
+                                                                                                        OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -12690,11 +12798,13 @@
     MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12704,15 +12814,12 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                           keepAlive){};
+    MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                           keepAlive){};
+                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus value);
 };
@@ -12724,11 +12831,13 @@
     MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12739,16 +12848,14 @@
 {
 public:
     MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                     ResponseHandler handler,
-                                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                   keepAlive){};
+                                                                                     ResponseHandler handler) :
+        MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                     ResponseHandler handler, MTRActionBlock action,
-                                                                                     bool keepAlive = false) :
+                                                                                     ResponseHandler handler,
+                                                                                     MTRActionBlock action) :
         MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, action,
-                                                                                                   OnSuccessFn, keepAlive){};
+                                                                                                   OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -12762,11 +12869,13 @@
     MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12777,16 +12886,14 @@
 {
 public:
     MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                     ResponseHandler handler,
-                                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                   keepAlive){};
+                                                                                     ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                     ResponseHandler handler, MTRActionBlock action,
-                                                                                     bool keepAlive = false) :
+                                                                                     ResponseHandler handler,
+                                                                                     MTRActionBlock action) :
         MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, action,
-                                                                                                   OnSuccessFn, keepAlive){};
+                                                                                                   OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason value);
 };
@@ -12798,11 +12905,13 @@
     MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12813,17 +12922,15 @@
 {
 public:
     MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                             ResponseHandler handler,
-                                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(
-            queue, handler, OnSuccessFn, keepAlive){};
+                                                                                             ResponseHandler handler) :
+        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler,
+                                                                                                           OnSuccessFn){};
 
     MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
-                                                                                             MTRActionBlock action,
-                                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(
-            queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, action,
+                                                                                                           OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -12837,11 +12944,13 @@
     MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12851,15 +12960,14 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                 keepAlive){};
+    MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                   ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   MTRActionBlock action, bool keepAlive = false) :
+                                                                                   MTRActionBlock action) :
         MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, action,
-                                                                                                 OnSuccessFn, keepAlive){};
+                                                                                                 OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum value);
 };
@@ -12871,11 +12979,13 @@
     MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12886,17 +12996,15 @@
 {
 public:
     MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                           ResponseHandler handler,
-                                                                                           bool keepAlive = false) :
+                                                                                           ResponseHandler handler) :
         MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler,
-                                                                                                         OnSuccessFn, keepAlive){};
+                                                                                                         OnSuccessFn){};
 
     MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
-                                                                                           MTRActionBlock action,
-                                                                                           bool keepAlive = false) :
+                                                                                           MTRActionBlock action) :
         MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, action,
-                                                                                                         OnSuccessFn, keepAlive){};
+                                                                                                         OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -12910,11 +13018,13 @@
     MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12924,15 +13034,13 @@
     : public MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum value);
 };
@@ -12944,11 +13052,13 @@
     MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12959,17 +13069,15 @@
 {
 public:
     MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                          ResponseHandler handler,
-                                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                        keepAlive){};
+                                                                                          ResponseHandler handler) :
+        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler,
+                                                                                                        OnSuccessFn){};
 
     MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
-                                                                                          MTRActionBlock action,
-                                                                                          bool keepAlive = false) :
+                                                                                          MTRActionBlock action) :
         MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, action,
-                                                                                                        OnSuccessFn, keepAlive){};
+                                                                                                        OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -12983,11 +13091,13 @@
     MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -12997,14 +13107,12 @@
     : public MTRCallbackBridge<TimeFormatLocalizationClusterCalendarTypeAttributeCallback>
 {
 public:
-    MTRTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationClusterCalendarTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TimeFormatLocalizationClusterCalendarTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationClusterCalendarTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<TimeFormatLocalizationClusterCalendarTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::TimeFormatLocalization::CalendarType value);
 };
@@ -13016,11 +13124,13 @@
     MTRTimeFormatLocalizationClusterCalendarTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13030,15 +13140,13 @@
     : public MTRCallbackBridge<NullableTimeFormatLocalizationClusterCalendarTypeAttributeCallback>
 {
 public:
-    MTRNullableTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<NullableTimeFormatLocalizationClusterCalendarTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRNullableTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableTimeFormatLocalizationClusterCalendarTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableTimeFormatLocalizationClusterCalendarTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<NullableTimeFormatLocalizationClusterCalendarTypeAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -13052,11 +13160,13 @@
     MTRNullableTimeFormatLocalizationClusterCalendarTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableTimeFormatLocalizationClusterCalendarTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13066,14 +13176,12 @@
     : public MTRCallbackBridge<TimeFormatLocalizationClusterHourFormatAttributeCallback>
 {
 public:
-    MTRTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationClusterHourFormatAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TimeFormatLocalizationClusterHourFormatAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TimeFormatLocalizationClusterHourFormatAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<TimeFormatLocalizationClusterHourFormatAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::TimeFormatLocalization::HourFormat value);
 };
@@ -13085,11 +13193,13 @@
     MTRTimeFormatLocalizationClusterHourFormatAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge(queue, handler, action, true),
+        MTRTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13099,15 +13209,12 @@
     : public MTRCallbackBridge<NullableTimeFormatLocalizationClusterHourFormatAttributeCallback>
 {
 public:
-    MTRNullableTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<NullableTimeFormatLocalizationClusterHourFormatAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTRNullableTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableTimeFormatLocalizationClusterHourFormatAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableTimeFormatLocalizationClusterHourFormatAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<NullableTimeFormatLocalizationClusterHourFormatAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::TimeFormatLocalization::HourFormat> & value);
@@ -13120,11 +13227,13 @@
     MTRNullableTimeFormatLocalizationClusterHourFormatAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableTimeFormatLocalizationClusterHourFormatAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13134,13 +13243,12 @@
     : public MTRCallbackBridge<UnitLocalizationClusterTempUnitAttributeCallback>
 {
 public:
-    MTRUnitLocalizationClusterTempUnitAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<UnitLocalizationClusterTempUnitAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRUnitLocalizationClusterTempUnitAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<UnitLocalizationClusterTempUnitAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRUnitLocalizationClusterTempUnitAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<UnitLocalizationClusterTempUnitAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<UnitLocalizationClusterTempUnitAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::UnitLocalization::TempUnit value);
 };
@@ -13152,11 +13260,13 @@
     MTRUnitLocalizationClusterTempUnitAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRUnitLocalizationClusterTempUnitAttributeCallbackBridge(queue, handler, action, true),
+        MTRUnitLocalizationClusterTempUnitAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRUnitLocalizationClusterTempUnitAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRUnitLocalizationClusterTempUnitAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13166,14 +13276,12 @@
     : public MTRCallbackBridge<NullableUnitLocalizationClusterTempUnitAttributeCallback>
 {
 public:
-    MTRNullableUnitLocalizationClusterTempUnitAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableUnitLocalizationClusterTempUnitAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableUnitLocalizationClusterTempUnitAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableUnitLocalizationClusterTempUnitAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableUnitLocalizationClusterTempUnitAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableUnitLocalizationClusterTempUnitAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<NullableUnitLocalizationClusterTempUnitAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::UnitLocalization::TempUnit> & value);
@@ -13186,11 +13294,13 @@
     MTRNullableUnitLocalizationClusterTempUnitAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableUnitLocalizationClusterTempUnitAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableUnitLocalizationClusterTempUnitAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableUnitLocalizationClusterTempUnitAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableUnitLocalizationClusterTempUnitAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13200,13 +13310,12 @@
     : public MTRCallbackBridge<PowerSourceClusterBatChargeFaultAttributeCallback>
 {
 public:
-    MTRPowerSourceClusterBatChargeFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterBatChargeFaultAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceClusterBatChargeFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceClusterBatChargeFaultAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceClusterBatChargeFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterBatChargeFaultAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceClusterBatChargeFaultAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatChargeFault value);
 };
@@ -13218,11 +13327,13 @@
     MTRPowerSourceClusterBatChargeFaultAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceClusterBatChargeFaultAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceClusterBatChargeFaultAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceClusterBatChargeFaultAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceClusterBatChargeFaultAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13232,14 +13343,12 @@
     : public MTRCallbackBridge<NullablePowerSourceClusterBatChargeFaultAttributeCallback>
 {
 public:
-    MTRNullablePowerSourceClusterBatChargeFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterBatChargeFaultAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullablePowerSourceClusterBatChargeFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullablePowerSourceClusterBatChargeFaultAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullablePowerSourceClusterBatChargeFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterBatChargeFaultAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<NullablePowerSourceClusterBatChargeFaultAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatChargeFault> & value);
@@ -13252,11 +13361,13 @@
     MTRNullablePowerSourceClusterBatChargeFaultAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullablePowerSourceClusterBatChargeFaultAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullablePowerSourceClusterBatChargeFaultAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullablePowerSourceClusterBatChargeFaultAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullablePowerSourceClusterBatChargeFaultAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13266,13 +13377,12 @@
     : public MTRCallbackBridge<PowerSourceClusterBatChargeLevelAttributeCallback>
 {
 public:
-    MTRPowerSourceClusterBatChargeLevelAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterBatChargeLevelAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceClusterBatChargeLevelAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceClusterBatChargeLevelAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceClusterBatChargeLevelAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterBatChargeLevelAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceClusterBatChargeLevelAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatChargeLevel value);
 };
@@ -13284,11 +13394,13 @@
     MTRPowerSourceClusterBatChargeLevelAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceClusterBatChargeLevelAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceClusterBatChargeLevelAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceClusterBatChargeLevelAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceClusterBatChargeLevelAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13298,14 +13410,12 @@
     : public MTRCallbackBridge<NullablePowerSourceClusterBatChargeLevelAttributeCallback>
 {
 public:
-    MTRNullablePowerSourceClusterBatChargeLevelAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterBatChargeLevelAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullablePowerSourceClusterBatChargeLevelAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullablePowerSourceClusterBatChargeLevelAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullablePowerSourceClusterBatChargeLevelAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterBatChargeLevelAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<NullablePowerSourceClusterBatChargeLevelAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatChargeLevel> & value);
@@ -13318,11 +13428,13 @@
     MTRNullablePowerSourceClusterBatChargeLevelAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullablePowerSourceClusterBatChargeLevelAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullablePowerSourceClusterBatChargeLevelAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullablePowerSourceClusterBatChargeLevelAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullablePowerSourceClusterBatChargeLevelAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13332,13 +13444,12 @@
     : public MTRCallbackBridge<PowerSourceClusterBatChargeStateAttributeCallback>
 {
 public:
-    MTRPowerSourceClusterBatChargeStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterBatChargeStateAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceClusterBatChargeStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceClusterBatChargeStateAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceClusterBatChargeStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterBatChargeStateAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceClusterBatChargeStateAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatChargeState value);
 };
@@ -13350,11 +13461,13 @@
     MTRPowerSourceClusterBatChargeStateAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceClusterBatChargeStateAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceClusterBatChargeStateAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceClusterBatChargeStateAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceClusterBatChargeStateAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13364,14 +13477,12 @@
     : public MTRCallbackBridge<NullablePowerSourceClusterBatChargeStateAttributeCallback>
 {
 public:
-    MTRNullablePowerSourceClusterBatChargeStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterBatChargeStateAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullablePowerSourceClusterBatChargeStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullablePowerSourceClusterBatChargeStateAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullablePowerSourceClusterBatChargeStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterBatChargeStateAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<NullablePowerSourceClusterBatChargeStateAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatChargeState> & value);
@@ -13384,11 +13495,13 @@
     MTRNullablePowerSourceClusterBatChargeStateAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullablePowerSourceClusterBatChargeStateAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullablePowerSourceClusterBatChargeStateAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullablePowerSourceClusterBatChargeStateAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullablePowerSourceClusterBatChargeStateAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13397,12 +13510,11 @@
 class MTRPowerSourceClusterBatFaultAttributeCallbackBridge : public MTRCallbackBridge<PowerSourceClusterBatFaultAttributeCallback>
 {
 public:
-    MTRPowerSourceClusterBatFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterBatFaultAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceClusterBatFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceClusterBatFaultAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRPowerSourceClusterBatFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterBatFaultAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRPowerSourceClusterBatFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceClusterBatFaultAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatFault value);
 };
@@ -13413,11 +13525,13 @@
     MTRPowerSourceClusterBatFaultAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceClusterBatFaultAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceClusterBatFaultAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceClusterBatFaultAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceClusterBatFaultAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13427,13 +13541,12 @@
     : public MTRCallbackBridge<NullablePowerSourceClusterBatFaultAttributeCallback>
 {
 public:
-    MTRNullablePowerSourceClusterBatFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterBatFaultAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullablePowerSourceClusterBatFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullablePowerSourceClusterBatFaultAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullablePowerSourceClusterBatFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterBatFaultAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<NullablePowerSourceClusterBatFaultAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatFault> & value);
@@ -13446,11 +13559,13 @@
     MTRNullablePowerSourceClusterBatFaultAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullablePowerSourceClusterBatFaultAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullablePowerSourceClusterBatFaultAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullablePowerSourceClusterBatFaultAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullablePowerSourceClusterBatFaultAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13460,13 +13575,12 @@
     : public MTRCallbackBridge<PowerSourceClusterBatReplaceabilityAttributeCallback>
 {
 public:
-    MTRPowerSourceClusterBatReplaceabilityAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterBatReplaceabilityAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceClusterBatReplaceabilityAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceClusterBatReplaceabilityAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceClusterBatReplaceabilityAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterBatReplaceabilityAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceClusterBatReplaceabilityAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatReplaceability value);
 };
@@ -13478,11 +13592,13 @@
     MTRPowerSourceClusterBatReplaceabilityAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceClusterBatReplaceabilityAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceClusterBatReplaceabilityAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceClusterBatReplaceabilityAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceClusterBatReplaceabilityAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13492,14 +13608,12 @@
     : public MTRCallbackBridge<NullablePowerSourceClusterBatReplaceabilityAttributeCallback>
 {
 public:
-    MTRNullablePowerSourceClusterBatReplaceabilityAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterBatReplaceabilityAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullablePowerSourceClusterBatReplaceabilityAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullablePowerSourceClusterBatReplaceabilityAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullablePowerSourceClusterBatReplaceabilityAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterBatReplaceabilityAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<NullablePowerSourceClusterBatReplaceabilityAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatReplaceability> & value);
@@ -13512,11 +13626,13 @@
     MTRNullablePowerSourceClusterBatReplaceabilityAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullablePowerSourceClusterBatReplaceabilityAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullablePowerSourceClusterBatReplaceabilityAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullablePowerSourceClusterBatReplaceabilityAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullablePowerSourceClusterBatReplaceabilityAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13526,13 +13642,12 @@
     : public MTRCallbackBridge<PowerSourceClusterPowerSourceStatusAttributeCallback>
 {
 public:
-    MTRPowerSourceClusterPowerSourceStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterPowerSourceStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceClusterPowerSourceStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceClusterPowerSourceStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceClusterPowerSourceStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterPowerSourceStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceClusterPowerSourceStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::PowerSourceStatus value);
 };
@@ -13544,11 +13659,13 @@
     MTRPowerSourceClusterPowerSourceStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceClusterPowerSourceStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceClusterPowerSourceStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceClusterPowerSourceStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceClusterPowerSourceStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13558,14 +13675,12 @@
     : public MTRCallbackBridge<NullablePowerSourceClusterPowerSourceStatusAttributeCallback>
 {
 public:
-    MTRNullablePowerSourceClusterPowerSourceStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterPowerSourceStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullablePowerSourceClusterPowerSourceStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullablePowerSourceClusterPowerSourceStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullablePowerSourceClusterPowerSourceStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterPowerSourceStatusAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<NullablePowerSourceClusterPowerSourceStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::PowerSourceStatus> & value);
@@ -13578,11 +13693,13 @@
     MTRNullablePowerSourceClusterPowerSourceStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullablePowerSourceClusterPowerSourceStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullablePowerSourceClusterPowerSourceStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullablePowerSourceClusterPowerSourceStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullablePowerSourceClusterPowerSourceStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13592,13 +13709,12 @@
     : public MTRCallbackBridge<PowerSourceClusterWiredCurrentTypeAttributeCallback>
 {
 public:
-    MTRPowerSourceClusterWiredCurrentTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterWiredCurrentTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceClusterWiredCurrentTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceClusterWiredCurrentTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPowerSourceClusterWiredCurrentTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterWiredCurrentTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceClusterWiredCurrentTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::WiredCurrentType value);
 };
@@ -13610,11 +13726,13 @@
     MTRPowerSourceClusterWiredCurrentTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceClusterWiredCurrentTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceClusterWiredCurrentTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceClusterWiredCurrentTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceClusterWiredCurrentTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13624,14 +13742,12 @@
     : public MTRCallbackBridge<NullablePowerSourceClusterWiredCurrentTypeAttributeCallback>
 {
 public:
-    MTRNullablePowerSourceClusterWiredCurrentTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterWiredCurrentTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullablePowerSourceClusterWiredCurrentTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullablePowerSourceClusterWiredCurrentTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullablePowerSourceClusterWiredCurrentTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterWiredCurrentTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<NullablePowerSourceClusterWiredCurrentTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::WiredCurrentType> & value);
@@ -13644,11 +13760,13 @@
     MTRNullablePowerSourceClusterWiredCurrentTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullablePowerSourceClusterWiredCurrentTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullablePowerSourceClusterWiredCurrentTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullablePowerSourceClusterWiredCurrentTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullablePowerSourceClusterWiredCurrentTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13658,13 +13776,11 @@
     : public MTRCallbackBridge<PowerSourceClusterWiredFaultAttributeCallback>
 {
 public:
-    MTRPowerSourceClusterWiredFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterWiredFaultAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRPowerSourceClusterWiredFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PowerSourceClusterWiredFaultAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRPowerSourceClusterWiredFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<PowerSourceClusterWiredFaultAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRPowerSourceClusterWiredFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<PowerSourceClusterWiredFaultAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::WiredFault value);
 };
@@ -13676,11 +13792,13 @@
     MTRPowerSourceClusterWiredFaultAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPowerSourceClusterWiredFaultAttributeCallbackBridge(queue, handler, action, true),
+        MTRPowerSourceClusterWiredFaultAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPowerSourceClusterWiredFaultAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPowerSourceClusterWiredFaultAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13690,13 +13808,12 @@
     : public MTRCallbackBridge<NullablePowerSourceClusterWiredFaultAttributeCallback>
 {
 public:
-    MTRNullablePowerSourceClusterWiredFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterWiredFaultAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullablePowerSourceClusterWiredFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullablePowerSourceClusterWiredFaultAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullablePowerSourceClusterWiredFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullablePowerSourceClusterWiredFaultAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<NullablePowerSourceClusterWiredFaultAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::WiredFault> & value);
@@ -13709,11 +13826,13 @@
     MTRNullablePowerSourceClusterWiredFaultAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullablePowerSourceClusterWiredFaultAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullablePowerSourceClusterWiredFaultAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullablePowerSourceClusterWiredFaultAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullablePowerSourceClusterWiredFaultAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13723,14 +13842,12 @@
     : public MTRCallbackBridge<GeneralCommissioningClusterCommissioningErrorAttributeCallback>
 {
 public:
-    MTRGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningClusterCommissioningErrorAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralCommissioningClusterCommissioningErrorAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningClusterCommissioningErrorAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<GeneralCommissioningClusterCommissioningErrorAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::GeneralCommissioning::CommissioningError value);
 };
@@ -13742,11 +13859,13 @@
     MTRGeneralCommissioningClusterCommissioningErrorAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13756,15 +13875,14 @@
     : public MTRCallbackBridge<NullableGeneralCommissioningClusterCommissioningErrorAttributeCallback>
 {
 public:
-    MTRNullableGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralCommissioningClusterCommissioningErrorAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                  keepAlive){};
+    MTRNullableGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                    ResponseHandler handler) :
+        MTRCallbackBridge<NullableGeneralCommissioningClusterCommissioningErrorAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                    MTRActionBlock action, bool keepAlive = false) :
+                                                                                    MTRActionBlock action) :
         MTRCallbackBridge<NullableGeneralCommissioningClusterCommissioningErrorAttributeCallback>(queue, handler, action,
-                                                                                                  OnSuccessFn, keepAlive){};
+                                                                                                  OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -13778,11 +13896,13 @@
     MTRNullableGeneralCommissioningClusterCommissioningErrorAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableGeneralCommissioningClusterCommissioningErrorAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13792,15 +13912,13 @@
     : public MTRCallbackBridge<GeneralCommissioningClusterRegulatoryLocationTypeAttributeCallback>
 {
 public:
-    MTRGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningClusterRegulatoryLocationTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralCommissioningClusterRegulatoryLocationTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralCommissioningClusterRegulatoryLocationTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<GeneralCommissioningClusterRegulatoryLocationTypeAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::GeneralCommissioning::RegulatoryLocationType value);
 };
@@ -13812,11 +13930,13 @@
     MTRGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13827,17 +13947,15 @@
 {
 public:
     MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                        ResponseHandler handler,
-                                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                      keepAlive){};
+                                                                                        ResponseHandler handler) :
+        MTRCallbackBridge<NullableGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallback>(queue, handler,
+                                                                                                      OnSuccessFn){};
 
     MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
-                                                                                        MTRActionBlock action,
-                                                                                        bool keepAlive = false) :
+                                                                                        MTRActionBlock action) :
         MTRCallbackBridge<NullableGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallback>(queue, handler, action,
-                                                                                                      OnSuccessFn, keepAlive){};
+                                                                                                      OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -13851,11 +13969,13 @@
     MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13865,15 +13985,14 @@
     : public MTRCallbackBridge<NetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>
 {
 public:
-    MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                  keepAlive){};
+    MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                    ResponseHandler handler) :
+        MTRCallbackBridge<NetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                    MTRActionBlock action, bool keepAlive = false) :
+                                                                                    MTRActionBlock action) :
         MTRCallbackBridge<NetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>(queue, handler, action,
-                                                                                                  OnSuccessFn, keepAlive){};
+                                                                                                  OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatus value);
 };
@@ -13885,11 +14004,13 @@
     MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13900,17 +14021,15 @@
 {
 public:
     MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                            ResponseHandler handler,
-                                                                                            bool keepAlive = false) :
+                                                                                            ResponseHandler handler) :
         MTRCallbackBridge<NullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>(queue, handler,
-                                                                                                          OnSuccessFn, keepAlive){};
+                                                                                                          OnSuccessFn){};
 
     MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
-                                                                                            MTRActionBlock action,
-                                                                                            bool keepAlive = false) :
+                                                                                            MTRActionBlock action) :
         MTRCallbackBridge<NullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>(queue, handler, action,
-                                                                                                          OnSuccessFn, keepAlive){};
+                                                                                                          OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -13924,11 +14043,13 @@
     MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13938,13 +14059,12 @@
     : public MTRCallbackBridge<NetworkCommissioningClusterWiFiBandAttributeCallback>
 {
 public:
-    MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<NetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::NetworkCommissioning::WiFiBand value);
 };
@@ -13956,11 +14076,13 @@
     MTRNetworkCommissioningClusterWiFiBandAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(queue, handler, action, true),
+        MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -13970,14 +14092,12 @@
     : public MTRCallbackBridge<NullableNetworkCommissioningClusterWiFiBandAttributeCallback>
 {
 public:
-    MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NullableNetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableNetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableNetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<NullableNetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::NetworkCommissioning::WiFiBand> & value);
@@ -13990,11 +14110,13 @@
     MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14004,13 +14126,12 @@
     : public MTRCallbackBridge<DiagnosticLogsClusterLogsIntentAttributeCallback>
 {
 public:
-    MTRDiagnosticLogsClusterLogsIntentAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsClusterLogsIntentAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDiagnosticLogsClusterLogsIntentAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DiagnosticLogsClusterLogsIntentAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDiagnosticLogsClusterLogsIntentAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsClusterLogsIntentAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<DiagnosticLogsClusterLogsIntentAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DiagnosticLogs::LogsIntent value);
 };
@@ -14022,11 +14143,13 @@
     MTRDiagnosticLogsClusterLogsIntentAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDiagnosticLogsClusterLogsIntentAttributeCallbackBridge(queue, handler, action, true),
+        MTRDiagnosticLogsClusterLogsIntentAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDiagnosticLogsClusterLogsIntentAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDiagnosticLogsClusterLogsIntentAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14036,14 +14159,12 @@
     : public MTRCallbackBridge<NullableDiagnosticLogsClusterLogsIntentAttributeCallback>
 {
 public:
-    MTRNullableDiagnosticLogsClusterLogsIntentAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsIntentAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDiagnosticLogsClusterLogsIntentAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsIntentAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDiagnosticLogsClusterLogsIntentAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsIntentAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsIntentAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DiagnosticLogs::LogsIntent> & value);
@@ -14056,11 +14177,13 @@
     MTRNullableDiagnosticLogsClusterLogsIntentAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDiagnosticLogsClusterLogsIntentAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDiagnosticLogsClusterLogsIntentAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDiagnosticLogsClusterLogsIntentAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDiagnosticLogsClusterLogsIntentAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14070,13 +14193,12 @@
     : public MTRCallbackBridge<DiagnosticLogsClusterLogsStatusAttributeCallback>
 {
 public:
-    MTRDiagnosticLogsClusterLogsStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsClusterLogsStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDiagnosticLogsClusterLogsStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DiagnosticLogsClusterLogsStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDiagnosticLogsClusterLogsStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsClusterLogsStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<DiagnosticLogsClusterLogsStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DiagnosticLogs::LogsStatus value);
 };
@@ -14088,11 +14210,13 @@
     MTRDiagnosticLogsClusterLogsStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDiagnosticLogsClusterLogsStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRDiagnosticLogsClusterLogsStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDiagnosticLogsClusterLogsStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDiagnosticLogsClusterLogsStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14102,14 +14226,12 @@
     : public MTRCallbackBridge<NullableDiagnosticLogsClusterLogsStatusAttributeCallback>
 {
 public:
-    MTRNullableDiagnosticLogsClusterLogsStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDiagnosticLogsClusterLogsStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDiagnosticLogsClusterLogsStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsStatusAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DiagnosticLogs::LogsStatus> & value);
@@ -14122,11 +14244,13 @@
     MTRNullableDiagnosticLogsClusterLogsStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDiagnosticLogsClusterLogsStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDiagnosticLogsClusterLogsStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDiagnosticLogsClusterLogsStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDiagnosticLogsClusterLogsStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14136,14 +14260,12 @@
     : public MTRCallbackBridge<DiagnosticLogsClusterLogsTransferProtocolAttributeCallback>
 {
 public:
-    MTRDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsClusterLogsTransferProtocolAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DiagnosticLogsClusterLogsTransferProtocolAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DiagnosticLogsClusterLogsTransferProtocolAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<DiagnosticLogsClusterLogsTransferProtocolAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DiagnosticLogs::LogsTransferProtocol value);
 };
@@ -14155,11 +14277,13 @@
     MTRDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge(queue, handler, action, true),
+        MTRDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14169,15 +14293,13 @@
     : public MTRCallbackBridge<NullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallback>
 {
 public:
-    MTRNullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRNullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<NullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -14191,11 +14313,13 @@
     MTRNullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDiagnosticLogsClusterLogsTransferProtocolAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14205,14 +14329,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsClusterBootReasonTypeAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsClusterBootReasonTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsClusterBootReasonTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsClusterBootReasonTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsClusterBootReasonTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::GeneralDiagnostics::BootReasonType value);
 };
@@ -14224,11 +14346,13 @@
     MTRGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14238,15 +14362,12 @@
     : public MTRCallbackBridge<NullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallback>
 {
 public:
-    MTRNullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTRNullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<NullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::BootReasonType> & value);
@@ -14259,11 +14380,13 @@
     MTRNullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableGeneralDiagnosticsClusterBootReasonTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14273,14 +14396,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsClusterHardwareFaultTypeAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsClusterHardwareFaultTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsClusterHardwareFaultTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsClusterHardwareFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsClusterHardwareFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::GeneralDiagnostics::HardwareFaultType value);
 };
@@ -14292,11 +14413,13 @@
     MTRGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14306,15 +14429,13 @@
     : public MTRCallbackBridge<NullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallback>
 {
 public:
-    MTRNullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                               keepAlive){};
+    MTRNullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                               keepAlive){};
+                                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<NullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallback>(queue, handler, action,
+                                                                                               OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -14328,11 +14449,13 @@
     MTRNullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableGeneralDiagnosticsClusterHardwareFaultTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14342,14 +14465,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsClusterInterfaceTypeAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsClusterInterfaceTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsClusterInterfaceTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsClusterInterfaceTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsClusterInterfaceTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::GeneralDiagnostics::InterfaceType value);
 };
@@ -14361,11 +14482,13 @@
     MTRGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14375,15 +14498,12 @@
     : public MTRCallbackBridge<NullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallback>
 {
 public:
-    MTRNullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                           keepAlive){};
+    MTRNullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                           keepAlive){};
+                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<NullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::InterfaceType> & value);
@@ -14396,11 +14516,13 @@
     MTRNullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableGeneralDiagnosticsClusterInterfaceTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14410,14 +14532,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsClusterNetworkFaultTypeAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsClusterNetworkFaultTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsClusterNetworkFaultTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsClusterNetworkFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsClusterNetworkFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::GeneralDiagnostics::NetworkFaultType value);
 };
@@ -14429,11 +14549,13 @@
     MTRGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14443,15 +14565,13 @@
     : public MTRCallbackBridge<NullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallback>
 {
 public:
-    MTRNullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRNullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<NullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -14465,11 +14585,13 @@
     MTRNullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableGeneralDiagnosticsClusterNetworkFaultTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14479,14 +14601,12 @@
     : public MTRCallbackBridge<GeneralDiagnosticsClusterRadioFaultTypeAttributeCallback>
 {
 public:
-    MTRGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsClusterRadioFaultTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GeneralDiagnosticsClusterRadioFaultTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GeneralDiagnosticsClusterRadioFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<GeneralDiagnosticsClusterRadioFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::GeneralDiagnostics::RadioFaultType value);
 };
@@ -14498,11 +14618,13 @@
     MTRGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14512,15 +14634,12 @@
     : public MTRCallbackBridge<NullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallback>
 {
 public:
-    MTRNullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTRNullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<NullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::RadioFaultType> & value);
@@ -14533,11 +14652,13 @@
     MTRNullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableGeneralDiagnosticsClusterRadioFaultTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14547,14 +14668,12 @@
     : public MTRCallbackBridge<ThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>
 {
 public:
-    MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ThreadNetworkDiagnostics::NetworkFault value);
 };
@@ -14566,11 +14685,13 @@
     MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14580,15 +14701,13 @@
     : public MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>
 {
 public:
-    MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -14602,11 +14721,13 @@
     MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14616,14 +14737,12 @@
     : public MTRCallbackBridge<ThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>
 {
 public:
-    MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ThreadNetworkDiagnostics::RoutingRole value);
 };
@@ -14635,11 +14754,13 @@
     MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14649,15 +14770,13 @@
     : public MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>
 {
 public:
-    MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                               keepAlive){};
+    MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                               keepAlive){};
+                                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, action,
+                                                                                               OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -14671,11 +14790,13 @@
     MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14685,15 +14806,14 @@
     : public MTRCallbackBridge<ThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallback>
 {
 public:
-    MTRThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                  keepAlive){};
+    MTRThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                    ResponseHandler handler) :
+        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                    MTRActionBlock action, bool keepAlive = false) :
+                                                                                    MTRActionBlock action) :
         MTRCallbackBridge<ThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallback>(queue, handler, action,
-                                                                                                  OnSuccessFn, keepAlive){};
+                                                                                                  OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ThreadNetworkDiagnostics::ThreadConnectionStatus value);
 };
@@ -14705,11 +14825,13 @@
     MTRThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14720,17 +14842,15 @@
 {
 public:
     MTRNullableThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                            ResponseHandler handler,
-                                                                                            bool keepAlive = false) :
+                                                                                            ResponseHandler handler) :
         MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallback>(queue, handler,
-                                                                                                          OnSuccessFn, keepAlive){};
+                                                                                                          OnSuccessFn){};
 
     MTRNullableThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
-                                                                                            MTRActionBlock action,
-                                                                                            bool keepAlive = false) :
+                                                                                            MTRActionBlock action) :
         MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallback>(queue, handler, action,
-                                                                                                          OnSuccessFn, keepAlive){};
+                                                                                                          OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -14744,11 +14864,13 @@
     MTRNullableThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableThreadNetworkDiagnosticsClusterThreadConnectionStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14758,15 +14880,14 @@
     : public MTRCallbackBridge<WiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallback>
 {
 public:
-    MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                 keepAlive){};
+    MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                   ResponseHandler handler) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   MTRActionBlock action, bool keepAlive = false) :
+                                                                                   MTRActionBlock action) :
         MTRCallbackBridge<WiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallback>(queue, handler, action,
-                                                                                                 OnSuccessFn, keepAlive){};
+                                                                                                 OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::WiFiNetworkDiagnostics::AssociationFailureCause value);
 };
@@ -14778,11 +14899,13 @@
     MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge(queue, handler, action, true),
+        MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14793,17 +14916,15 @@
 {
 public:
     MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                           ResponseHandler handler,
-                                                                                           bool keepAlive = false) :
+                                                                                           ResponseHandler handler) :
         MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallback>(queue, handler,
-                                                                                                         OnSuccessFn, keepAlive){};
+                                                                                                         OnSuccessFn){};
 
     MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
-                                                                                           MTRActionBlock action,
-                                                                                           bool keepAlive = false) :
+                                                                                           MTRActionBlock action) :
         MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallback>(queue, handler, action,
-                                                                                                         OnSuccessFn, keepAlive){};
+                                                                                                         OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -14817,11 +14938,13 @@
     MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14831,14 +14954,12 @@
     : public MTRCallbackBridge<WiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallback>
 {
 public:
-    MTRWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::WiFiNetworkDiagnostics::SecurityType value);
 };
@@ -14850,11 +14971,13 @@
     MTRWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14864,15 +14987,13 @@
     : public MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallback>
 {
 public:
-    MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -14886,11 +15007,13 @@
     MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14900,15 +15023,13 @@
     : public MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallback>
 {
 public:
-    MTRWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::WiFiNetworkDiagnostics::WiFiConnectionStatus value);
 };
@@ -14920,11 +15041,13 @@
     MTRWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14935,17 +15058,15 @@
 {
 public:
     MTRNullableWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                        ResponseHandler handler,
-                                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                      keepAlive){};
+                                                                                        ResponseHandler handler) :
+        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallback>(queue, handler,
+                                                                                                      OnSuccessFn){};
 
     MTRNullableWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
-                                                                                        MTRActionBlock action,
-                                                                                        bool keepAlive = false) :
+                                                                                        MTRActionBlock action) :
         MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallback>(queue, handler, action,
-                                                                                                      OnSuccessFn, keepAlive){};
+                                                                                                      OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -14959,11 +15080,13 @@
     MTRNullableWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableWiFiNetworkDiagnosticsClusterWiFiConnectionStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -14973,14 +15096,12 @@
     : public MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallback>
 {
 public:
-    MTRWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::WiFiNetworkDiagnostics::WiFiVersionType value);
 };
@@ -14992,11 +15113,13 @@
     MTRWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15006,15 +15129,14 @@
     : public MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallback>
 {
 public:
-    MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                 keepAlive){};
+    MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                   ResponseHandler handler) :
+        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   MTRActionBlock action, bool keepAlive = false) :
+                                                                                   MTRActionBlock action) :
         MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallback>(queue, handler, action,
-                                                                                                 OnSuccessFn, keepAlive){};
+                                                                                                 OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -15028,11 +15150,13 @@
     MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15042,14 +15166,12 @@
     : public MTRCallbackBridge<EthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallback>
 {
 public:
-    MTREthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<EthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTREthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<EthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTREthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<EthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<EthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateType value);
 };
@@ -15061,11 +15183,13 @@
     MTREthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTREthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTREthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTREthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTREthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15075,15 +15199,14 @@
     : public MTRCallbackBridge<NullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallback>
 {
 public:
-    MTRNullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                 keepAlive){};
+    MTRNullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                   ResponseHandler handler) :
+        MTRCallbackBridge<NullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   MTRActionBlock action, bool keepAlive = false) :
+                                                                                   MTRActionBlock action) :
         MTRCallbackBridge<NullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallback>(queue, handler, action,
-                                                                                                 OnSuccessFn, keepAlive){};
+                                                                                                 OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -15097,11 +15220,13 @@
     MTRNullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableEthernetNetworkDiagnosticsClusterPHYRateTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15111,14 +15236,12 @@
     : public MTRCallbackBridge<TimeSynchronizationClusterGranularityEnumAttributeCallback>
 {
 public:
-    MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<TimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<TimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::TimeSynchronization::GranularityEnum value);
 };
@@ -15130,11 +15253,13 @@
     MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15144,15 +15269,13 @@
     : public MTRCallbackBridge<NullableTimeSynchronizationClusterGranularityEnumAttributeCallback>
 {
 public:
-    MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<NullableTimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableTimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableTimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<NullableTimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -15166,11 +15289,13 @@
     MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15180,14 +15305,12 @@
     : public MTRCallbackBridge<TimeSynchronizationClusterTimeSourceEnumAttributeCallback>
 {
 public:
-    MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<TimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<TimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::TimeSynchronization::TimeSourceEnum value);
 };
@@ -15199,11 +15322,13 @@
     MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15213,15 +15338,12 @@
     : public MTRCallbackBridge<NullableTimeSynchronizationClusterTimeSourceEnumAttributeCallback>
 {
 public:
-    MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               bool keepAlive = false) :
-        MTRCallbackBridge<NullableTimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                             keepAlive){};
+    MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableTimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableTimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                             keepAlive){};
+                                                                               MTRActionBlock action) :
+        MTRCallbackBridge<NullableTimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::TimeSynchronization::TimeSourceEnum> & value);
@@ -15234,11 +15356,13 @@
     MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15249,17 +15373,15 @@
 {
 public:
     MTRAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                         ResponseHandler handler,
-                                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<AdministratorCommissioningClusterCommissioningWindowStatusAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                       keepAlive){};
+                                                                                         ResponseHandler handler) :
+        MTRCallbackBridge<AdministratorCommissioningClusterCommissioningWindowStatusAttributeCallback>(queue, handler,
+                                                                                                       OnSuccessFn){};
 
     MTRAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
-                                                                                         MTRActionBlock action,
-                                                                                         bool keepAlive = false) :
+                                                                                         MTRActionBlock action) :
         MTRCallbackBridge<AdministratorCommissioningClusterCommissioningWindowStatusAttributeCallback>(queue, handler, action,
-                                                                                                       OnSuccessFn, keepAlive){};
+                                                                                                       OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatus value);
 };
@@ -15271,11 +15393,13 @@
     MTRAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15286,17 +15410,15 @@
 {
 public:
     MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                                 ResponseHandler handler,
-                                                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<NullableAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallback>(
-            queue, handler, OnSuccessFn, keepAlive){};
+                                                                                                 ResponseHandler handler) :
+        MTRCallbackBridge<NullableAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallback>(queue, handler,
+                                                                                                               OnSuccessFn){};
 
     MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
-                                                                                                 MTRActionBlock action,
-                                                                                                 bool keepAlive = false) :
+                                                                                                 MTRActionBlock action) :
         MTRCallbackBridge<NullableAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallback>(
-            queue, handler, action, OnSuccessFn, keepAlive){};
+            queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -15310,11 +15432,13 @@
     MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15324,14 +15448,12 @@
     : public MTRCallbackBridge<AdministratorCommissioningClusterStatusCodeAttributeCallback>
 {
 public:
-    MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<AdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<AdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::AdministratorCommissioning::StatusCode value);
 };
@@ -15343,11 +15465,13 @@
     MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(queue, handler, action, true),
+        MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15357,15 +15481,13 @@
     : public MTRCallbackBridge<NullableAdministratorCommissioningClusterStatusCodeAttributeCallback>
 {
 public:
-    MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<NullableAdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableAdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableAdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<NullableAdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -15379,11 +15501,13 @@
     MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15393,15 +15517,13 @@
     : public MTRCallbackBridge<OperationalCredentialsClusterOperationalCertStatusAttributeCallback>
 {
 public:
-    MTROperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsClusterOperationalCertStatusAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                               keepAlive){};
+    MTROperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OperationalCredentialsClusterOperationalCertStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTROperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<OperationalCredentialsClusterOperationalCertStatusAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                               keepAlive){};
+                                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<OperationalCredentialsClusterOperationalCertStatusAttributeCallback>(queue, handler, action,
+                                                                                               OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OperationalCredentials::OperationalCertStatus value);
 };
@@ -15413,11 +15535,13 @@
     MTROperationalCredentialsClusterOperationalCertStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTROperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTROperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15428,17 +15552,15 @@
 {
 public:
     MTRNullableOperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                         ResponseHandler handler,
-                                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<NullableOperationalCredentialsClusterOperationalCertStatusAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                       keepAlive){};
+                                                                                         ResponseHandler handler) :
+        MTRCallbackBridge<NullableOperationalCredentialsClusterOperationalCertStatusAttributeCallback>(queue, handler,
+                                                                                                       OnSuccessFn){};
 
     MTRNullableOperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
-                                                                                         MTRActionBlock action,
-                                                                                         bool keepAlive = false) :
+                                                                                         MTRActionBlock action) :
         MTRCallbackBridge<NullableOperationalCredentialsClusterOperationalCertStatusAttributeCallback>(queue, handler, action,
-                                                                                                       OnSuccessFn, keepAlive){};
+                                                                                                       OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -15452,11 +15574,13 @@
     MTRNullableOperationalCredentialsClusterOperationalCertStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableOperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableOperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOperationalCredentialsClusterOperationalCertStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15466,15 +15590,12 @@
     : public MTRCallbackBridge<GroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallback>
 {
 public:
-    MTRGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTRGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<GroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<GroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<GroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicy value);
 };
@@ -15486,11 +15607,13 @@
     MTRGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge(queue, handler, action, true),
+        MTRGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15501,17 +15624,14 @@
 {
 public:
     MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                      ResponseHandler handler,
-                                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                    keepAlive){};
+                                                                                      ResponseHandler handler) :
+        MTRCallbackBridge<NullableGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
-                                                                                      MTRActionBlock action,
-                                                                                      bool keepAlive = false) :
+                                                                                      MTRActionBlock action) :
         MTRCallbackBridge<NullableGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallback>(queue, handler, action,
-                                                                                                    OnSuccessFn, keepAlive){};
+                                                                                                    OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -15525,11 +15645,13 @@
     MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15538,12 +15660,11 @@
 class MTRDoorLockClusterDlAlarmCodeAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterDlAlarmCodeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlAlarmCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlAlarmCodeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlAlarmCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlAlarmCodeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterDlAlarmCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlAlarmCodeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlAlarmCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlAlarmCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlAlarmCode value);
 };
@@ -15554,11 +15675,13 @@
     MTRDoorLockClusterDlAlarmCodeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlAlarmCodeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlAlarmCodeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlAlarmCodeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlAlarmCodeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15568,13 +15691,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlAlarmCodeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlAlarmCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlAlarmCodeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlAlarmCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlAlarmCodeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlAlarmCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlAlarmCodeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlAlarmCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlAlarmCode> & value);
@@ -15587,11 +15709,13 @@
     MTRNullableDoorLockClusterDlAlarmCodeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlAlarmCodeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlAlarmCodeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlAlarmCodeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlAlarmCodeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15601,13 +15725,12 @@
     : public MTRCallbackBridge<DoorLockClusterDlCredentialRuleAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlCredentialRuleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlCredentialRuleAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlCredentialRuleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlCredentialRuleAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDlCredentialRuleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlCredentialRuleAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlCredentialRuleAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlCredentialRule value);
 };
@@ -15619,11 +15742,13 @@
     MTRDoorLockClusterDlCredentialRuleAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlCredentialRuleAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlCredentialRuleAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlCredentialRuleAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlCredentialRuleAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15633,14 +15758,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlCredentialRuleAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlCredentialRuleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlCredentialRuleAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlCredentialRuleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlCredentialRuleAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlCredentialRuleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlCredentialRuleAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlCredentialRuleAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlCredentialRule> & value);
@@ -15653,11 +15776,13 @@
     MTRNullableDoorLockClusterDlCredentialRuleAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlCredentialRuleAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlCredentialRuleAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlCredentialRuleAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlCredentialRuleAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15667,13 +15792,12 @@
     : public MTRCallbackBridge<DoorLockClusterDlCredentialTypeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlCredentialTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlCredentialTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlCredentialTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlCredentialTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDlCredentialTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlCredentialTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlCredentialTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlCredentialType value);
 };
@@ -15685,11 +15809,13 @@
     MTRDoorLockClusterDlCredentialTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlCredentialTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlCredentialTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlCredentialTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlCredentialTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15699,14 +15825,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlCredentialTypeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlCredentialTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlCredentialTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlCredentialTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlCredentialTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlCredentialTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlCredentialTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlCredentialTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlCredentialType> & value);
@@ -15719,11 +15843,13 @@
     MTRNullableDoorLockClusterDlCredentialTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlCredentialTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlCredentialTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlCredentialTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlCredentialTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15733,13 +15859,12 @@
     : public MTRCallbackBridge<DoorLockClusterDlDataOperationTypeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlDataOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlDataOperationTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlDataOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlDataOperationTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDlDataOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlDataOperationTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlDataOperationTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlDataOperationType value);
 };
@@ -15751,11 +15876,13 @@
     MTRDoorLockClusterDlDataOperationTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlDataOperationTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlDataOperationTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlDataOperationTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlDataOperationTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15765,14 +15892,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlDataOperationTypeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlDataOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlDataOperationTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlDataOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlDataOperationTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlDataOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlDataOperationTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlDataOperationTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlDataOperationType> & value);
@@ -15785,11 +15910,13 @@
     MTRNullableDoorLockClusterDlDataOperationTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlDataOperationTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlDataOperationTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlDataOperationTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlDataOperationTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15798,12 +15925,11 @@
 class MTRDoorLockClusterDlDoorStateAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterDlDoorStateAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlDoorStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlDoorStateAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlDoorStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlDoorStateAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterDlDoorStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlDoorStateAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlDoorStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlDoorStateAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlDoorState value);
 };
@@ -15814,11 +15940,13 @@
     MTRDoorLockClusterDlDoorStateAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlDoorStateAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlDoorStateAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlDoorStateAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlDoorStateAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15828,13 +15956,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlDoorStateAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlDoorStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlDoorStateAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlDoorStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlDoorStateAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlDoorStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlDoorStateAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlDoorStateAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlDoorState> & value);
@@ -15847,11 +15974,13 @@
     MTRNullableDoorLockClusterDlDoorStateAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlDoorStateAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlDoorStateAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlDoorStateAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlDoorStateAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15861,13 +15990,12 @@
     : public MTRCallbackBridge<DoorLockClusterDlLockDataTypeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlLockDataTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlLockDataTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlLockDataTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlLockDataTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterDlLockDataTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                            bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlLockDataTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlLockDataTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                            MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlLockDataTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlLockDataType value);
 };
@@ -15879,11 +16007,13 @@
     MTRDoorLockClusterDlLockDataTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlLockDataTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlLockDataTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlLockDataTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlLockDataTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15893,13 +16023,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlLockDataTypeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlLockDataTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlLockDataTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlLockDataTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlLockDataTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlLockDataTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlLockDataTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlLockDataTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockDataType> & value);
@@ -15912,11 +16041,13 @@
     MTRNullableDoorLockClusterDlLockDataTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlLockDataTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlLockDataTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlLockDataTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlLockDataTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15926,13 +16057,12 @@
     : public MTRCallbackBridge<DoorLockClusterDlLockOperationTypeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlLockOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlLockOperationTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlLockOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlLockOperationTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDlLockOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlLockOperationTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlLockOperationTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlLockOperationType value);
 };
@@ -15944,11 +16074,13 @@
     MTRDoorLockClusterDlLockOperationTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlLockOperationTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlLockOperationTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlLockOperationTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlLockOperationTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15958,14 +16090,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlLockOperationTypeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlLockOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlLockOperationTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlLockOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlLockOperationTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlLockOperationTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlLockOperationTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlLockOperationTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockOperationType> & value);
@@ -15978,11 +16108,13 @@
     MTRNullableDoorLockClusterDlLockOperationTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlLockOperationTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlLockOperationTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlLockOperationTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlLockOperationTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -15991,12 +16123,11 @@
 class MTRDoorLockClusterDlLockStateAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterDlLockStateAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlLockStateAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlLockStateAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                         bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlLockStateAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlLockStateAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlLockState value);
 };
@@ -16007,11 +16138,13 @@
     MTRDoorLockClusterDlLockStateAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlLockStateAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlLockStateAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlLockStateAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlLockStateAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16021,13 +16154,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlLockStateAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlLockStateAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlLockStateAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlLockStateAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlLockStateAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> & value);
@@ -16040,11 +16172,13 @@
     MTRNullableDoorLockClusterDlLockStateAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16053,12 +16187,11 @@
 class MTRDoorLockClusterDlLockTypeAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterDlLockTypeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlLockTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlLockTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                        bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlLockTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlLockTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlLockType value);
 };
@@ -16069,11 +16202,13 @@
     MTRDoorLockClusterDlLockTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlLockTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlLockTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlLockTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlLockTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16083,13 +16218,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlLockTypeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlLockTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlLockTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlLockTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlLockTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockType> & value);
@@ -16102,11 +16236,13 @@
     MTRNullableDoorLockClusterDlLockTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16116,13 +16252,12 @@
     : public MTRCallbackBridge<DoorLockClusterDlOperatingModeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlOperatingModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlOperatingModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlOperatingModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlOperatingModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterDlOperatingModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlOperatingModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlOperatingModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlOperatingModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlOperatingMode value);
 };
@@ -16134,11 +16269,13 @@
     MTRDoorLockClusterDlOperatingModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlOperatingModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlOperatingModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlOperatingModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlOperatingModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16148,14 +16285,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlOperatingModeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlOperatingModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlOperatingModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlOperatingModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlOperatingModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlOperatingModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlOperatingModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlOperatingModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlOperatingMode> & value);
@@ -16168,11 +16303,13 @@
     MTRNullableDoorLockClusterDlOperatingModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlOperatingModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlOperatingModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlOperatingModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlOperatingModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16182,13 +16319,12 @@
     : public MTRCallbackBridge<DoorLockClusterDlOperationErrorAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlOperationErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlOperationErrorAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlOperationErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlOperationErrorAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDlOperationErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlOperationErrorAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlOperationErrorAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlOperationError value);
 };
@@ -16200,11 +16336,13 @@
     MTRDoorLockClusterDlOperationErrorAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlOperationErrorAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlOperationErrorAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlOperationErrorAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlOperationErrorAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16214,14 +16352,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlOperationErrorAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlOperationErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlOperationErrorAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlOperationErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlOperationErrorAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlOperationErrorAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlOperationErrorAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlOperationErrorAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlOperationError> & value);
@@ -16234,11 +16370,13 @@
     MTRNullableDoorLockClusterDlOperationErrorAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlOperationErrorAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlOperationErrorAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlOperationErrorAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlOperationErrorAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16248,13 +16386,12 @@
     : public MTRCallbackBridge<DoorLockClusterDlOperationSourceAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlOperationSourceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlOperationSourceAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlOperationSourceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlOperationSourceAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDlOperationSourceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlOperationSourceAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlOperationSourceAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlOperationSource value);
 };
@@ -16266,11 +16403,13 @@
     MTRDoorLockClusterDlOperationSourceAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlOperationSourceAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlOperationSourceAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlOperationSourceAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlOperationSourceAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16280,14 +16419,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlOperationSourceAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlOperationSourceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlOperationSourceAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlOperationSourceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlOperationSourceAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlOperationSourceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlOperationSourceAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlOperationSourceAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlOperationSource> & value);
@@ -16300,11 +16437,13 @@
     MTRNullableDoorLockClusterDlOperationSourceAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlOperationSourceAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlOperationSourceAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlOperationSourceAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlOperationSourceAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16313,12 +16452,11 @@
 class MTRDoorLockClusterDlStatusAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterDlStatusAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                      bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlStatus value);
 };
@@ -16329,11 +16467,13 @@
     MTRDoorLockClusterDlStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16343,13 +16483,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlStatusAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlStatus> & value);
 };
@@ -16361,11 +16500,13 @@
     MTRNullableDoorLockClusterDlStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16374,12 +16515,11 @@
 class MTRDoorLockClusterDlUserStatusAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterDlUserStatusAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlUserStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlUserStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterDlUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                          bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlUserStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlUserStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlUserStatus value);
 };
@@ -16391,11 +16531,13 @@
     MTRDoorLockClusterDlUserStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlUserStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlUserStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlUserStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlUserStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16405,13 +16547,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlUserStatusAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlUserStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlUserStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlUserStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlUserStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlUserStatus> & value);
@@ -16424,11 +16565,13 @@
     MTRNullableDoorLockClusterDlUserStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlUserStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlUserStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlUserStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlUserStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16437,12 +16580,11 @@
 class MTRDoorLockClusterDlUserTypeAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterDlUserTypeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDlUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlUserTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDlUserTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRDoorLockClusterDlUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                        bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDlUserTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDlUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDlUserTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlUserType value);
 };
@@ -16453,11 +16595,13 @@
     MTRDoorLockClusterDlUserTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDlUserTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDlUserTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDlUserTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDlUserTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16467,13 +16611,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDlUserTypeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDlUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlUserTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDlUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDlUserTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDlUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDlUserTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDlUserTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlUserType> & value);
@@ -16486,11 +16629,13 @@
     MTRNullableDoorLockClusterDlUserTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDlUserTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDlUserTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDlUserTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDlUserTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16500,14 +16645,12 @@
     : public MTRCallbackBridge<DoorLockClusterDoorLockOperationEventCodeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DoorLockOperationEventCode value);
 };
@@ -16519,11 +16662,13 @@
     MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16533,15 +16678,13 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDoorLockOperationEventCodeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -16555,11 +16698,13 @@
     MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16569,14 +16714,12 @@
     : public MTRCallbackBridge<DoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DoorLockProgrammingEventCode value);
 };
@@ -16588,11 +16731,13 @@
     MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16602,15 +16747,13 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -16624,11 +16767,13 @@
     MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16638,14 +16783,12 @@
     : public MTRCallbackBridge<DoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DoorLockSetPinOrIdStatus value);
 };
@@ -16657,11 +16800,13 @@
     MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16671,15 +16816,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorLockSetPinOrIdStatus> & value);
@@ -16692,11 +16834,13 @@
     MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16706,13 +16850,12 @@
     : public MTRCallbackBridge<DoorLockClusterDoorLockUserStatusAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDoorLockUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDoorLockUserStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDoorLockUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDoorLockUserStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDoorLockUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDoorLockUserStatusAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDoorLockUserStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DoorLockUserStatus value);
 };
@@ -16724,11 +16867,13 @@
     MTRDoorLockClusterDoorLockUserStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDoorLockUserStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDoorLockUserStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDoorLockUserStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDoorLockUserStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16738,14 +16883,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDoorLockUserStatusAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDoorLockUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDoorLockUserStatusAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDoorLockUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDoorLockUserStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDoorLockUserStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                        MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDoorLockUserStatusAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                      keepAlive){};
+                                                                        MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDoorLockUserStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorLockUserStatus> & value);
@@ -16758,11 +16901,13 @@
     MTRNullableDoorLockClusterDoorLockUserStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDoorLockUserStatusAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDoorLockUserStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDoorLockUserStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDoorLockUserStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16772,13 +16917,12 @@
     : public MTRCallbackBridge<DoorLockClusterDoorLockUserTypeAttributeCallback>
 {
 public:
-    MTRDoorLockClusterDoorLockUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDoorLockUserTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRDoorLockClusterDoorLockUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<DoorLockClusterDoorLockUserTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRDoorLockClusterDoorLockUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<DoorLockClusterDoorLockUserTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<DoorLockClusterDoorLockUserTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DoorLockUserType value);
 };
@@ -16790,11 +16934,13 @@
     MTRDoorLockClusterDoorLockUserTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRDoorLockClusterDoorLockUserTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRDoorLockClusterDoorLockUserTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRDoorLockClusterDoorLockUserTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRDoorLockClusterDoorLockUserTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16804,14 +16950,12 @@
     : public MTRCallbackBridge<NullableDoorLockClusterDoorLockUserTypeAttributeCallback>
 {
 public:
-    MTRNullableDoorLockClusterDoorLockUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDoorLockUserTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableDoorLockClusterDoorLockUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableDoorLockClusterDoorLockUserTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableDoorLockClusterDoorLockUserTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableDoorLockClusterDoorLockUserTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<NullableDoorLockClusterDoorLockUserTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorLockUserType> & value);
@@ -16824,11 +16968,13 @@
     MTRNullableDoorLockClusterDoorLockUserTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableDoorLockClusterDoorLockUserTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableDoorLockClusterDoorLockUserTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableDoorLockClusterDoorLockUserTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableDoorLockClusterDoorLockUserTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16838,13 +16984,12 @@
     : public MTRCallbackBridge<WindowCoveringClusterEndProductTypeAttributeCallback>
 {
 public:
-    MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<WindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::WindowCovering::EndProductType value);
 };
@@ -16856,11 +17001,13 @@
     MTRWindowCoveringClusterEndProductTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16870,14 +17017,12 @@
     : public MTRCallbackBridge<NullableWindowCoveringClusterEndProductTypeAttributeCallback>
 {
 public:
-    MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NullableWindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableWindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableWindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<NullableWindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::WindowCovering::EndProductType> & value);
@@ -16890,11 +17035,13 @@
     MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16903,12 +17050,11 @@
 class MTRWindowCoveringClusterTypeAttributeCallbackBridge : public MTRCallbackBridge<WindowCoveringClusterTypeAttributeCallback>
 {
 public:
-    MTRWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringClusterTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WindowCoveringClusterTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                        bool keepAlive = false) :
-        MTRCallbackBridge<WindowCoveringClusterTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<WindowCoveringClusterTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::WindowCovering::Type value);
 };
@@ -16919,11 +17065,13 @@
     MTRWindowCoveringClusterTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWindowCoveringClusterTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRWindowCoveringClusterTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRWindowCoveringClusterTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWindowCoveringClusterTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16933,13 +17081,12 @@
     : public MTRCallbackBridge<NullableWindowCoveringClusterTypeAttributeCallback>
 {
 public:
-    MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                bool keepAlive = false) :
-        MTRCallbackBridge<NullableWindowCoveringClusterTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableWindowCoveringClusterTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableWindowCoveringClusterTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                MTRActionBlock action) :
+        MTRCallbackBridge<NullableWindowCoveringClusterTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::WindowCovering::Type> & value);
@@ -16952,11 +17099,13 @@
     MTRNullableWindowCoveringClusterTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -16966,15 +17115,13 @@
     : public MTRCallbackBridge<PumpConfigurationAndControlClusterPumpControlModeAttributeCallback>
 {
 public:
-    MTRPumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlClusterPumpControlModeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                              keepAlive){};
+    MTRPumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PumpConfigurationAndControlClusterPumpControlModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlClusterPumpControlModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                              keepAlive){};
+                                                                                MTRActionBlock action) :
+        MTRCallbackBridge<PumpConfigurationAndControlClusterPumpControlModeAttributeCallback>(queue, handler, action,
+                                                                                              OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::PumpConfigurationAndControl::PumpControlMode value);
 };
@@ -16986,11 +17133,13 @@
     MTRPumpConfigurationAndControlClusterPumpControlModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRPumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17001,17 +17150,15 @@
 {
 public:
     MTRNullablePumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                        ResponseHandler handler,
-                                                                                        bool keepAlive = false) :
-        MTRCallbackBridge<NullablePumpConfigurationAndControlClusterPumpControlModeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                      keepAlive){};
+                                                                                        ResponseHandler handler) :
+        MTRCallbackBridge<NullablePumpConfigurationAndControlClusterPumpControlModeAttributeCallback>(queue, handler,
+                                                                                                      OnSuccessFn){};
 
     MTRNullablePumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
-                                                                                        MTRActionBlock action,
-                                                                                        bool keepAlive = false) :
+                                                                                        MTRActionBlock action) :
         MTRCallbackBridge<NullablePumpConfigurationAndControlClusterPumpControlModeAttributeCallback>(queue, handler, action,
-                                                                                                      OnSuccessFn, keepAlive){};
+                                                                                                      OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -17025,11 +17172,13 @@
     MTRNullablePumpConfigurationAndControlClusterPumpControlModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullablePumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullablePumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullablePumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullablePumpConfigurationAndControlClusterPumpControlModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17039,15 +17188,13 @@
     : public MTRCallbackBridge<PumpConfigurationAndControlClusterPumpOperationModeAttributeCallback>
 {
 public:
-    MTRPumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlClusterPumpOperationModeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTRPumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<PumpConfigurationAndControlClusterPumpOperationModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRPumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<PumpConfigurationAndControlClusterPumpOperationModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<PumpConfigurationAndControlClusterPumpOperationModeAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::PumpConfigurationAndControl::PumpOperationMode value);
 };
@@ -17059,11 +17206,13 @@
     MTRPumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRPumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRPumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRPumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRPumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17074,17 +17223,15 @@
 {
 public:
     MTRNullablePumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                          ResponseHandler handler,
-                                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NullablePumpConfigurationAndControlClusterPumpOperationModeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                        keepAlive){};
+                                                                                          ResponseHandler handler) :
+        MTRCallbackBridge<NullablePumpConfigurationAndControlClusterPumpOperationModeAttributeCallback>(queue, handler,
+                                                                                                        OnSuccessFn){};
 
     MTRNullablePumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
-                                                                                          MTRActionBlock action,
-                                                                                          bool keepAlive = false) :
+                                                                                          MTRActionBlock action) :
         MTRCallbackBridge<NullablePumpConfigurationAndControlClusterPumpOperationModeAttributeCallback>(queue, handler, action,
-                                                                                                        OnSuccessFn, keepAlive){};
+                                                                                                        OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -17098,11 +17245,13 @@
     MTRNullablePumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullablePumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullablePumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullablePumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullablePumpConfigurationAndControlClusterPumpOperationModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17112,13 +17261,12 @@
     : public MTRCallbackBridge<ThermostatClusterSetpointAdjustModeAttributeCallback>
 {
 public:
-    MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<ThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Thermostat::SetpointAdjustMode value);
 };
@@ -17130,11 +17278,13 @@
     MTRThermostatClusterSetpointAdjustModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17144,14 +17294,12 @@
     : public MTRCallbackBridge<NullableThermostatClusterSetpointAdjustModeAttributeCallback>
 {
 public:
-    MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NullableThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<NullableThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::SetpointAdjustMode> & value);
@@ -17164,11 +17312,13 @@
     MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17178,14 +17328,12 @@
     : public MTRCallbackBridge<ThermostatClusterThermostatControlSequenceAttributeCallback>
 {
 public:
-    MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<ThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Thermostat::ThermostatControlSequence value);
 };
@@ -17197,11 +17345,13 @@
     MTRThermostatClusterThermostatControlSequenceAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge(queue, handler, action, true),
+        MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17211,15 +17361,13 @@
     : public MTRCallbackBridge<NullableThermostatClusterThermostatControlSequenceAttributeCallback>
 {
 public:
-    MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<NullableThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                               keepAlive){};
+    MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                               keepAlive){};
+                                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<NullableThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, action,
+                                                                                               OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -17233,11 +17381,13 @@
     MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17247,14 +17397,12 @@
     : public MTRCallbackBridge<ThermostatClusterThermostatRunningModeAttributeCallback>
 {
 public:
-    MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<ThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Thermostat::ThermostatRunningMode value);
 };
@@ -17266,11 +17414,13 @@
     MTRThermostatClusterThermostatRunningModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17280,15 +17430,12 @@
     : public MTRCallbackBridge<NullableThermostatClusterThermostatRunningModeAttributeCallback>
 {
 public:
-    MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             bool keepAlive = false) :
-        MTRCallbackBridge<NullableThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                           keepAlive){};
+    MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                             MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                           keepAlive){};
+                                                                             MTRActionBlock action) :
+        MTRCallbackBridge<NullableThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::ThermostatRunningMode> & value);
@@ -17301,11 +17448,13 @@
     MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17315,13 +17464,12 @@
     : public MTRCallbackBridge<ThermostatClusterThermostatSystemModeAttributeCallback>
 {
 public:
-    MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<ThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Thermostat::ThermostatSystemMode value);
 };
@@ -17333,11 +17481,13 @@
     MTRThermostatClusterThermostatSystemModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17347,14 +17497,12 @@
     : public MTRCallbackBridge<NullableThermostatClusterThermostatSystemModeAttributeCallback>
 {
 public:
-    MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<NullableThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<NullableThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::ThermostatSystemMode> & value);
@@ -17367,11 +17515,13 @@
     MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17381,13 +17531,12 @@
     : public MTRCallbackBridge<FanControlClusterFanModeSequenceTypeAttributeCallback>
 {
 public:
-    MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<FanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<FanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<FanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::FanControl::FanModeSequenceType value);
 };
@@ -17399,11 +17548,13 @@
     MTRFanControlClusterFanModeSequenceTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17413,14 +17564,12 @@
     : public MTRCallbackBridge<NullableFanControlClusterFanModeSequenceTypeAttributeCallback>
 {
 public:
-    MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<NullableFanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableFanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableFanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<NullableFanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::FanControl::FanModeSequenceType> & value);
@@ -17433,11 +17582,13 @@
     MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17447,13 +17598,11 @@
     : public MTRCallbackBridge<FanControlClusterFanModeTypeAttributeCallback>
 {
 public:
-    MTRFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<FanControlClusterFanModeTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FanControlClusterFanModeTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<FanControlClusterFanModeTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<FanControlClusterFanModeTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::FanControl::FanModeType value);
 };
@@ -17465,11 +17614,13 @@
     MTRFanControlClusterFanModeTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFanControlClusterFanModeTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRFanControlClusterFanModeTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFanControlClusterFanModeTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFanControlClusterFanModeTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17479,13 +17630,12 @@
     : public MTRCallbackBridge<NullableFanControlClusterFanModeTypeAttributeCallback>
 {
 public:
-    MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullableFanControlClusterFanModeTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableFanControlClusterFanModeTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableFanControlClusterFanModeTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<NullableFanControlClusterFanModeTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::FanControl::FanModeType> & value);
@@ -17498,11 +17648,13 @@
     MTRNullableFanControlClusterFanModeTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17512,13 +17664,12 @@
     : public MTRCallbackBridge<ColorControlClusterColorLoopActionAttributeCallback>
 {
 public:
-    MTRColorControlClusterColorLoopActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterColorLoopActionAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterColorLoopActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlClusterColorLoopActionAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRColorControlClusterColorLoopActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                 MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterColorLoopActionAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                 MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlClusterColorLoopActionAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::ColorLoopAction value);
 };
@@ -17530,11 +17681,13 @@
     MTRColorControlClusterColorLoopActionAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action,
                                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlClusterColorLoopActionAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlClusterColorLoopActionAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlClusterColorLoopActionAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlClusterColorLoopActionAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17544,14 +17697,12 @@
     : public MTRCallbackBridge<NullableColorControlClusterColorLoopActionAttributeCallback>
 {
 public:
-    MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterColorLoopActionAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableColorControlClusterColorLoopActionAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                         MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterColorLoopActionAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                       keepAlive){};
+                                                                         MTRActionBlock action) :
+        MTRCallbackBridge<NullableColorControlClusterColorLoopActionAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::ColorLoopAction> & value);
@@ -17564,11 +17715,13 @@
     MTRNullableColorControlClusterColorLoopActionAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17578,13 +17731,12 @@
     : public MTRCallbackBridge<ColorControlClusterColorLoopDirectionAttributeCallback>
 {
 public:
-    MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::ColorLoopDirection value);
 };
@@ -17596,11 +17748,13 @@
     MTRColorControlClusterColorLoopDirectionAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17610,14 +17764,12 @@
     : public MTRCallbackBridge<NullableColorControlClusterColorLoopDirectionAttributeCallback>
 {
 public:
-    MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<NullableColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::ColorLoopDirection> & value);
@@ -17630,11 +17782,13 @@
     MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17644,13 +17798,11 @@
     : public MTRCallbackBridge<ColorControlClusterColorModeAttributeCallback>
 {
 public:
-    MTRColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterColorModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlClusterColorModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterColorModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlClusterColorModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::ColorMode value);
 };
@@ -17662,11 +17814,13 @@
     MTRColorControlClusterColorModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlClusterColorModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlClusterColorModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlClusterColorModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlClusterColorModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17676,13 +17830,12 @@
     : public MTRCallbackBridge<NullableColorControlClusterColorModeAttributeCallback>
 {
 public:
-    MTRNullableColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterColorModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableColorControlClusterColorModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterColorModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<NullableColorControlClusterColorModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::ColorMode> & value);
@@ -17695,11 +17848,13 @@
     MTRNullableColorControlClusterColorModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableColorControlClusterColorModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableColorControlClusterColorModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableColorControlClusterColorModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableColorControlClusterColorModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17709,13 +17864,12 @@
     : public MTRCallbackBridge<ColorControlClusterHueDirectionAttributeCallback>
 {
 public:
-    MTRColorControlClusterHueDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterHueDirectionAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterHueDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlClusterHueDirectionAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRColorControlClusterHueDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterHueDirectionAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlClusterHueDirectionAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::HueDirection value);
 };
@@ -17727,11 +17881,13 @@
     MTRColorControlClusterHueDirectionAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlClusterHueDirectionAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlClusterHueDirectionAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlClusterHueDirectionAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlClusterHueDirectionAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17741,14 +17897,12 @@
     : public MTRCallbackBridge<NullableColorControlClusterHueDirectionAttributeCallback>
 {
 public:
-    MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterHueDirectionAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableColorControlClusterHueDirectionAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterHueDirectionAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<NullableColorControlClusterHueDirectionAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::HueDirection> & value);
@@ -17761,11 +17915,13 @@
     MTRNullableColorControlClusterHueDirectionAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17775,13 +17931,12 @@
     : public MTRCallbackBridge<ColorControlClusterHueMoveModeAttributeCallback>
 {
 public:
-    MTRColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterHueMoveModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlClusterHueMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterHueMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlClusterHueMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::HueMoveMode value);
 };
@@ -17793,11 +17948,13 @@
     MTRColorControlClusterHueMoveModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlClusterHueMoveModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlClusterHueMoveModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlClusterHueMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlClusterHueMoveModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17807,14 +17964,12 @@
     : public MTRCallbackBridge<NullableColorControlClusterHueMoveModeAttributeCallback>
 {
 public:
-    MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterHueMoveModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableColorControlClusterHueMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterHueMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<NullableColorControlClusterHueMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::HueMoveMode> & value);
@@ -17827,11 +17982,13 @@
     MTRNullableColorControlClusterHueMoveModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17841,13 +17998,12 @@
     : public MTRCallbackBridge<ColorControlClusterHueStepModeAttributeCallback>
 {
 public:
-    MTRColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterHueStepModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlClusterHueStepModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterHueStepModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlClusterHueStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::HueStepMode value);
 };
@@ -17859,11 +18015,13 @@
     MTRColorControlClusterHueStepModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlClusterHueStepModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlClusterHueStepModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlClusterHueStepModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlClusterHueStepModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17873,14 +18031,12 @@
     : public MTRCallbackBridge<NullableColorControlClusterHueStepModeAttributeCallback>
 {
 public:
-    MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterHueStepModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableColorControlClusterHueStepModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterHueStepModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<NullableColorControlClusterHueStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::HueStepMode> & value);
@@ -17893,11 +18049,13 @@
     MTRNullableColorControlClusterHueStepModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17907,13 +18065,12 @@
     : public MTRCallbackBridge<ColorControlClusterSaturationMoveModeAttributeCallback>
 {
 public:
-    MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::SaturationMoveMode value);
 };
@@ -17925,11 +18082,13 @@
     MTRColorControlClusterSaturationMoveModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17939,14 +18098,12 @@
     : public MTRCallbackBridge<NullableColorControlClusterSaturationMoveModeAttributeCallback>
 {
 public:
-    MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<NullableColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::SaturationMoveMode> & value);
@@ -17959,11 +18116,13 @@
     MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -17973,13 +18132,12 @@
     : public MTRCallbackBridge<ColorControlClusterSaturationStepModeAttributeCallback>
 {
 public:
-    MTRColorControlClusterSaturationStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRColorControlClusterSaturationStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRColorControlClusterSaturationStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<ColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::SaturationStepMode value);
 };
@@ -17991,11 +18149,13 @@
     MTRColorControlClusterSaturationStepModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRColorControlClusterSaturationStepModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRColorControlClusterSaturationStepModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRColorControlClusterSaturationStepModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRColorControlClusterSaturationStepModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18005,14 +18165,12 @@
     : public MTRCallbackBridge<NullableColorControlClusterSaturationStepModeAttributeCallback>
 {
 public:
-    MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<NullableColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::SaturationStepMode> & value);
@@ -18025,11 +18183,13 @@
     MTRNullableColorControlClusterSaturationStepModeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18039,14 +18199,12 @@
     : public MTRCallbackBridge<IlluminanceMeasurementClusterLightSensorTypeAttributeCallback>
 {
 public:
-    MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<IlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<IlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<IlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<IlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::IlluminanceMeasurement::LightSensorType value);
 };
@@ -18058,11 +18216,13 @@
     MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18072,15 +18232,14 @@
     : public MTRCallbackBridge<NullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallback>
 {
 public:
-    MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                 keepAlive){};
+    MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                   ResponseHandler handler) :
+        MTRCallbackBridge<NullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   MTRActionBlock action, bool keepAlive = false) :
+                                                                                   MTRActionBlock action) :
         MTRCallbackBridge<NullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, action,
-                                                                                                 OnSuccessFn, keepAlive){};
+                                                                                                 OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -18094,11 +18253,13 @@
     MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18108,13 +18269,12 @@
     : public MTRCallbackBridge<ChannelClusterChannelStatusEnumAttributeCallback>
 {
 public:
-    MTRChannelClusterChannelStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              bool keepAlive = false) :
-        MTRCallbackBridge<ChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRChannelClusterChannelStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRChannelClusterChannelStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                              MTRActionBlock action) :
+        MTRCallbackBridge<ChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Channel::ChannelStatusEnum value);
 };
@@ -18126,11 +18286,13 @@
     MTRChannelClusterChannelStatusEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRChannelClusterChannelStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRChannelClusterChannelStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRChannelClusterChannelStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRChannelClusterChannelStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18140,14 +18302,12 @@
     : public MTRCallbackBridge<NullableChannelClusterChannelStatusEnumAttributeCallback>
 {
 public:
-    MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<NullableChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Channel::ChannelStatusEnum> & value);
@@ -18160,11 +18320,13 @@
     MTRNullableChannelClusterChannelStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18174,13 +18336,12 @@
     : public MTRCallbackBridge<ChannelClusterLineupInfoTypeEnumAttributeCallback>
 {
 public:
-    MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<ChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<ChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::Channel::LineupInfoTypeEnum value);
 };
@@ -18192,11 +18353,13 @@
     MTRChannelClusterLineupInfoTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18206,14 +18369,12 @@
     : public MTRCallbackBridge<NullableChannelClusterLineupInfoTypeEnumAttributeCallback>
 {
 public:
-    MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<NullableChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<NullableChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::Channel::LineupInfoTypeEnum> & value);
@@ -18226,11 +18387,13 @@
     MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18240,15 +18403,12 @@
     : public MTRCallbackBridge<TargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>
 {
 public:
-    MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<TargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<TargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::TargetNavigator::TargetNavigatorStatusEnum value);
 };
@@ -18260,11 +18420,13 @@
     MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18275,17 +18437,14 @@
 {
 public:
     MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                      ResponseHandler handler,
-                                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<NullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                    keepAlive){};
+                                                                                      ResponseHandler handler) :
+        MTRCallbackBridge<NullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
-                                                                                      MTRActionBlock action,
-                                                                                      bool keepAlive = false) :
+                                                                                      MTRActionBlock action) :
         MTRCallbackBridge<NullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, action,
-                                                                                                    OnSuccessFn, keepAlive){};
+                                                                                                    OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -18299,11 +18458,13 @@
     MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18313,14 +18474,12 @@
     : public MTRCallbackBridge<MediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>
 {
 public:
-    MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<MediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::MediaPlayback::MediaPlaybackStatusEnum value);
 };
@@ -18332,11 +18491,13 @@
     MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18346,15 +18507,13 @@
     : public MTRCallbackBridge<NullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>
 {
 public:
-    MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<NullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                keepAlive){};
+    MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                                keepAlive){};
+                                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<NullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, action,
+                                                                                                OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -18368,11 +18527,13 @@
     MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18382,13 +18543,12 @@
     : public MTRCallbackBridge<MediaPlaybackClusterPlaybackStateEnumAttributeCallback>
 {
 public:
-    MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                    MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<MediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                    MTRActionBlock action) :
+        MTRCallbackBridge<MediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::MediaPlayback::PlaybackStateEnum value);
 };
@@ -18400,11 +18560,13 @@
     MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18414,14 +18576,12 @@
     : public MTRCallbackBridge<NullableMediaPlaybackClusterPlaybackStateEnumAttributeCallback>
 {
 public:
-    MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<NullableMediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableMediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableMediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<NullableMediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::PlaybackStateEnum> & value);
@@ -18434,11 +18594,13 @@
     MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18448,13 +18610,12 @@
     : public MTRCallbackBridge<MediaInputClusterInputTypeEnumAttributeCallback>
 {
 public:
-    MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<MediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<MediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<MediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<MediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::MediaInput::InputTypeEnum value);
 };
@@ -18466,11 +18627,13 @@
     MTRMediaInputClusterInputTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18480,14 +18643,12 @@
     : public MTRCallbackBridge<NullableMediaInputClusterInputTypeEnumAttributeCallback>
 {
 public:
-    MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<NullableMediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableMediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableMediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<NullableMediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::MediaInput::InputTypeEnum> & value);
@@ -18500,11 +18661,13 @@
     MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18514,13 +18677,11 @@
     : public MTRCallbackBridge<KeypadInputClusterCecKeyCodeAttributeCallback>
 {
 public:
-    MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<KeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<KeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::KeypadInput::CecKeyCode value);
 };
@@ -18532,11 +18693,13 @@
     MTRKeypadInputClusterCecKeyCodeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge(queue, handler, action, true),
+        MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18546,13 +18709,12 @@
     : public MTRCallbackBridge<NullableKeypadInputClusterCecKeyCodeAttributeCallback>
 {
 public:
-    MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullableKeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableKeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableKeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<NullableKeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::KeypadInput::CecKeyCode> & value);
@@ -18565,11 +18727,13 @@
     MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18579,14 +18743,12 @@
     : public MTRCallbackBridge<KeypadInputClusterKeypadInputStatusEnumAttributeCallback>
 {
 public:
-    MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<KeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                      MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<KeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                    keepAlive){};
+                                                                      MTRActionBlock action) :
+        MTRCallbackBridge<KeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::KeypadInput::KeypadInputStatusEnum value);
 };
@@ -18598,11 +18760,13 @@
     MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18612,15 +18776,12 @@
     : public MTRCallbackBridge<NullableKeypadInputClusterKeypadInputStatusEnumAttributeCallback>
 {
 public:
-    MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<NullableKeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                            keepAlive){};
+    MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableKeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                              MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableKeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                            keepAlive){};
+                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<NullableKeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::KeypadInput::KeypadInputStatusEnum> & value);
@@ -18633,11 +18794,13 @@
     MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18647,14 +18810,12 @@
     : public MTRCallbackBridge<ContentLauncherClusterContentLaunchStatusEnumAttributeCallback>
 {
 public:
-    MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                            MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                          keepAlive){};
+                                                                            MTRActionBlock action) :
+        MTRCallbackBridge<ContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ContentLauncher::ContentLaunchStatusEnum value);
 };
@@ -18666,11 +18827,13 @@
     MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18680,15 +18843,14 @@
     : public MTRCallbackBridge<NullableContentLauncherClusterContentLaunchStatusEnumAttributeCallback>
 {
 public:
-    MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                    bool keepAlive = false) :
-        MTRCallbackBridge<NullableContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                  keepAlive){};
+    MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                    ResponseHandler handler) :
+        MTRCallbackBridge<NullableContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                    MTRActionBlock action, bool keepAlive = false) :
+                                                                                    MTRActionBlock action) :
         MTRCallbackBridge<NullableContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, action,
-                                                                                                  OnSuccessFn, keepAlive){};
+                                                                                                  OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -18702,11 +18864,13 @@
     MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18716,13 +18880,12 @@
     : public MTRCallbackBridge<ContentLauncherClusterMetricTypeEnumAttributeCallback>
 {
 public:
-    MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<ContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ContentLauncher::MetricTypeEnum value);
 };
@@ -18734,11 +18897,13 @@
     MTRContentLauncherClusterMetricTypeEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18748,14 +18913,12 @@
     : public MTRCallbackBridge<NullableContentLauncherClusterMetricTypeEnumAttributeCallback>
 {
 public:
-    MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<NullableContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<NullableContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::ContentLauncher::MetricTypeEnum> & value);
@@ -18768,11 +18931,13 @@
     MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18782,13 +18947,12 @@
     : public MTRCallbackBridge<ContentLauncherClusterParameterEnumAttributeCallback>
 {
 public:
-    MTRContentLauncherClusterParameterEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRContentLauncherClusterParameterEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRContentLauncherClusterParameterEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                  MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                  MTRActionBlock action) :
+        MTRCallbackBridge<ContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ContentLauncher::ParameterEnum value);
 };
@@ -18800,11 +18964,13 @@
     MTRContentLauncherClusterParameterEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRContentLauncherClusterParameterEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRContentLauncherClusterParameterEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRContentLauncherClusterParameterEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRContentLauncherClusterParameterEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18814,14 +18980,12 @@
     : public MTRCallbackBridge<NullableContentLauncherClusterParameterEnumAttributeCallback>
 {
 public:
-    MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          bool keepAlive = false) :
-        MTRCallbackBridge<NullableContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                          MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                        keepAlive){};
+                                                                          MTRActionBlock action) :
+        MTRCallbackBridge<NullableContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::ContentLauncher::ParameterEnum> & value);
@@ -18834,11 +18998,13 @@
     MTRNullableContentLauncherClusterParameterEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18848,13 +19014,12 @@
     : public MTRCallbackBridge<AudioOutputClusterOutputTypeEnumAttributeCallback>
 {
 public:
-    MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               bool keepAlive = false) :
-        MTRCallbackBridge<AudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                               MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<AudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                               MTRActionBlock action) :
+        MTRCallbackBridge<AudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::AudioOutput::OutputTypeEnum value);
 };
@@ -18866,11 +19031,13 @@
     MTRAudioOutputClusterOutputTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18880,14 +19047,12 @@
     : public MTRCallbackBridge<NullableAudioOutputClusterOutputTypeEnumAttributeCallback>
 {
 public:
-    MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       bool keepAlive = false) :
-        MTRCallbackBridge<NullableAudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableAudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                       MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableAudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                     keepAlive){};
+                                                                       MTRActionBlock action) :
+        MTRCallbackBridge<NullableAudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::AudioOutput::OutputTypeEnum> & value);
@@ -18900,11 +19065,13 @@
     MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18915,17 +19082,14 @@
 {
 public:
     MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                      ResponseHandler handler,
-                                                                                      bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                    keepAlive){};
+                                                                                      ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
-                                                                                      MTRActionBlock action,
-                                                                                      bool keepAlive = false) :
+                                                                                      MTRActionBlock action) :
         MTRCallbackBridge<ApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(queue, handler, action,
-                                                                                                    OnSuccessFn, keepAlive){};
+                                                                                                    OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ApplicationLauncher::ApplicationLauncherStatusEnum value);
 };
@@ -18937,11 +19101,13 @@
     MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18952,17 +19118,15 @@
 {
 public:
     MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
-                                                                                              ResponseHandler handler,
-                                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<NullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(
-            queue, handler, OnSuccessFn, keepAlive){};
+                                                                                              ResponseHandler handler) :
+        MTRCallbackBridge<NullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(queue, handler,
+                                                                                                            OnSuccessFn){};
 
     MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
-                                                                                              MTRActionBlock action,
-                                                                                              bool keepAlive = false) :
-        MTRCallbackBridge<NullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(
-            queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                                              MTRActionBlock action) :
+        MTRCallbackBridge<NullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(queue, handler, action,
+                                                                                                            OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -18976,11 +19140,13 @@
     MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -18990,14 +19156,12 @@
     : public MTRCallbackBridge<ApplicationBasicClusterApplicationStatusEnumAttributeCallback>
 {
 public:
-    MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<ApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                           MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<ApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                         keepAlive){};
+                                                                           MTRActionBlock action) :
+        MTRCallbackBridge<ApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum value);
 };
@@ -19009,11 +19173,13 @@
     MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -19023,15 +19189,14 @@
     : public MTRCallbackBridge<NullableApplicationBasicClusterApplicationStatusEnumAttributeCallback>
 {
 public:
-    MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullableApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, OnSuccessFn,
-                                                                                                 keepAlive){};
+    MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
+                                                                                   ResponseHandler handler) :
+        MTRCallbackBridge<NullableApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                                   MTRActionBlock action, bool keepAlive = false) :
+                                                                                   MTRActionBlock action) :
         MTRCallbackBridge<NullableApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, action,
-                                                                                                 OnSuccessFn, keepAlive){};
+                                                                                                 OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -19045,11 +19210,13 @@
     MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -19059,13 +19226,11 @@
     : public MTRCallbackBridge<TestClusterClusterSimpleEnumAttributeCallback>
 {
 public:
-    MTRTestClusterClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterSimpleEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<TestClusterClusterSimpleEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRTestClusterClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                           bool keepAlive = false) :
-        MTRCallbackBridge<TestClusterClusterSimpleEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRTestClusterClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<TestClusterClusterSimpleEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::TestCluster::SimpleEnum value);
 };
@@ -19077,11 +19242,13 @@
     MTRTestClusterClusterSimpleEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRTestClusterClusterSimpleEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRTestClusterClusterSimpleEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRTestClusterClusterSimpleEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRTestClusterClusterSimpleEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -19091,13 +19258,12 @@
     : public MTRCallbackBridge<NullableTestClusterClusterSimpleEnumAttributeCallback>
 {
 public:
-    MTRNullableTestClusterClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   bool keepAlive = false) :
-        MTRCallbackBridge<NullableTestClusterClusterSimpleEnumAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableTestClusterClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableTestClusterClusterSimpleEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableTestClusterClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                   MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableTestClusterClusterSimpleEnumAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+                                                                   MTRActionBlock action) :
+        MTRCallbackBridge<NullableTestClusterClusterSimpleEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::TestCluster::SimpleEnum> & value);
@@ -19110,11 +19276,13 @@
     MTRNullableTestClusterClusterSimpleEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableTestClusterClusterSimpleEnumAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableTestClusterClusterSimpleEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableTestClusterClusterSimpleEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableTestClusterClusterSimpleEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -19124,13 +19292,12 @@
     : public MTRCallbackBridge<FaultInjectionClusterFaultTypeAttributeCallback>
 {
 public:
-    MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<FaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<FaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
-                                                             bool keepAlive = false) :
-        MTRCallbackBridge<FaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn, keepAlive){};
+    MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+                                                             MTRActionBlock action) :
+        MTRCallbackBridge<FaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::FaultInjection::FaultType value);
 };
@@ -19142,11 +19309,13 @@
     MTRFaultInjectionClusterFaultTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -19156,14 +19325,12 @@
     : public MTRCallbackBridge<NullableFaultInjectionClusterFaultTypeAttributeCallback>
 {
 public:
-    MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     bool keepAlive = false) :
-        MTRCallbackBridge<NullableFaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, OnSuccessFn, keepAlive){};
+    MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<NullableFaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, OnSuccessFn){};
 
     MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
-                                                                     MTRActionBlock action, bool keepAlive = false) :
-        MTRCallbackBridge<NullableFaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn,
-                                                                                   keepAlive){};
+                                                                     MTRActionBlock action) :
+        MTRCallbackBridge<NullableFaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
                             const chip::app::DataModel::Nullable<chip::app::Clusters::FaultInjection::FaultType> & value);
@@ -19176,11 +19343,13 @@
     MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge(queue, handler, action, true),
+        MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     static void OnSubscriptionEstablished(void * context);
+    using MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
