Remove RemovedOn attribute from ECOINFO cluster (#34988)

* Remove RemovedOn attribute from ECOINFO cluster

* Restyled by autopep8

* Remove artifact that were only initially used to debug script locally

* Move attr IDs after RemovedOn removal

* Empty-Commit

---------

Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/examples/fabric-bridge-app/fabric-bridge-common/src/BridgedDeviceManager.cpp b/examples/fabric-bridge-app/fabric-bridge-common/src/BridgedDeviceManager.cpp
index 8db44c3..5caa445 100644
--- a/examples/fabric-bridge-app/fabric-bridge-common/src/BridgedDeviceManager.cpp
+++ b/examples/fabric-bridge-app/fabric-bridge-common/src/BridgedDeviceManager.cpp
@@ -116,7 +116,6 @@
 
 // Declare Ecosystem Information cluster attributes
 DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(ecosystemInformationBasicAttrs)
-DECLARE_DYNAMIC_ATTRIBUTE(EcosystemInformation::Attributes::RemovedOn::Id, EPOCH_US, kNodeLabelSize, ATTRIBUTE_MASK_NULLABLE),
     DECLARE_DYNAMIC_ATTRIBUTE(EcosystemInformation::Attributes::DeviceDirectory::Id, ARRAY, kDescriptorAttributeArraySize, 0),
     DECLARE_DYNAMIC_ATTRIBUTE(EcosystemInformation::Attributes::LocationDirectory::Id, ARRAY, kDescriptorAttributeArraySize, 0),
     DECLARE_DYNAMIC_ATTRIBUTE_LIST_END();
diff --git a/src/app/clusters/ecosystem-information-server/ecosystem-information-server.cpp b/src/app/clusters/ecosystem-information-server/ecosystem-information-server.cpp
index 2ce8239..4af2adc 100644
--- a/src/app/clusters/ecosystem-information-server/ecosystem-information-server.cpp
+++ b/src/app/clusters/ecosystem-information-server/ecosystem-information-server.cpp
@@ -287,21 +287,10 @@
     return CHIP_NO_ERROR;
 }
 
-CHIP_ERROR EcosystemInformationServer::RemoveDevice(EndpointId aEndpoint, uint64_t aEpochUs)
-{
-    auto it = mDevicesMap.find(aEndpoint);
-    VerifyOrReturnError((it != mDevicesMap.end()), CHIP_ERROR_INVALID_ARGUMENT);
-    auto & deviceInfo = it->second;
-    deviceInfo.mRemovedOn.SetValue(aEpochUs);
-    return CHIP_NO_ERROR;
-}
-
 CHIP_ERROR EcosystemInformationServer::ReadAttribute(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder)
 {
     switch (aPath.mAttributeId)
     {
-    case Attributes::RemovedOn::Id:
-        return EncodeRemovedOnAttribute(aPath.mEndpointId, aEncoder);
     case Attributes::DeviceDirectory::Id:
         return EncodeDeviceDirectoryAttribute(aPath.mEndpointId, aEncoder);
     case Attributes::LocationDirectory::Id:
@@ -320,28 +309,6 @@
     return CHIP_NO_ERROR;
 }
 
-CHIP_ERROR EcosystemInformationServer::EncodeRemovedOnAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder)
-{
-    auto it = mDevicesMap.find(aEndpoint);
-    if (it == mDevicesMap.end())
-    {
-        // We are always going to be given a valid endpoint. If the endpoint
-        // doesn't exist in our map that indicate that the cluster was not
-        // added on this endpoint, hence UnsupportedCluster.
-        return CHIP_IM_GLOBAL_STATUS(UnsupportedCluster);
-    }
-
-    auto & deviceInfo = it->second;
-    if (!deviceInfo.mRemovedOn.HasValue())
-    {
-        aEncoder.EncodeNull();
-        return CHIP_NO_ERROR;
-    }
-
-    aEncoder.Encode(deviceInfo.mRemovedOn.Value());
-    return CHIP_NO_ERROR;
-}
-
 CHIP_ERROR EcosystemInformationServer::EncodeDeviceDirectoryAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder)
 {
 
@@ -355,7 +322,7 @@
     }
 
     auto & deviceInfo = it->second;
-    if (deviceInfo.mDeviceDirectory.empty() || deviceInfo.mRemovedOn.HasValue())
+    if (deviceInfo.mDeviceDirectory.empty())
     {
         return aEncoder.EncodeEmptyList();
     }
@@ -381,7 +348,7 @@
     }
 
     auto & deviceInfo = it->second;
-    if (deviceInfo.mLocationDirectory.empty() || deviceInfo.mRemovedOn.HasValue())
+    if (deviceInfo.mLocationDirectory.empty())
     {
         return aEncoder.EncodeEmptyList();
     }
diff --git a/src/app/clusters/ecosystem-information-server/ecosystem-information-server.h b/src/app/clusters/ecosystem-information-server/ecosystem-information-server.h
index d4f4d7d..3fe1621 100644
--- a/src/app/clusters/ecosystem-information-server/ecosystem-information-server.h
+++ b/src/app/clusters/ecosystem-information-server/ecosystem-information-server.h
@@ -186,16 +186,6 @@
      */
     CHIP_ERROR AddLocationInfo(EndpointId aEndpoint, const std::string & aLocationId, FabricIndex aFabricIndex,
                                std::unique_ptr<EcosystemLocationStruct> aLocation);
-
-    /**
-     * @brief Removes device at the provided endpoint.
-     *
-     * @param aEndpoint Endpoint of the associated device that has been removed.
-     * @param aEpochUs Epoch time in micro seconds assoicated with when device was removed.
-     * @return #CHIP_NO_ERROR on success.
-     * @return Other CHIP_ERROR associated with issue.
-     */
-    CHIP_ERROR RemoveDevice(EndpointId aEndpoint, uint64_t aEpochUs);
     // TODO(#33223) Add removal and update counterparts to AddDeviceInfo and AddLocationInfo.
 
     CHIP_ERROR ReadAttribute(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder);
@@ -214,12 +204,10 @@
 
     struct DeviceInfo
     {
-        Optional<uint64_t> mRemovedOn = NullOptional;
         std::vector<std::unique_ptr<EcosystemDeviceStruct>> mDeviceDirectory;
         std::map<EcosystemLocationKey, std::unique_ptr<EcosystemLocationStruct>> mLocationDirectory;
     };
 
-    CHIP_ERROR EncodeRemovedOnAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder);
     CHIP_ERROR EncodeDeviceDirectoryAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder);
     CHIP_ERROR EncodeLocationStructAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder);
 
diff --git a/src/app/zap-templates/zcl/data-model/chip/ecosystem-information-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/ecosystem-information-cluster.xml
index 1b553ee..7abf54c 100644
--- a/src/app/zap-templates/zcl/data-model/chip/ecosystem-information-cluster.xml
+++ b/src/app/zap-templates/zcl/data-model/chip/ecosystem-information-cluster.xml
@@ -44,15 +44,11 @@
     <server init="false" tick="false">true</server>
     <!-- cluster revision -->
     <globalAttribute code="0xFFFD" side="either" value="1"/>
-    <attribute code="0x0000" side="server" define="REMOVED_ON" type="epoch_us" isNullable="true" optional="true">
-      <description>RemovedOn</description>
-      <access op="read" privilege="manage"/>
-    </attribute>
-    <attribute code="0x0001" side="server" define="DEVICE_DIRECTORY" type="array" entryType="EcosystemDeviceStruct" length="256" minLength="1">
+    <attribute code="0x0000" side="server" define="DEVICE_DIRECTORY" type="array" entryType="EcosystemDeviceStruct" length="256" minLength="1">
       <description>DeviceDirectory</description>
       <access op="read" privilege="manage"/>
     </attribute>
-    <attribute code="0x0002" side="server" define="LOCATION_DIRECTORY" type="array" entryType="EcosystemLocationStruct" length="64" minLength="1">
+    <attribute code="0x0001" side="server" define="LOCATION_DIRECTORY" type="array" entryType="EcosystemLocationStruct" length="64" minLength="1">
       <description>LocationDirectory</description>
       <access op="read" privilege="manage"/>
     </attribute>
diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter
index e9615e9..e21a822 100644
--- a/src/controller/data_model/controller-clusters.matter
+++ b/src/controller/data_model/controller-clusters.matter
@@ -9407,9 +9407,8 @@
     fabric_idx fabricIndex = 254;
   }
 
-  readonly attribute access(read: manage) optional nullable epoch_us removedOn = 0;
-  readonly attribute access(read: manage) EcosystemDeviceStruct deviceDirectory[] = 1;
-  readonly attribute access(read: manage) EcosystemLocationStruct locationDirectory[] = 2;
+  readonly attribute access(read: manage) EcosystemDeviceStruct deviceDirectory[] = 0;
+  readonly attribute access(read: manage) EcosystemLocationStruct locationDirectory[] = 1;
   readonly attribute command_id generatedCommandList[] = 65528;
   readonly attribute command_id acceptedCommandList[] = 65529;
   readonly attribute event_id eventList[] = 65530;
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java
index 5d932a2..8dd9332 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java
@@ -60772,9 +60772,8 @@
   public static class EcosystemInformationCluster extends BaseChipCluster {
     public static final long CLUSTER_ID = 1872L;
 
-    private static final long REMOVED_ON_ATTRIBUTE_ID = 0L;
-    private static final long DEVICE_DIRECTORY_ATTRIBUTE_ID = 1L;
-    private static final long LOCATION_DIRECTORY_ATTRIBUTE_ID = 2L;
+    private static final long DEVICE_DIRECTORY_ATTRIBUTE_ID = 0L;
+    private static final long LOCATION_DIRECTORY_ATTRIBUTE_ID = 1L;
     private static final long GENERATED_COMMAND_LIST_ATTRIBUTE_ID = 65528L;
     private static final long ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID = 65529L;
     private static final long EVENT_LIST_ATTRIBUTE_ID = 65530L;
@@ -60792,10 +60791,6 @@
       return 0L;
     }
 
-    public interface RemovedOnAttributeCallback extends BaseAttributeCallback {
-      void onSuccess(@Nullable Long value);
-    }
-
     public interface DeviceDirectoryAttributeCallback extends BaseAttributeCallback {
       void onSuccess(List<ChipStructs.EcosystemInformationClusterEcosystemDeviceStruct> value);
     }
@@ -60820,32 +60815,6 @@
       void onSuccess(List<Long> value);
     }
 
-    public void readRemovedOnAttribute(
-        RemovedOnAttributeCallback callback) {
-      ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, REMOVED_ON_ATTRIBUTE_ID);
-
-      readAttribute(new ReportCallbackImpl(callback, path) {
-          @Override
-          public void onSuccess(byte[] tlv) {
-            @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv);
-            callback.onSuccess(value);
-          }
-        }, REMOVED_ON_ATTRIBUTE_ID, true);
-    }
-
-    public void subscribeRemovedOnAttribute(
-        RemovedOnAttributeCallback callback, int minInterval, int maxInterval) {
-      ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, REMOVED_ON_ATTRIBUTE_ID);
-
-      subscribeAttribute(new ReportCallbackImpl(callback, path) {
-          @Override
-          public void onSuccess(byte[] tlv) {
-            @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv);
-            callback.onSuccess(value);
-          }
-        }, REMOVED_ON_ATTRIBUTE_ID, minInterval, maxInterval);
-    }
-
     public void readDeviceDirectoryAttribute(
         DeviceDirectoryAttributeCallback callback) {
       readDeviceDirectoryAttributeWithFabricFilter(callback, true);
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java b/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java
index 063fe95..829cf62 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java
@@ -17238,9 +17238,8 @@
         }
 
         public enum Attribute {
-            RemovedOn(0L),
-            DeviceDirectory(1L),
-            LocationDirectory(2L),
+            DeviceDirectory(0L),
+            LocationDirectory(1L),
             GeneratedCommandList(65528L),
             AcceptedCommandList(65529L),
             EventList(65530L),
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java b/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java
index e6e78c3..fe948f9 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java
@@ -20222,27 +20222,6 @@
     }
   }
 
-  public static class DelegatedEcosystemInformationClusterRemovedOnAttributeCallback implements ChipClusters.EcosystemInformationCluster.RemovedOnAttributeCallback, DelegatedClusterCallback {
-    private ClusterCommandCallback callback;
-    @Override
-    public void setCallbackDelegate(ClusterCommandCallback callback) {
-      this.callback = callback;
-    }
-
-    @Override
-    public void onSuccess(@Nullable Long value) {
-      Map<CommandResponseInfo, Object> responseValues = new LinkedHashMap<>();
-      CommandResponseInfo commandResponseInfo = new CommandResponseInfo("value", "Long");
-      responseValues.put(commandResponseInfo, value);
-      callback.onSuccess(responseValues);
-    }
-
-    @Override
-    public void onError(Exception ex) {
-      callback.onFailure(ex);
-    }
-  }
-
   public static class DelegatedEcosystemInformationClusterDeviceDirectoryAttributeCallback implements ChipClusters.EcosystemInformationCluster.DeviceDirectoryAttributeCallback, DelegatedClusterCallback {
     private ClusterCommandCallback callback;
     @Override
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java b/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java
index c96de69..6baa71c 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java
@@ -18678,18 +18678,7 @@
        return result;
     }
     private static Map<String, InteractionInfo> readEcosystemInformationInteractionInfo() {
-       Map<String, InteractionInfo> result = new LinkedHashMap<>();Map<String, CommandParameterInfo> readEcosystemInformationRemovedOnCommandParams = new LinkedHashMap<String, CommandParameterInfo>();
-        InteractionInfo readEcosystemInformationRemovedOnAttributeInteractionInfo = new InteractionInfo(
-          (cluster, callback, commandArguments) -> {
-            ((ChipClusters.EcosystemInformationCluster) cluster).readRemovedOnAttribute(
-              (ChipClusters.EcosystemInformationCluster.RemovedOnAttributeCallback) callback
-            );
-          },
-          () -> new ClusterInfoMapping.DelegatedEcosystemInformationClusterRemovedOnAttributeCallback(),
-          readEcosystemInformationRemovedOnCommandParams
-        );
-        result.put("readRemovedOnAttribute", readEcosystemInformationRemovedOnAttributeInteractionInfo);
-     Map<String, CommandParameterInfo> readEcosystemInformationDeviceDirectoryCommandParams = new LinkedHashMap<String, CommandParameterInfo>();
+       Map<String, InteractionInfo> result = new LinkedHashMap<>();Map<String, CommandParameterInfo> readEcosystemInformationDeviceDirectoryCommandParams = new LinkedHashMap<String, CommandParameterInfo>();
         InteractionInfo readEcosystemInformationDeviceDirectoryAttributeInteractionInfo = new InteractionInfo(
           (cluster, callback, commandArguments) -> {
             ((ChipClusters.EcosystemInformationCluster) cluster).readDeviceDirectoryAttribute(
diff --git a/src/controller/java/generated/java/matter/controller/cluster/clusters/EcosystemInformationCluster.kt b/src/controller/java/generated/java/matter/controller/cluster/clusters/EcosystemInformationCluster.kt
index 5dfa4a7..0fc2806 100644
--- a/src/controller/java/generated/java/matter/controller/cluster/clusters/EcosystemInformationCluster.kt
+++ b/src/controller/java/generated/java/matter/controller/cluster/clusters/EcosystemInformationCluster.kt
@@ -38,16 +38,6 @@
   private val controller: MatterController,
   private val endpointId: UShort,
 ) {
-  class RemovedOnAttribute(val value: ULong?)
-
-  sealed class RemovedOnAttributeSubscriptionState {
-    data class Success(val value: ULong?) : RemovedOnAttributeSubscriptionState()
-
-    data class Error(val exception: Exception) : RemovedOnAttributeSubscriptionState()
-
-    object SubscriptionEstablished : RemovedOnAttributeSubscriptionState()
-  }
-
   class DeviceDirectoryAttribute(val value: List<EcosystemInformationClusterEcosystemDeviceStruct>)
 
   sealed class DeviceDirectoryAttributeSubscriptionState {
@@ -112,109 +102,8 @@
     object SubscriptionEstablished : AttributeListAttributeSubscriptionState()
   }
 
-  suspend fun readRemovedOnAttribute(): RemovedOnAttribute {
-    val ATTRIBUTE_ID: UInt = 0u
-
-    val attributePath =
-      AttributePath(endpointId = endpointId, clusterId = CLUSTER_ID, attributeId = ATTRIBUTE_ID)
-
-    val readRequest = ReadRequest(eventPaths = emptyList(), attributePaths = listOf(attributePath))
-
-    val response = controller.read(readRequest)
-
-    if (response.successes.isEmpty()) {
-      logger.log(Level.WARNING, "Read command failed")
-      throw IllegalStateException("Read command failed with failures: ${response.failures}")
-    }
-
-    logger.log(Level.FINE, "Read command succeeded")
-
-    val attributeData =
-      response.successes.filterIsInstance<ReadData.Attribute>().firstOrNull {
-        it.path.attributeId == ATTRIBUTE_ID
-      }
-
-    requireNotNull(attributeData) { "Removedon attribute not found in response" }
-
-    // Decode the TLV data into the appropriate type
-    val tlvReader = TlvReader(attributeData.data)
-    val decodedValue: ULong? =
-      if (!tlvReader.isNull()) {
-        if (tlvReader.isNextTag(AnonymousTag)) {
-          tlvReader.getULong(AnonymousTag)
-        } else {
-          null
-        }
-      } else {
-        tlvReader.getNull(AnonymousTag)
-        null
-      }
-
-    return RemovedOnAttribute(decodedValue)
-  }
-
-  suspend fun subscribeRemovedOnAttribute(
-    minInterval: Int,
-    maxInterval: Int,
-  ): Flow<RemovedOnAttributeSubscriptionState> {
-    val ATTRIBUTE_ID: UInt = 0u
-    val attributePaths =
-      listOf(
-        AttributePath(endpointId = endpointId, clusterId = CLUSTER_ID, attributeId = ATTRIBUTE_ID)
-      )
-
-    val subscribeRequest: SubscribeRequest =
-      SubscribeRequest(
-        eventPaths = emptyList(),
-        attributePaths = attributePaths,
-        minInterval = Duration.ofSeconds(minInterval.toLong()),
-        maxInterval = Duration.ofSeconds(maxInterval.toLong()),
-      )
-
-    return controller.subscribe(subscribeRequest).transform { subscriptionState ->
-      when (subscriptionState) {
-        is SubscriptionState.SubscriptionErrorNotification -> {
-          emit(
-            RemovedOnAttributeSubscriptionState.Error(
-              Exception(
-                "Subscription terminated with error code: ${subscriptionState.terminationCause}"
-              )
-            )
-          )
-        }
-        is SubscriptionState.NodeStateUpdate -> {
-          val attributeData =
-            subscriptionState.updateState.successes
-              .filterIsInstance<ReadData.Attribute>()
-              .firstOrNull { it.path.attributeId == ATTRIBUTE_ID }
-
-          requireNotNull(attributeData) { "Removedon attribute not found in Node State update" }
-
-          // Decode the TLV data into the appropriate type
-          val tlvReader = TlvReader(attributeData.data)
-          val decodedValue: ULong? =
-            if (!tlvReader.isNull()) {
-              if (tlvReader.isNextTag(AnonymousTag)) {
-                tlvReader.getULong(AnonymousTag)
-              } else {
-                null
-              }
-            } else {
-              tlvReader.getNull(AnonymousTag)
-              null
-            }
-
-          decodedValue?.let { emit(RemovedOnAttributeSubscriptionState.Success(it)) }
-        }
-        SubscriptionState.SubscriptionEstablished -> {
-          emit(RemovedOnAttributeSubscriptionState.SubscriptionEstablished)
-        }
-      }
-    }
-  }
-
   suspend fun readDeviceDirectoryAttribute(): DeviceDirectoryAttribute {
-    val ATTRIBUTE_ID: UInt = 1u
+    val ATTRIBUTE_ID: UInt = 0u
 
     val attributePath =
       AttributePath(endpointId = endpointId, clusterId = CLUSTER_ID, attributeId = ATTRIBUTE_ID)
@@ -255,7 +144,7 @@
     minInterval: Int,
     maxInterval: Int,
   ): Flow<DeviceDirectoryAttributeSubscriptionState> {
-    val ATTRIBUTE_ID: UInt = 1u
+    val ATTRIBUTE_ID: UInt = 0u
     val attributePaths =
       listOf(
         AttributePath(endpointId = endpointId, clusterId = CLUSTER_ID, attributeId = ATTRIBUTE_ID)
@@ -313,7 +202,7 @@
   }
 
   suspend fun readLocationDirectoryAttribute(): LocationDirectoryAttribute {
-    val ATTRIBUTE_ID: UInt = 2u
+    val ATTRIBUTE_ID: UInt = 1u
 
     val attributePath =
       AttributePath(endpointId = endpointId, clusterId = CLUSTER_ID, attributeId = ATTRIBUTE_ID)
@@ -354,7 +243,7 @@
     minInterval: Int,
     maxInterval: Int,
   ): Flow<LocationDirectoryAttributeSubscriptionState> {
-    val ATTRIBUTE_ID: UInt = 2u
+    val ATTRIBUTE_ID: UInt = 1u
     val attributePaths =
       listOf(
         AttributePath(endpointId = endpointId, clusterId = CLUSTER_ID, attributeId = ATTRIBUTE_ID)
diff --git a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
index cacd156..b6f8a63 100644
--- a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
+++ b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
@@ -42974,29 +42974,6 @@
         using namespace app::Clusters::EcosystemInformation;
         switch (aPath.mAttributeId)
         {
-        case Attributes::RemovedOn::Id: {
-            using TypeInfo = Attributes::RemovedOn::TypeInfo;
-            TypeInfo::DecodableType cppValue;
-            *aError = app::DataModel::Decode(aReader, cppValue);
-            if (*aError != CHIP_NO_ERROR)
-            {
-                return nullptr;
-            }
-            jobject value;
-            if (cppValue.IsNull())
-            {
-                value = nullptr;
-            }
-            else
-            {
-                std::string valueClassName     = "java/lang/Long";
-                std::string valueCtorSignature = "(J)V";
-                jlong jnivalue                 = static_cast<jlong>(cppValue.Value());
-                chip::JniReferences::GetInstance().CreateBoxedObject<jlong>(valueClassName.c_str(), valueCtorSignature.c_str(),
-                                                                            jnivalue, value);
-            }
-            return value;
-        }
         case Attributes::DeviceDirectory::Id: {
             using TypeInfo = Attributes::DeviceDirectory::TypeInfo;
             TypeInfo::DecodableType cppValue;
diff --git a/src/controller/python/chip/clusters/CHIPClusters.py b/src/controller/python/chip/clusters/CHIPClusters.py
index 38a8146..925ce90 100644
--- a/src/controller/python/chip/clusters/CHIPClusters.py
+++ b/src/controller/python/chip/clusters/CHIPClusters.py
@@ -13320,20 +13320,14 @@
         },
         "attributes": {
             0x00000000: {
-                "attributeName": "RemovedOn",
-                "attributeId": 0x00000000,
-                "type": "int",
-                "reportable": True,
-            },
-            0x00000001: {
                 "attributeName": "DeviceDirectory",
-                "attributeId": 0x00000001,
+                "attributeId": 0x00000000,
                 "type": "",
                 "reportable": True,
             },
-            0x00000002: {
+            0x00000001: {
                 "attributeName": "LocationDirectory",
-                "attributeId": 0x00000002,
+                "attributeId": 0x00000001,
                 "type": "",
                 "reportable": True,
             },
diff --git a/src/controller/python/chip/clusters/Objects.py b/src/controller/python/chip/clusters/Objects.py
index 3b121af..82f257f 100644
--- a/src/controller/python/chip/clusters/Objects.py
+++ b/src/controller/python/chip/clusters/Objects.py
@@ -47207,9 +47207,8 @@
     def descriptor(cls) -> ClusterObjectDescriptor:
         return ClusterObjectDescriptor(
             Fields=[
-                ClusterObjectFieldDescriptor(Label="removedOn", Tag=0x00000000, Type=typing.Union[None, Nullable, uint]),
-                ClusterObjectFieldDescriptor(Label="deviceDirectory", Tag=0x00000001, Type=typing.List[EcosystemInformation.Structs.EcosystemDeviceStruct]),
-                ClusterObjectFieldDescriptor(Label="locationDirectory", Tag=0x00000002, Type=typing.List[EcosystemInformation.Structs.EcosystemLocationStruct]),
+                ClusterObjectFieldDescriptor(Label="deviceDirectory", Tag=0x00000000, Type=typing.List[EcosystemInformation.Structs.EcosystemDeviceStruct]),
+                ClusterObjectFieldDescriptor(Label="locationDirectory", Tag=0x00000001, Type=typing.List[EcosystemInformation.Structs.EcosystemLocationStruct]),
                 ClusterObjectFieldDescriptor(Label="generatedCommandList", Tag=0x0000FFF8, Type=typing.List[uint]),
                 ClusterObjectFieldDescriptor(Label="acceptedCommandList", Tag=0x0000FFF9, Type=typing.List[uint]),
                 ClusterObjectFieldDescriptor(Label="eventList", Tag=0x0000FFFA, Type=typing.List[uint]),
@@ -47218,7 +47217,6 @@
                 ClusterObjectFieldDescriptor(Label="clusterRevision", Tag=0x0000FFFD, Type=uint),
             ])
 
-    removedOn: 'typing.Union[None, Nullable, uint]' = None
     deviceDirectory: 'typing.List[EcosystemInformation.Structs.EcosystemDeviceStruct]' = None
     locationDirectory: 'typing.List[EcosystemInformation.Structs.EcosystemLocationStruct]' = None
     generatedCommandList: 'typing.List[uint]' = None
@@ -47286,22 +47284,6 @@
 
     class Attributes:
         @dataclass
-        class RemovedOn(ClusterAttributeDescriptor):
-            @ChipUtility.classproperty
-            def cluster_id(cls) -> int:
-                return 0x00000750
-
-            @ChipUtility.classproperty
-            def attribute_id(cls) -> int:
-                return 0x00000000
-
-            @ChipUtility.classproperty
-            def attribute_type(cls) -> ClusterObjectFieldDescriptor:
-                return ClusterObjectFieldDescriptor(Type=typing.Union[None, Nullable, uint])
-
-            value: 'typing.Union[None, Nullable, uint]' = None
-
-        @dataclass
         class DeviceDirectory(ClusterAttributeDescriptor):
             @ChipUtility.classproperty
             def cluster_id(cls) -> int:
@@ -47309,7 +47291,7 @@
 
             @ChipUtility.classproperty
             def attribute_id(cls) -> int:
-                return 0x00000001
+                return 0x00000000
 
             @ChipUtility.classproperty
             def attribute_type(cls) -> ClusterObjectFieldDescriptor:
@@ -47325,7 +47307,7 @@
 
             @ChipUtility.classproperty
             def attribute_id(cls) -> int:
-                return 0x00000002
+                return 0x00000001
 
             @ChipUtility.classproperty
             def attribute_type(cls) -> ClusterObjectFieldDescriptor:
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm
index 925ef9c..3f8df9e 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm
@@ -6060,9 +6060,6 @@
 {
     using namespace Clusters::EcosystemInformation;
     switch (aAttributeId) {
-    case Attributes::RemovedOn::Id: {
-        return YES;
-    }
     case Attributes::DeviceDirectory::Id: {
         return YES;
     }
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
index 4b0e0bb..f26c5e2 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
@@ -17185,21 +17185,6 @@
 {
     using namespace Clusters::EcosystemInformation;
     switch (aAttributeId) {
-    case Attributes::RemovedOn::Id: {
-        using TypeInfo = Attributes::RemovedOn::TypeInfo;
-        TypeInfo::DecodableType cppValue;
-        *aError = DataModel::Decode(aReader, cppValue);
-        if (*aError != CHIP_NO_ERROR) {
-            return nil;
-        }
-        NSNumber * _Nullable value;
-        if (cppValue.IsNull()) {
-            value = nil;
-        } else {
-            value = [NSNumber numberWithUnsignedLongLong:cppValue.Value()];
-        }
-        return value;
-    }
     case Attributes::DeviceDirectory::Id: {
         using TypeInfo = Attributes::DeviceDirectory::TypeInfo;
         TypeInfo::DecodableType cppValue;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
index 4dc89b0..cf83800 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
@@ -15114,12 +15114,6 @@
 MTR_PROVISIONALLY_AVAILABLE
 @interface MTRBaseClusterEcosystemInformation : MTRGenericBaseCluster
 
-- (void)readAttributeRemovedOnWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE;
-- (void)subscribeAttributeRemovedOnWithParams:(MTRSubscribeParams *)params
-                      subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
-                                reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE;
-+ (void)readAttributeRemovedOnWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE;
-
 - (void)readAttributeDeviceDirectoryWithParams:(MTRReadParams * _Nullable)params completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE;
 - (void)subscribeAttributeDeviceDirectoryWithParams:(MTRSubscribeParams *)params
                             subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
index 2c81423..453ec72 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
@@ -105332,42 +105332,6 @@
 
 @implementation MTRBaseClusterEcosystemInformation
 
-- (void)readAttributeRemovedOnWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
-{
-    using TypeInfo = EcosystemInformation::Attributes::RemovedOn::TypeInfo;
-    [self.device _readKnownAttributeWithEndpointID:self.endpointID
-                                         clusterID:@(TypeInfo::GetClusterId())
-                                       attributeID:@(TypeInfo::GetAttributeId())
-                                            params:nil
-                                             queue:self.callbackQueue
-                                        completion:completion];
-}
-
-- (void)subscribeAttributeRemovedOnWithParams:(MTRSubscribeParams * _Nonnull)params
-                      subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
-                                reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler
-{
-    using TypeInfo = EcosystemInformation::Attributes::RemovedOn::TypeInfo;
-    [self.device _subscribeToKnownAttributeWithEndpointID:self.endpointID
-                                                clusterID:@(TypeInfo::GetClusterId())
-                                              attributeID:@(TypeInfo::GetAttributeId())
-                                                   params:params
-                                                    queue:self.callbackQueue
-                                            reportHandler:reportHandler
-                                  subscriptionEstablished:subscriptionEstablished];
-}
-
-+ (void)readAttributeRemovedOnWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
-{
-    using TypeInfo = EcosystemInformation::Attributes::RemovedOn::TypeInfo;
-    [clusterStateCacheContainer
-        _readKnownCachedAttributeWithEndpointID:static_cast<chip::EndpointId>([endpoint unsignedShortValue])
-                                      clusterID:TypeInfo::GetClusterId()
-                                    attributeID:TypeInfo::GetAttributeId()
-                                          queue:queue
-                                     completion:completion];
-}
-
 - (void)readAttributeDeviceDirectoryWithParams:(MTRReadParams * _Nullable)params completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
     using TypeInfo = EcosystemInformation::Attributes::DeviceDirectory::TypeInfo;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
index 7d161a0..3ceca84 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
@@ -4897,9 +4897,8 @@
     MTRAttributeIDTypeClusterContentAppObserverAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID,
 
     // Cluster EcosystemInformation attributes
-    MTRAttributeIDTypeClusterEcosystemInformationAttributeRemovedOnID MTR_PROVISIONALLY_AVAILABLE = 0x00000000,
-    MTRAttributeIDTypeClusterEcosystemInformationAttributeDeviceDirectoryID MTR_PROVISIONALLY_AVAILABLE = 0x00000001,
-    MTRAttributeIDTypeClusterEcosystemInformationAttributeLocationDirectoryID MTR_PROVISIONALLY_AVAILABLE = 0x00000002,
+    MTRAttributeIDTypeClusterEcosystemInformationAttributeDeviceDirectoryID MTR_PROVISIONALLY_AVAILABLE = 0x00000000,
+    MTRAttributeIDTypeClusterEcosystemInformationAttributeLocationDirectoryID MTR_PROVISIONALLY_AVAILABLE = 0x00000001,
     MTRAttributeIDTypeClusterEcosystemInformationAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID,
     MTRAttributeIDTypeClusterEcosystemInformationAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID,
     MTRAttributeIDTypeClusterEcosystemInformationAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID,
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterNames.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusterNames.mm
index f845089..894f839 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterNames.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterNames.mm
@@ -8342,10 +8342,6 @@
         switch (attributeID) {
 
             // Cluster EcosystemInformation attributes
-        case MTRAttributeIDTypeClusterEcosystemInformationAttributeRemovedOnID:
-            result = @"RemovedOn";
-            break;
-
         case MTRAttributeIDTypeClusterEcosystemInformationAttributeDeviceDirectoryID:
             result = @"DeviceDirectory";
             break;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
index b3f63ee..b4153ec 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
@@ -7012,8 +7012,6 @@
 MTR_PROVISIONALLY_AVAILABLE
 @interface MTRClusterEcosystemInformation : MTRGenericCluster
 
-- (NSDictionary<NSString *, id> * _Nullable)readAttributeRemovedOnWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE;
-
 - (NSDictionary<NSString *, id> * _Nullable)readAttributeDeviceDirectoryWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE;
 
 - (NSDictionary<NSString *, id> * _Nullable)readAttributeLocationDirectoryWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
index 73ff54e..780c3a4 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
@@ -20000,11 +20000,6 @@
 
 @implementation MTRClusterEcosystemInformation
 
-- (NSDictionary<NSString *, id> * _Nullable)readAttributeRemovedOnWithParams:(MTRReadParams * _Nullable)params
-{
-    return [self.device readAttributeWithEndpointID:self.endpointID clusterID:@(MTRClusterIDTypeEcosystemInformationID) attributeID:@(MTRAttributeIDTypeClusterEcosystemInformationAttributeRemovedOnID) params:params];
-}
-
 - (NSDictionary<NSString *, id> * _Nullable)readAttributeDeviceDirectoryWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:self.endpointID clusterID:@(MTRClusterIDTypeEcosystemInformationID) attributeID:@(MTRAttributeIDTypeClusterEcosystemInformationAttributeDeviceDirectoryID) params:params];
diff --git a/src/python_testing/TC_ECOINFO_2_1.py b/src/python_testing/TC_ECOINFO_2_1.py
index ea9ee43..8397402 100644
--- a/src/python_testing/TC_ECOINFO_2_1.py
+++ b/src/python_testing/TC_ECOINFO_2_1.py
@@ -25,96 +25,87 @@
 
 class TC_ECOINFO_2_1(MatterBaseTest):
 
-    def _validate_device_directory(self, is_removed_on_null, device_directory):
+    def _validate_device_directory(self, device_directory):
         num_of_devices = len(device_directory)
-        if is_removed_on_null:
-            asserts.assert_less_equal(num_of_devices, 256, "Too many device entries")
-            for device in device_directory:
-                # TODO do fabric index check first
-                if device.deviceName is not None:
-                    asserts.assert_true(type_matches(device.deviceName, str), "DeviceName should be a string")
-                    asserts.assert_less_equal(len(device.deviceName), 64, "DeviceName should be <= 64")
-                    asserts.assert_true(type_matches(device.deviceNameLastEdit, uint), "DeviceNameLastEdit should be a uint")
-                    asserts.assert_greater(device.deviceNameLastEdit, 0, "DeviceNameLastEdit must be greater than 0")
-                else:
-                    asserts.assert_true(device.deviceNameLastEdit is None,
-                                        "DeviceNameLastEdit should not be provided when there is no DeviceName")
+        asserts.assert_less_equal(num_of_devices, 256, "Too many device entries")
+        for device in device_directory:
+            # TODO do fabric index check first
+            if device.deviceName is not None:
+                asserts.assert_true(type_matches(device.deviceName, str), "DeviceName should be a string")
+                asserts.assert_less_equal(len(device.deviceName), 64, "DeviceName should be <= 64")
+                asserts.assert_true(type_matches(device.deviceNameLastEdit, uint), "DeviceNameLastEdit should be a uint")
+                asserts.assert_greater(device.deviceNameLastEdit, 0, "DeviceNameLastEdit must be greater than 0")
+            else:
+                asserts.assert_true(device.deviceNameLastEdit is None,
+                                    "DeviceNameLastEdit should not be provided when there is no DeviceName")
 
-                asserts.assert_true(type_matches(device.bridgedEndpoint, uint), "BridgedEndpoint should be a uint")
-                asserts.assert_greater_equal(device.bridgedEndpoint, 0, "BridgedEndpoint >= 0")
-                asserts.assert_less_equal(device.bridgedEndpoint, 0xffff_ffff,
-                                          "BridgedEndpoint less than or equal to Invalid Endpoint value")
+            asserts.assert_true(type_matches(device.bridgedEndpoint, uint), "BridgedEndpoint should be a uint")
+            asserts.assert_greater_equal(device.bridgedEndpoint, 0, "BridgedEndpoint >= 0")
+            asserts.assert_less_equal(device.bridgedEndpoint, 0xffff_ffff,
+                                      "BridgedEndpoint less than or equal to Invalid Endpoint value")
 
-                asserts.assert_true(type_matches(device.originalEndpoint, uint), "OriginalEndpoint should be a uint")
-                asserts.assert_greater_equal(device.originalEndpoint, 0, "OriginalEndpoint >= 0")
-                asserts.assert_less(device.originalEndpoint, 0xffff_ffff,
-                                    "OriginalEndpoint less than or equal to Invalid Endpoint value")
+            asserts.assert_true(type_matches(device.originalEndpoint, uint), "OriginalEndpoint should be a uint")
+            asserts.assert_greater_equal(device.originalEndpoint, 0, "OriginalEndpoint >= 0")
+            asserts.assert_less(device.originalEndpoint, 0xffff_ffff,
+                                "OriginalEndpoint less than or equal to Invalid Endpoint value")
 
-                asserts.assert_true(type_matches(device.deviceTypes, list), "DeviceTypes should be a list")
-                asserts.assert_greater_equal(len(device.deviceTypes), 1, "DeviceTypes list must contains at least one entry")
-                for device_type in device.deviceTypes:
-                    asserts.assert_true(type_matches(device_type.deviceType, uint), "DeviceType should be a uint")
-                    # TODO what other validation can we do here to device_type.deviceType
-                    asserts.assert_true(type_matches(device_type.revision, uint), "device type's revision should be a uint")
-                    asserts.assert_greater_equal(device_type.revision, 1, "device type's revision must >= 1")
+            asserts.assert_true(type_matches(device.deviceTypes, list), "DeviceTypes should be a list")
+            asserts.assert_greater_equal(len(device.deviceTypes), 1, "DeviceTypes list must contains at least one entry")
+            for device_type in device.deviceTypes:
+                asserts.assert_true(type_matches(device_type.deviceType, uint), "DeviceType should be a uint")
+                # TODO what other validation can we do here to device_type.deviceType
+                asserts.assert_true(type_matches(device_type.revision, uint), "device type's revision should be a uint")
+                asserts.assert_greater_equal(device_type.revision, 1, "device type's revision must >= 1")
 
-                asserts.assert_true(type_matches(device.uniqueLocationIDs, list), "UniqueLocationIds should be a list")
-                num_of_unique_location_ids = len(device.uniqueLocationIDs)
-                asserts.assert_less_equal(num_of_unique_location_ids, 64, "UniqueLocationIds list should be <= 64")
-                for location_id in device.uniqueLocationIDs:
-                    asserts.assert_true(type_matches(location_id, str), "UniqueLocationId should be a string")
-                    location_id_string_length = len(location_id)
-                    asserts.assert_greater_equal(location_id_string_length, 1,
-                                                 "UniqueLocationId must contain at least one character")
-                    asserts.assert_less_equal(location_id_string_length, 64, "UniqueLocationId should be <= 64")
-
-                asserts.assert_true(type_matches(device.uniqueLocationIDsLastEdit, uint),
-                                    "UniqueLocationIdsLastEdit should be a uint")
-                if num_of_unique_location_ids:
-                    asserts.assert_greater(device.uniqueLocationIDsLastEdit, 0, "UniqueLocationIdsLastEdit must be non-zero")
-        else:
-            asserts.assert_equal(num_of_devices, 0, "Device was removed, there should be no devices in DeviceDirectory")
-
-    def _validate_location_directory(self, is_removed_on_null, location_directory):
-        num_of_locations = len(location_directory)
-        if is_removed_on_null:
-            asserts.assert_less_equal(num_of_locations, 64, "Too many location entries")
-            for location in location_directory:
-                asserts.assert_true(type_matches(location.uniqueLocationID, str), "UniqueLocationId should be a string")
-                location_id_string_length = len(location.uniqueLocationID)
+            asserts.assert_true(type_matches(device.uniqueLocationIDs, list), "UniqueLocationIds should be a list")
+            num_of_unique_location_ids = len(device.uniqueLocationIDs)
+            asserts.assert_less_equal(num_of_unique_location_ids, 64, "UniqueLocationIds list should be <= 64")
+            for location_id in device.uniqueLocationIDs:
+                asserts.assert_true(type_matches(location_id, str), "UniqueLocationId should be a string")
+                location_id_string_length = len(location_id)
                 asserts.assert_greater_equal(location_id_string_length, 1,
                                              "UniqueLocationId must contain at least one character")
                 asserts.assert_less_equal(location_id_string_length, 64, "UniqueLocationId should be <= 64")
 
-                asserts.assert_true(type_matches(location.locationDescriptor.locationName, str),
-                                    "LocationName should be a string")
-                asserts.assert_less_equal(len(location.locationDescriptor.locationName), 64, "LocationName should be <= 64")
+            asserts.assert_true(type_matches(device.uniqueLocationIDsLastEdit, uint),
+                                "UniqueLocationIdsLastEdit should be a uint")
+            if num_of_unique_location_ids:
+                asserts.assert_greater(device.uniqueLocationIDsLastEdit, 0, "UniqueLocationIdsLastEdit must be non-zero")
 
-                if location.locationDescriptor.floorNumber is not NullValue:
-                    asserts.assert_true(type_matches(location.locationDescriptor.floorNumber, int),
-                                        "FloorNumber should be an int")
-                    # TODO check in range of int16.
+    def _validate_location_directory(self, location_directory):
+        num_of_locations = len(location_directory)
+        asserts.assert_less_equal(num_of_locations, 64, "Too many location entries")
+        for location in location_directory:
+            asserts.assert_true(type_matches(location.uniqueLocationID, str), "UniqueLocationId should be a string")
+            location_id_string_length = len(location.uniqueLocationID)
+            asserts.assert_greater_equal(location_id_string_length, 1,
+                                         "UniqueLocationId must contain at least one character")
+            asserts.assert_less_equal(location_id_string_length, 64, "UniqueLocationId should be <= 64")
 
-                if location.locationDescriptor.areaType is not NullValue:
-                    # TODO check areaType is valid.
-                    pass
+            asserts.assert_true(type_matches(location.locationDescriptor.locationName, str),
+                                "LocationName should be a string")
+            asserts.assert_less_equal(len(location.locationDescriptor.locationName), 64, "LocationName should be <= 64")
 
-                asserts.assert_true(type_matches(location.locationDescriptorLastEdit, uint),
-                                    "UniqueLocationIdsLastEdit should be a uint")
-                asserts.assert_greater(location.locationDescriptorLastEdit, 0, "LocationDescriptorLastEdit must be non-zero")
+            if location.locationDescriptor.floorNumber is not NullValue:
+                asserts.assert_true(type_matches(location.locationDescriptor.floorNumber, int),
+                                    "FloorNumber should be an int")
+                # TODO check in range of int16.
 
-        else:
-            asserts.assert_equal(num_of_locations, 0, "Device was removed, there should be no location in LocationDirectory")
+            if location.locationDescriptor.areaType is not NullValue:
+                # TODO check areaType is valid.
+                pass
+
+            asserts.assert_true(type_matches(location.locationDescriptorLastEdit, uint),
+                                "UniqueLocationIdsLastEdit should be a uint")
+            asserts.assert_greater(location.locationDescriptorLastEdit, 0, "LocationDescriptorLastEdit must be non-zero")
 
     def steps_TC_ECOINFO_2_1(self) -> list[TestStep]:
         steps = [TestStep(1, "Identify endpoints with Ecosystem Information Cluster", is_commissioning=True),
-                 TestStep(2, "Reading RemovedOn Attribute"),
-                 TestStep(3, "Reading DeviceDirectory Attribute"),
-                 TestStep(4, "Reading LocationDirectory Attribute"),
-                 TestStep(5, "Try Writing to RemovedOn Attribute"),
-                 TestStep(6, "Try Writing to DeviceDirectory Attribute"),
-                 TestStep(7, "Try Writing to LocationDirectory Attribute"),
-                 TestStep(8, "Repeating steps 2 to 7 for each endpoint identified in step 1")]
+                 TestStep(2, "Reading DeviceDirectory Attribute"),
+                 TestStep(3, "Reading LocationDirectory Attribute"),
+                 TestStep(4, "Try Writing to DeviceDirectory Attribute"),
+                 TestStep(5, "Try Writing to LocationDirectory Attribute"),
+                 TestStep(6, "Repeating steps 2 to 5 for each endpoint identified in step 1")]
         return steps
 
     @async_test_body
@@ -131,19 +122,6 @@
         for idx, cluster_endpoint in enumerate(list_of_endpoints):
             if idx == 0:
                 self.step(2)
-            removed_on = await self.read_single_attribute(
-                dev_ctrl,
-                dut_node_id,
-                endpoint=cluster_endpoint,
-                attribute=Clusters.EcosystemInformation.Attributes.RemovedOn)
-
-            is_removed_on_null = removed_on is NullValue
-            if not is_removed_on_null:
-                asserts.assert_true(type_matches(removed_on, uint))
-                asserts.assert_greater(removed_on, 0, "RemovedOn must be greater than 0", "RemovedOn should be a uint")
-
-            if idx == 0:
-                self.step(3)
             device_directory = await self.read_single_attribute(
                 dev_ctrl,
                 dut_node_id,
@@ -151,10 +129,10 @@
                 attribute=Clusters.EcosystemInformation.Attributes.DeviceDirectory,
                 fabricFiltered=False)
 
-            self._validate_device_directory(is_removed_on_null, device_directory)
+            self._validate_device_directory(device_directory)
 
             if idx == 0:
-                self.step(4)
+                self.step(3)
             location_directory = await self.read_single_attribute(
                 dev_ctrl,
                 dut_node_id,
@@ -162,28 +140,22 @@
                 attribute=Clusters.EcosystemInformation.Attributes.LocationDirectory,
                 fabricFiltered=False)
 
-            self._validate_location_directory(is_removed_on_null, location_directory)
+            self._validate_location_directory(location_directory)
 
             if idx == 0:
-                self.step(5)
-            result = await dev_ctrl.WriteAttribute(dut_node_id, [(cluster_endpoint, Clusters.EcosystemInformation.Attributes.RemovedOn(2))])
-            asserts.assert_equal(len(result), 1, "Expecting only one result from trying to write to RemovedOn Attribute")
-            asserts.assert_equal(result[0].Status, Status.UnsupportedWrite, "Expecting Status of UnsupportedWrite")
-
-            if idx == 0:
-                self.step(6)
+                self.step(4)
             result = await dev_ctrl.WriteAttribute(dut_node_id, [(cluster_endpoint, Clusters.EcosystemInformation.Attributes.DeviceDirectory([]))])
             asserts.assert_equal(len(result), 1, "Expecting only one result from trying to write to DeviceDirectory Attribute")
             asserts.assert_equal(result[0].Status, Status.UnsupportedWrite, "Expecting Status of UnsupportedWrite")
 
             if idx == 0:
-                self.step(7)
+                self.step(5)
             result = await dev_ctrl.WriteAttribute(dut_node_id, [(cluster_endpoint, Clusters.EcosystemInformation.Attributes.DeviceDirectory([]))])
             asserts.assert_equal(len(result), 1, "Expecting only one result from trying to write to LocationDirectory Attribute")
             asserts.assert_equal(result[0].Status, Status.UnsupportedWrite, "Expecting Status of UnsupportedWrite")
 
             if idx == 0:
-                self.step(8)
+                self.step(6)
 
 
 if __name__ == "__main__":
diff --git a/src/python_testing/TC_ECOINFO_2_2.py b/src/python_testing/TC_ECOINFO_2_2.py
index c8bb7de..b004a95 100644
--- a/src/python_testing/TC_ECOINFO_2_2.py
+++ b/src/python_testing/TC_ECOINFO_2_2.py
@@ -16,7 +16,7 @@
 #
 
 import chip.clusters as Clusters
-from chip.clusters.Types import NullValue
+from chip.interaction_model import Status
 from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main
 from mobly import asserts
 
@@ -32,12 +32,13 @@
                  TestStep(2, "Add a bridged device"),
                  TestStep("2a", "(Manual Step) Add a bridged device using method indicated by the manufacturer"),
                  TestStep("2b", "Read root endpoint's PartsList, validate exactly one endpoint added"),
-                 TestStep("2c", "On newly added endpoint detected in 2b read RemovedOn Ecosystem Information Attribute and validate"),
+                 TestStep("2c", "On newly added endpoint detected in 2b read DeviceDirectory Ecosystem Information Attribute and validate success"),
+                 TestStep("2d", "On newly added endpoint detected in 2b read LocationDirectory Ecosystem Information Attribute and validate success"),
                  TestStep(3, "Remove bridged device"),
                  TestStep("3a", "(Manual Step) Removed bridged device added in step 2a using method indicated by the manufacturer"),
-                 TestStep("3b", "On newly added endpoint detected in 2b read RemovedOn Ecosystem Information Attribute and validate"),
-                 TestStep("3c", "On newly added endpoint detected in 2b read DeviceDirectory Ecosystem Information Attribute and validate"),
-                 TestStep("3d", "On newly added endpoint detected in 2b read LocationDirectory Ecosystem Information Attribute and validate")]
+                 TestStep("3b", "Verify that PartsList equals what was read in 1a"),
+                 TestStep("3c", "On endpoint detected in 2b, read DeviceDirectory Ecosystem Information Attribute and validate failure"),
+                 TestStep("3d", "On endpoint detected in 2b, read LocationDirectory Ecosystem Information Attribute and validate failure")]
 
         return steps
 
@@ -80,43 +81,55 @@
 
         self.step("2c")
         newly_added_endpoint = list(unique_endpoints_set)[0]
-        removed_on = await self.read_single_attribute(
-            dev_ctrl,
-            dut_node_id,
+        await self.read_single_attribute_check_success(
+            dev_ctrl=dev_ctrl,
+            node_id=dut_node_id,
             endpoint=newly_added_endpoint,
-            attribute=Clusters.EcosystemInformation.Attributes.RemovedOn)
+            cluster=Clusters.EcosystemInformation,
+            attribute=Clusters.EcosystemInformation.Attributes.DeviceDirectory,
+            fabric_filtered=False)
 
-        asserts.assert_true(removed_on is NullValue, "RemovedOn is expected to be null for a newly added device")
+        self.step("2d")
+        await self.read_single_attribute_check_success(
+            dev_ctrl=dev_ctrl,
+            node_id=dut_node_id,
+            endpoint=newly_added_endpoint,
+            cluster=Clusters.EcosystemInformation,
+            attribute=Clusters.EcosystemInformation.Attributes.LocationDirectory,
+            fabric_filtered=False)
 
         self.step(3)
         self.step("3a")
         self.wait_for_user_input(prompt_msg="Removed bridged device added in step 2a using method indicated by the manufacturer")
 
         self.step("3b")
-        removed_on = await self.read_single_attribute(
-            dev_ctrl,
-            dut_node_id,
-            endpoint=newly_added_endpoint,
-            attribute=Clusters.EcosystemInformation.Attributes.RemovedOn)
-        asserts.assert_true(removed_on is not NullValue, "RemovedOn is expected to have a value")
+        root_part_list_step_3 = await dev_ctrl.ReadAttribute(dut_node_id, [(root_node_endpoint, Clusters.Descriptor.Attributes.PartsList)])
+        set_of_endpoints_step_3 = set(
+            root_part_list_step_3[root_node_endpoint][Clusters.Descriptor][Clusters.Descriptor.Attributes.PartsList])
+
+        asserts.assert_equal(set_of_endpoints_step_3, set_of_endpoints_step_1,
+                             "Expected set of endpoints after removal to be identical to when test started")
 
         self.step("3c")
-        device_directory = await self.read_single_attribute(
-            dev_ctrl,
-            dut_node_id,
+        newly_added_endpoint = list(unique_endpoints_set)[0]
+        await self.read_single_attribute_expect_error(
+            dev_ctrl=dev_ctrl,
+            node_id=dut_node_id,
+            error=Status.UnsupportedEndpoint,
             endpoint=newly_added_endpoint,
+            cluster=Clusters.EcosystemInformation,
             attribute=Clusters.EcosystemInformation.Attributes.DeviceDirectory,
-            fabricFiltered=False)
-        asserts.assert_equal(len(device_directory), 0, "Expected device directory to be empty")
+            fabric_filtered=False)
 
         self.step("3d")
-        location_directory = await self.read_single_attribute(
-            dev_ctrl,
-            dut_node_id,
+        await self.read_single_attribute_expect_error(
+            dev_ctrl=dev_ctrl,
+            node_id=dut_node_id,
+            error=Status.UnsupportedEndpoint,
             endpoint=newly_added_endpoint,
+            cluster=Clusters.EcosystemInformation,
             attribute=Clusters.EcosystemInformation.Attributes.LocationDirectory,
-            fabricFiltered=False)
-        asserts.assert_equal(len(location_directory), 0, "Expected location directory to be empty")
+            fabric_filtered=False)
 
 
 if __name__ == "__main__":
diff --git a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
index a8fc013..ebd5339 100644
--- a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
+++ b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
@@ -37425,96 +37425,6 @@
 namespace EcosystemInformation {
 namespace Attributes {
 
-namespace RemovedOn {
-
-Protocols::InteractionModel::Status Get(chip::EndpointId endpoint, DataModel::Nullable<uint64_t> & value)
-{
-    using Traits = NumericAttributeTraits<uint64_t>;
-    Traits::StorageType temp;
-    uint8_t * readable = Traits::ToAttributeStoreRepresentation(temp);
-    Protocols::InteractionModel::Status status =
-        emberAfReadAttribute(endpoint, Clusters::EcosystemInformation::Id, Id, readable, sizeof(temp));
-    VerifyOrReturnError(Protocols::InteractionModel::Status::Success == status, status);
-    if (Traits::IsNullValue(temp))
-    {
-        value.SetNull();
-    }
-    else
-    {
-        value.SetNonNull() = Traits::StorageToWorking(temp);
-    }
-    return status;
-}
-
-Protocols::InteractionModel::Status Set(chip::EndpointId endpoint, uint64_t value, MarkAttributeDirty markDirty)
-{
-    using Traits = NumericAttributeTraits<uint64_t>;
-    if (!Traits::CanRepresentValue(/* isNullable = */ true, value))
-    {
-        return Protocols::InteractionModel::Status::ConstraintError;
-    }
-    Traits::StorageType storageValue;
-    Traits::WorkingToStorage(value, storageValue);
-    uint8_t * writable = Traits::ToAttributeStoreRepresentation(storageValue);
-    return emberAfWriteAttribute(endpoint, Clusters::EcosystemInformation::Id, Id, writable, ZCL_EPOCH_US_ATTRIBUTE_TYPE,
-                                 markDirty);
-}
-
-Protocols::InteractionModel::Status Set(chip::EndpointId endpoint, uint64_t value)
-{
-    using Traits = NumericAttributeTraits<uint64_t>;
-    if (!Traits::CanRepresentValue(/* isNullable = */ true, value))
-    {
-        return Protocols::InteractionModel::Status::ConstraintError;
-    }
-    Traits::StorageType storageValue;
-    Traits::WorkingToStorage(value, storageValue);
-    uint8_t * writable = Traits::ToAttributeStoreRepresentation(storageValue);
-    return emberAfWriteAttribute(endpoint, Clusters::EcosystemInformation::Id, Id, writable, ZCL_EPOCH_US_ATTRIBUTE_TYPE);
-}
-
-Protocols::InteractionModel::Status SetNull(chip::EndpointId endpoint, MarkAttributeDirty markDirty)
-{
-    using Traits = NumericAttributeTraits<uint64_t>;
-    Traits::StorageType value;
-    Traits::SetNull(value);
-    uint8_t * writable = Traits::ToAttributeStoreRepresentation(value);
-    return emberAfWriteAttribute(endpoint, Clusters::EcosystemInformation::Id, Id, writable, ZCL_EPOCH_US_ATTRIBUTE_TYPE,
-                                 markDirty);
-}
-
-Protocols::InteractionModel::Status SetNull(chip::EndpointId endpoint)
-{
-    using Traits = NumericAttributeTraits<uint64_t>;
-    Traits::StorageType value;
-    Traits::SetNull(value);
-    uint8_t * writable = Traits::ToAttributeStoreRepresentation(value);
-    return emberAfWriteAttribute(endpoint, Clusters::EcosystemInformation::Id, Id, writable, ZCL_EPOCH_US_ATTRIBUTE_TYPE);
-}
-
-Protocols::InteractionModel::Status Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullable<uint64_t> & value,
-                                        MarkAttributeDirty markDirty)
-{
-    if (value.IsNull())
-    {
-        return SetNull(endpoint, markDirty);
-    }
-
-    return Set(endpoint, value.Value(), markDirty);
-}
-
-Protocols::InteractionModel::Status Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullable<uint64_t> & value)
-{
-    if (value.IsNull())
-    {
-        return SetNull(endpoint);
-    }
-
-    return Set(endpoint, value.Value());
-}
-
-} // namespace RemovedOn
-
 namespace FeatureMap {
 
 Protocols::InteractionModel::Status Get(chip::EndpointId endpoint, uint32_t * value)
diff --git a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
index cab9691..5537692 100644
--- a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
+++ b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
@@ -5812,17 +5812,6 @@
 namespace EcosystemInformation {
 namespace Attributes {
 
-namespace RemovedOn {
-Protocols::InteractionModel::Status Get(chip::EndpointId endpoint, DataModel::Nullable<uint64_t> & value); // epoch_us
-Protocols::InteractionModel::Status Set(chip::EndpointId endpoint, uint64_t value);
-Protocols::InteractionModel::Status Set(chip::EndpointId endpoint, uint64_t value, MarkAttributeDirty markDirty);
-Protocols::InteractionModel::Status SetNull(chip::EndpointId endpoint);
-Protocols::InteractionModel::Status SetNull(chip::EndpointId endpoint, MarkAttributeDirty markDirty);
-Protocols::InteractionModel::Status Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullable<uint64_t> & value);
-Protocols::InteractionModel::Status Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullable<uint64_t> & value,
-                                        MarkAttributeDirty markDirty);
-} // namespace RemovedOn
-
 namespace FeatureMap {
 Protocols::InteractionModel::Status Get(chip::EndpointId endpoint, uint32_t * value); // bitmap32
 Protocols::InteractionModel::Status Set(chip::EndpointId endpoint, uint32_t value);
diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp
index ebe45c8..c394753 100644
--- a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp
+++ b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp
@@ -28890,8 +28890,6 @@
 {
     switch (path.mAttributeId)
     {
-    case Attributes::RemovedOn::TypeInfo::GetAttributeId():
-        return DataModel::Decode(reader, removedOn);
     case Attributes::DeviceDirectory::TypeInfo::GetAttributeId():
         return DataModel::Decode(reader, deviceDirectory);
     case Attributes::LocationDirectory::TypeInfo::GetAttributeId():
diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
index 35f77bf..3309b8e 100644
--- a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
+++ b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
@@ -41861,18 +41861,6 @@
 
 namespace Attributes {
 
-namespace RemovedOn {
-struct TypeInfo
-{
-    using Type             = chip::app::DataModel::Nullable<uint64_t>;
-    using DecodableType    = chip::app::DataModel::Nullable<uint64_t>;
-    using DecodableArgType = const chip::app::DataModel::Nullable<uint64_t> &;
-
-    static constexpr ClusterId GetClusterId() { return Clusters::EcosystemInformation::Id; }
-    static constexpr AttributeId GetAttributeId() { return Attributes::RemovedOn::Id; }
-    static constexpr bool MustUseTimedWrite() { return false; }
-};
-} // namespace RemovedOn
 namespace DeviceDirectory {
 struct TypeInfo
 {
@@ -41947,7 +41935,6 @@
 
         CHIP_ERROR Decode(TLV::TLVReader & reader, const ConcreteAttributePath & path);
 
-        Attributes::RemovedOn::TypeInfo::DecodableType removedOn;
         Attributes::DeviceDirectory::TypeInfo::DecodableType deviceDirectory;
         Attributes::LocationDirectory::TypeInfo::DecodableType locationDirectory;
         Attributes::GeneratedCommandList::TypeInfo::DecodableType generatedCommandList;
diff --git a/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h b/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h
index 85d56a9..6cb26b6 100644
--- a/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h
+++ b/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h
@@ -7490,16 +7490,12 @@
 namespace EcosystemInformation {
 namespace Attributes {
 
-namespace RemovedOn {
-static constexpr AttributeId Id = 0x00000000;
-} // namespace RemovedOn
-
 namespace DeviceDirectory {
-static constexpr AttributeId Id = 0x00000001;
+static constexpr AttributeId Id = 0x00000000;
 } // namespace DeviceDirectory
 
 namespace LocationDirectory {
-static constexpr AttributeId Id = 0x00000002;
+static constexpr AttributeId Id = 0x00000001;
 } // namespace LocationDirectory
 
 namespace GeneratedCommandList {
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
index a4f8cb7..e145de4 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
@@ -13802,9 +13802,8 @@
 | Commands:                                                           |        |
 |------------------------------------------------------------------------------|
 | Attributes:                                                         |        |
-| * RemovedOn                                                         | 0x0000 |
-| * DeviceDirectory                                                   | 0x0001 |
-| * LocationDirectory                                                 | 0x0002 |
+| * DeviceDirectory                                                   | 0x0000 |
+| * LocationDirectory                                                 | 0x0001 |
 | * GeneratedCommandList                                              | 0xFFF8 |
 | * AcceptedCommandList                                               | 0xFFF9 |
 | * EventList                                                         | 0xFFFA |
@@ -26807,7 +26806,6 @@
         // Attributes
         //
         make_unique<ReadAttribute>(Id, credsIssuerConfig),                                                                 //
-        make_unique<ReadAttribute>(Id, "removed-on", Attributes::RemovedOn::Id, credsIssuerConfig),                        //
         make_unique<ReadAttribute>(Id, "device-directory", Attributes::DeviceDirectory::Id, credsIssuerConfig),            //
         make_unique<ReadAttribute>(Id, "location-directory", Attributes::LocationDirectory::Id, credsIssuerConfig),        //
         make_unique<ReadAttribute>(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), //
@@ -26817,8 +26815,6 @@
         make_unique<ReadAttribute>(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig),                      //
         make_unique<ReadAttribute>(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig),            //
         make_unique<WriteAttribute<>>(Id, credsIssuerConfig),                                                              //
-        make_unique<WriteAttribute<chip::app::DataModel::Nullable<uint64_t>>>(
-            Id, "removed-on", 0, UINT64_MAX, Attributes::RemovedOn::Id, WriteCommandType::kForceWrite, credsIssuerConfig), //
         make_unique<WriteAttributeAsComplex<
             chip::app::DataModel::List<const chip::app::Clusters::EcosystemInformation::Structs::EcosystemDeviceStruct::Type>>>(
             Id, "device-directory", Attributes::DeviceDirectory::Id, WriteCommandType::kForceWrite, credsIssuerConfig), //
@@ -26839,7 +26835,6 @@
         make_unique<WriteAttribute<uint16_t>>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id,
                                               WriteCommandType::kForceWrite, credsIssuerConfig),                                //
         make_unique<SubscribeAttribute>(Id, credsIssuerConfig),                                                                 //
-        make_unique<SubscribeAttribute>(Id, "removed-on", Attributes::RemovedOn::Id, credsIssuerConfig),                        //
         make_unique<SubscribeAttribute>(Id, "device-directory", Attributes::DeviceDirectory::Id, credsIssuerConfig),            //
         make_unique<SubscribeAttribute>(Id, "location-directory", Attributes::LocationDirectory::Id, credsIssuerConfig),        //
         make_unique<SubscribeAttribute>(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), //
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
index 6d64b94..0efe192 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
+++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
@@ -18169,11 +18169,6 @@
     case EcosystemInformation::Id: {
         switch (path.mAttributeId)
         {
-        case EcosystemInformation::Attributes::RemovedOn::Id: {
-            chip::app::DataModel::Nullable<uint64_t> value;
-            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
-            return DataModelLogger::LogValue("RemovedOn", 1, value);
-        }
         case EcosystemInformation::Attributes::DeviceDirectory::Id: {
             chip::app::DataModel::DecodableList<
                 chip::app::Clusters::EcosystemInformation::Structs::EcosystemDeviceStruct::DecodableType>
diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
index 9c139be..e8aa884 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
@@ -163941,9 +163941,8 @@
 | Commands:                                                           |        |
 |------------------------------------------------------------------------------|
 | Attributes:                                                         |        |
-| * RemovedOn                                                         | 0x0000 |
-| * DeviceDirectory                                                   | 0x0001 |
-| * LocationDirectory                                                 | 0x0002 |
+| * DeviceDirectory                                                   | 0x0000 |
+| * LocationDirectory                                                 | 0x0001 |
 | * GeneratedCommandList                                              | 0xFFF8 |
 | * AcceptedCommandList                                               | 0xFFF9 |
 | * EventList                                                         | 0xFFFA |
@@ -163957,91 +163956,6 @@
 #if MTR_ENABLE_PROVISIONAL
 
 /*
- * Attribute RemovedOn
- */
-class ReadEcosystemInformationRemovedOn : public ReadAttribute {
-public:
-    ReadEcosystemInformationRemovedOn()
-        : ReadAttribute("removed-on")
-    {
-    }
-
-    ~ReadEcosystemInformationRemovedOn()
-    {
-    }
-
-    CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override
-    {
-        constexpr chip::ClusterId clusterId = chip::app::Clusters::EcosystemInformation::Id;
-        constexpr chip::AttributeId attributeId = chip::app::Clusters::EcosystemInformation::Attributes::RemovedOn::Id;
-
-        ChipLogProgress(chipTool, "Sending cluster (0x%08" PRIX32 ") ReadAttribute (0x%08" PRIX32 ") on endpoint %u", endpointId, clusterId, attributeId);
-
-        dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        __auto_type * cluster = [[MTRBaseClusterEcosystemInformation alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        [cluster readAttributeRemovedOnWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"EcosystemInformation.RemovedOn response %@", [value description]);
-            if (error == nil) {
-                RemoteDataModelLogger::LogAttributeAsJSON(@(endpointId), @(clusterId), @(attributeId), value);
-            } else {
-                LogNSError("EcosystemInformation RemovedOn read Error", error);
-                RemoteDataModelLogger::LogAttributeErrorAsJSON(@(endpointId), @(clusterId), @(attributeId), error);
-            }
-            SetCommandExitStatus(error);
-        }];
-        return CHIP_NO_ERROR;
-    }
-};
-
-class SubscribeAttributeEcosystemInformationRemovedOn : public SubscribeAttribute {
-public:
-    SubscribeAttributeEcosystemInformationRemovedOn()
-        : SubscribeAttribute("removed-on")
-    {
-    }
-
-    ~SubscribeAttributeEcosystemInformationRemovedOn()
-    {
-    }
-
-    CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override
-    {
-        constexpr chip::ClusterId clusterId = chip::app::Clusters::EcosystemInformation::Id;
-        constexpr chip::CommandId attributeId = chip::app::Clusters::EcosystemInformation::Attributes::RemovedOn::Id;
-
-        ChipLogProgress(chipTool, "Sending cluster (0x%08" PRIX32 ") ReportAttribute (0x%08" PRIX32 ") on endpoint %u", clusterId, attributeId, endpointId);
-        dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        __auto_type * cluster = [[MTRBaseClusterEcosystemInformation alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
-        if (mKeepSubscriptions.HasValue()) {
-            params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
-        }
-        if (mFabricFiltered.HasValue()) {
-            params.filterByFabric = mFabricFiltered.Value();
-        }
-        if (mAutoResubscribe.HasValue()) {
-            params.resubscribeAutomatically = mAutoResubscribe.Value();
-        }
-        [cluster subscribeAttributeRemovedOnWithParams:params
-            subscriptionEstablished:^() { mSubscriptionEstablished = YES; }
-            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"EcosystemInformation.RemovedOn response %@", [value description]);
-                if (error == nil) {
-                    RemoteDataModelLogger::LogAttributeAsJSON(@(endpointId), @(clusterId), @(attributeId), value);
-                } else {
-                    RemoteDataModelLogger::LogAttributeErrorAsJSON(@(endpointId), @(clusterId), @(attributeId), error);
-                }
-                SetCommandExitStatus(error);
-            }];
-
-        return CHIP_NO_ERROR;
-    }
-};
-
-#endif // MTR_ENABLE_PROVISIONAL
-#if MTR_ENABLE_PROVISIONAL
-
-/*
  * Attribute DeviceDirectory
  */
 class ReadEcosystemInformationDeviceDirectory : public ReadAttribute {
@@ -198491,10 +198405,6 @@
         make_unique<WriteAttribute>(Id), //
         make_unique<SubscribeAttribute>(Id), //
 #if MTR_ENABLE_PROVISIONAL
-        make_unique<ReadEcosystemInformationRemovedOn>(), //
-        make_unique<SubscribeAttributeEcosystemInformationRemovedOn>(), //
-#endif // MTR_ENABLE_PROVISIONAL
-#if MTR_ENABLE_PROVISIONAL
         make_unique<ReadEcosystemInformationDeviceDirectory>(), //
         make_unique<SubscribeAttributeEcosystemInformationDeviceDirectory>(), //
 #endif // MTR_ENABLE_PROVISIONAL