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
