diff --git a/tlbmc/central_config.proto b/tlbmc/central_config.proto
index 6cd91a3..0c8783b 100644
--- a/tlbmc/central_config.proto
+++ b/tlbmc/central_config.proto
@@ -15,12 +15,6 @@
   // TODO(b/444223906): this is a temporary solution and should be removed once
   // cables are supported.
   bool own_cables_in_redfish = 3 [default = true];
-
-  // If true, we can have multiple tlBMC Json Configs probe to the same raw FRU.
-  // This should be a VERY rare case as every config should either have a unique
-  // FRU or we can use FOUND syntax to assume a config exists. Please reach out
-  // to tlBMC team if you believe you need this feature.
-  bool multiple_configs_probe_raw_fru = 4 [default = false];
 }
 
 // Performs Thermal control using sensors in tlBMC.
diff --git a/tlbmc/configs/entity_config_json_impl.cc b/tlbmc/configs/entity_config_json_impl.cc
index 6d8480f..577b2e4 100644
--- a/tlbmc/configs/entity_config_json_impl.cc
+++ b/tlbmc/configs/entity_config_json_impl.cc
@@ -51,6 +51,7 @@
 #include "hwmon_temp_sensor_config.pb.h"
 #include "intel_cpu_sensor_config.pb.h"
 #include "nic_telemetry_config.pb.h"
+#include "veeprom.pb.h"
 #include "psu_sensor_config.pb.h"
 #include "reading_range_config.pb.h"
 #include "reading_transform_config.pb.h"
@@ -58,7 +59,6 @@
 #include "threshold_config.pb.h"
 #include "topology_config.pb.h"
 #include "virtual_sensor_config.pb.h"
-#include "veeprom.pb.h"
 #include "tlbmc/rcu/simple_rcu.h"
 #include "tlbmc/redfish/data/stable_id.h"
 #include "fru.pb.h"
@@ -1802,7 +1802,7 @@
 }
 
 absl::StatusOr<std::vector<nic_veeprom::NicTelemetryName>>
-EntityConfigJsonImpl::ParseNicTelemetryNames(const nlohmann::json& config) {
+  EntityConfigJsonImpl::ParseNicTelemetryNames(const nlohmann::json& config) {
   const nlohmann::json::array_t* telemetry_names =
       GetValueAsArray(config, "TelemetryNames");
   if (telemetry_names == nullptr) {
@@ -2571,9 +2571,11 @@
                      config.dump()));
   }
   if (*version == "v1" || *version == "V1") {
-    nic_telemetry_config.set_version(nic_veeprom::NIC_TELEMETRY_VERSION_V1);
+    nic_telemetry_config.set_version(
+        nic_veeprom::NIC_TELEMETRY_VERSION_V1);
   } else if (*version == "v2" || *version == "V2") {
-    nic_telemetry_config.set_version(nic_veeprom::NIC_TELEMETRY_VERSION_V2);
+    nic_telemetry_config.set_version(
+        nic_veeprom::NIC_TELEMETRY_VERSION_V2);
   } else {
     return absl::InvalidArgumentError(absl::StrCat(
         "Invalid config: element does not have a supported Version field: ",
@@ -2773,43 +2775,6 @@
   return absl::OkStatus();
 }
 
-absl::Status EntityConfigJsonImpl::ValidateTopology(
-    const absl::flat_hash_set<absl::string_view>& expected_nodes_traversed,
-    const absl::flat_hash_set<absl::string_view>& nodes_traversed) {
-  if (expected_nodes_traversed != nodes_traversed) {
-    // Since the BFS through the topology will validate every fru key, if we
-    // traverse through more nodes than expected, that means there are multiple
-    // configs probing the same fru key.
-    if (GetTlbmcConfig()
-            .fru_collector_module()
-            .multiple_configs_probe_raw_fru() &&
-        nodes_traversed.size() > expected_nodes_traversed.size()) {
-      return absl::OkStatus();
-    }
-
-    std::vector<absl::string_view> missing_nodes;
-    for (const auto& node : expected_nodes_traversed) {
-      if (nodes_traversed.find(node) == nodes_traversed.end()) {
-        missing_nodes.push_back(node);
-      }
-    }
-    std::vector<absl::string_view> unexpected_nodes;
-    for (const auto& node : nodes_traversed) {
-      if (expected_nodes_traversed.find(node) ==
-          expected_nodes_traversed.end()) {
-        unexpected_nodes.push_back(node);
-      }
-    }
-    return absl::InternalError(absl::Substitute(
-        "The following FRUs are not connected to the topology: $0, which "
-        "means the config in this machine is not fully tested by tlBMC. The "
-        "following FRUs were found in the topology, but not expected: $1",
-        absl::StrJoin(missing_nodes, ", "),
-        absl::StrJoin(unexpected_nodes, ", ")));
-  }
-  return absl::OkStatus();
-}
-
 absl::Status EntityConfigJsonImpl::CreateAssociationsBetweenTopologyConfigNodes(
     TopologyConfig& topology_config, FruTable& fru_table,
     absl::flat_hash_set<absl::string_view>& expected_nodes_traversed) {
@@ -2949,7 +2914,29 @@
       node_queue.push(&downstream_node);
     }
   }
-  return ValidateTopology(expected_nodes_traversed, nodes_traversed);
+
+  if (expected_nodes_traversed != nodes_traversed) {
+    std::vector<absl::string_view> missing_nodes;
+    for (const auto& node : expected_nodes_traversed) {
+      if (nodes_traversed.find(node) == nodes_traversed.end()) {
+        missing_nodes.push_back(node);
+      }
+    }
+    std::vector<absl::string_view> unexpected_nodes;
+    for (const auto& node : nodes_traversed) {
+      if (expected_nodes_traversed.find(node) ==
+          expected_nodes_traversed.end()) {
+        unexpected_nodes.push_back(node);
+      }
+    }
+    return absl::InternalError(absl::Substitute(
+        "The following FRUs are not connected to the topology: $0, which "
+        "means the config in this machine is not fully tested by tlBMC. The "
+        "following FRUs were found in the topology, but not expected: $1",
+        absl::StrJoin(missing_nodes, ", "),
+        absl::StrJoin(unexpected_nodes, ", ")));
+  }
+  return absl::OkStatus();
 }
 
 absl::StatusOr<const TopologyConfigNode*> EntityConfigJsonImpl::GetFruTopology(
diff --git a/tlbmc/configs/entity_config_json_impl.h b/tlbmc/configs/entity_config_json_impl.h
index 067d9d8..37658af 100644
--- a/tlbmc/configs/entity_config_json_impl.h
+++ b/tlbmc/configs/entity_config_json_impl.h
@@ -137,10 +137,6 @@
   static absl::StatusOr<std::vector<nlohmann::json>>
   ParseJsonFilesIntoConfigList(absl::string_view config_location);
 
-  static absl::Status ValidateTopology(
-      const absl::flat_hash_set<absl::string_view>& expected_nodes_traversed,
-      const absl::flat_hash_set<absl::string_view>& nodes_traversed);
-
   absl::StatusOr<absl::Span<const HwmonTempSensorConfig>>
   GetAllHwmonTempSensorConfigs() const override {
     ECCLESIA_RETURN_IF_ERROR(GetParsedStatus());
