diff --git a/include/NVMeSensor.hpp b/include/NVMeSensor.hpp
index e58e3c7..4e0000f 100644
--- a/include/NVMeSensor.hpp
+++ b/include/NVMeSensor.hpp
@@ -6,8 +6,7 @@
 class NVMeSensor : public Sensor
 {
   public:
-    static constexpr const char* configType =
-        "xyz.openbmc_project.Configuration.NVME1000";
+    static constexpr const char* sensorType = "NVME1000";
 
     NVMeSensor(sdbusplus::asio::object_server& objectServer,
                boost::asio::io_service& io,
diff --git a/include/Utils.hpp b/include/Utils.hpp
index 2d6bac3..b39492e 100644
--- a/include/Utils.hpp
+++ b/include/Utils.hpp
@@ -91,6 +91,14 @@
 
 bool readingStateGood(const PowerState& powerState);
 
+constexpr const char* configInterfacePrefix =
+    "xyz.openbmc_project.Configuration.";
+
+inline std::string configInterfaceName(const std::string& type)
+{
+    return std::string(configInterfacePrefix) + type;
+}
+
 namespace mapper
 {
 constexpr const char* busName = "xyz.openbmc_project.ObjectMapper";
@@ -258,7 +266,7 @@
             interface);
     }
 
-    void getConfiguration(const std::vector<std::string>& interfaces,
+    void getConfiguration(const std::vector<std::string>& types,
                           size_t retries = 0)
     {
         if (retries > 5)
@@ -266,6 +274,12 @@
             retries = 5;
         }
 
+        std::vector<std::string> interfaces(types.size());
+        for (const auto& type : types)
+        {
+            interfaces.push_back(configInterfaceName(type));
+        }
+
         std::shared_ptr<GetSensorConfiguration> self = shared_from_this();
         dbusConnection->async_method_call(
             [self, interfaces, retries](const boost::system::error_code ec,
diff --git a/include/sensor.hpp b/include/sensor.hpp
index 2bc55f5..290b78b 100644
--- a/include/sensor.hpp
+++ b/include/sensor.hpp
@@ -63,7 +63,8 @@
            std::shared_ptr<sdbusplus::asio::connection>& conn,
            PowerState readState = PowerState::always) :
         name(sensor_paths::escapePathForDbus(name)),
-        configurationPath(configurationPath), objectType(objectType),
+        configurationPath(configurationPath),
+        objectType(configInterfaceName(objectType)),
         isSensorSettable(isSettable), isValueMutable(isMutable), maxValue(max),
         minValue(min), thresholds(std::move(thresholdData)),
         hysteresisTrigger((max - min) * 0.01),
diff --git a/src/ADCSensor.cpp b/src/ADCSensor.cpp
index 4d47762..eacce22 100644
--- a/src/ADCSensor.cpp
+++ b/src/ADCSensor.cpp
@@ -49,9 +49,8 @@
                      const std::string& sensorConfiguration,
                      std::optional<BridgeGpio>&& bridgeGpio) :
     Sensor(escapeName(sensorName), std::move(thresholdsIn), sensorConfiguration,
-           "xyz.openbmc_project.Configuration.ADC", false, false,
-           maxVoltageReading / scaleFactor, minVoltageReading / scaleFactor,
-           conn, readState),
+           "ADC", false, false, maxVoltageReading / scaleFactor,
+           minVoltageReading / scaleFactor, conn, readState),
     objServer(objectServer), inputDev(io), waitTimer(io), path(path),
     scaleFactor(scaleFactor),
     sensorPollMs(static_cast<unsigned int>(pollRate * 1000)),
diff --git a/src/ADCSensorMain.cpp b/src/ADCSensorMain.cpp
index 3669330..a2f6514 100644
--- a/src/ADCSensorMain.cpp
+++ b/src/ADCSensorMain.cpp
@@ -39,8 +39,7 @@
 
 namespace fs = std::filesystem;
 
-static constexpr auto sensorTypes{
-    std::to_array<const char*>({"xyz.openbmc_project.Configuration.ADC"})};
+static constexpr auto sensorTypes{std::to_array<const char*>({"ADC"})};
 static std::regex inputRegex(R"(in(\d+)_input)");
 
 static boost::container::flat_map<size_t, bool> cpuPresence;
@@ -120,7 +119,7 @@
                 // find base configuration
                 for (const char* type : sensorTypes)
                 {
-                    auto sensorBase = cfgData.find(type);
+                    auto sensorBase = cfgData.find(configInterfaceName(type));
                     if (sensorBase != cfgData.end())
                     {
                         baseConfiguration = &(*sensorBase);
diff --git a/src/ExitAirTempSensor.cpp b/src/ExitAirTempSensor.cpp
index ea5a432..33fd079 100644
--- a/src/ExitAirTempSensor.cpp
+++ b/src/ExitAirTempSensor.cpp
@@ -37,9 +37,8 @@
 #include <vector>
 
 constexpr const double altitudeFactor = 1.14;
-constexpr const char* exitAirIface =
-    "xyz.openbmc_project.Configuration.ExitAirTempSensor";
-constexpr const char* cfmIface = "xyz.openbmc_project.Configuration.CFMSensor";
+constexpr const char* exitAirType = "ExitAirTempSensor";
+constexpr const char* cfmType = "CFMSensor";
 
 // todo: this *might* need to be configurable
 constexpr const char* inletTemperatureSensor = "temperature/Front_Panel_Temp";
@@ -56,8 +55,8 @@
 
 static constexpr size_t minSystemCfm = 50;
 
-constexpr const auto monitorIfaces{
-    std::to_array<const char*>({exitAirIface, cfmIface})};
+constexpr const auto monitorTypes{
+    std::to_array<const char*>({exitAirType, cfmType})};
 
 static std::vector<std::shared_ptr<CFMSensor>> cfmSensors;
 
@@ -160,8 +159,8 @@
                      std::vector<thresholds::Threshold>&& thresholdData,
                      std::shared_ptr<ExitAirTempSensor>& parent) :
     Sensor(escapeName(sensorName), std::move(thresholdData),
-           sensorConfiguration, "xyz.openbmc_project.Configuration.CFMSensor",
-           false, false, cfmMaxReading, cfmMinReading, conn, PowerState::on),
+           sensorConfiguration, "CFMSensor", false, false, cfmMaxReading,
+           cfmMinReading, conn, PowerState::on),
     parent(parent), objServer(objectServer)
 {
     sensorInterface = objectServer.add_interface(
@@ -497,9 +496,8 @@
     sdbusplus::asio::object_server& objectServer,
     std::vector<thresholds::Threshold>&& thresholdData) :
     Sensor(escapeName(sensorName), std::move(thresholdData),
-           sensorConfiguration, "xyz.openbmc_project.Configuration.ExitAirTemp",
-           false, false, exitAirMaxReading, exitAirMinReading, conn,
-           PowerState::on),
+           sensorConfiguration, "ExitAirTemp", false, false, exitAirMaxReading,
+           exitAirMinReading, conn, PowerState::on),
     objServer(objectServer)
 {
     sensorInterface = objectServer.add_interface(
@@ -873,7 +871,7 @@
         {
             for (const auto& [intf, cfg] : interfaces)
             {
-                if (intf == exitAirIface)
+                if (intf == configInterfaceName(exitAirType))
                 {
                     // thresholds should be under the same path
                     std::vector<thresholds::Threshold> sensorThresholds;
@@ -892,7 +890,7 @@
                     exitAirSensor->alphaS = loadVariant<double>(cfg, "AlphaS");
                     exitAirSensor->alphaF = loadVariant<double>(cfg, "AlphaF");
                 }
-                else if (intf == cfmIface)
+                else if (intf == configInterfaceName(cfmType))
                 {
                     // thresholds should be under the same path
                     std::vector<thresholds::Threshold> sensorThresholds;
@@ -925,7 +923,7 @@
         }
         });
     getter->getConfiguration(
-        std::vector<std::string>(monitorIfaces.begin(), monitorIfaces.end()));
+        std::vector<std::string>(monitorTypes.begin(), monitorTypes.end()));
 }
 
 int main()
@@ -959,7 +957,7 @@
         });
     };
     std::vector<std::unique_ptr<sdbusplus::bus::match_t>> matches =
-        setupPropertiesChangedMatches(*systemBus, monitorIfaces, eventHandler);
+        setupPropertiesChangedMatches(*systemBus, monitorTypes, eventHandler);
 
     setupManufacturingModeMatch(*systemBus);
     io.run();
diff --git a/src/ExternalSensorMain.cpp b/src/ExternalSensorMain.cpp
index e04fc78..e79098f 100644
--- a/src/ExternalSensorMain.cpp
+++ b/src/ExternalSensorMain.cpp
@@ -51,8 +51,7 @@
 
 static constexpr bool debug = false;
 
-static const char* sensorType =
-    "xyz.openbmc_project.Configuration.ExternalSensor";
+static const char* sensorType = "ExternalSensor";
 
 void updateReaper(boost::container::flat_map<
                       std::string, std::shared_ptr<ExternalSensor>>& sensors,
@@ -172,7 +171,7 @@
             const std::string& interfacePath = sensor.first.str;
             const SensorData& sensorData = sensor.second;
 
-            auto sensorBase = sensorData.find(sensorType);
+            auto sensorBase = sensorData.find(configInterfaceName(sensorType));
             if (sensorBase == sensorData.end())
             {
                 std::cerr << "Base configuration not found for "
diff --git a/src/FanMain.cpp b/src/FanMain.cpp
index 6732575..4e7542b 100644
--- a/src/FanMain.cpp
+++ b/src/FanMain.cpp
@@ -40,10 +40,8 @@
 namespace fs = std::filesystem;
 
 // The following two structures need to be consistent
-static auto sensorTypes{std::to_array<const char*>(
-    {"xyz.openbmc_project.Configuration.AspeedFan",
-     "xyz.openbmc_project.Configuration.I2CFan",
-     "xyz.openbmc_project.Configuration.NuvotonFan"})};
+static auto sensorTypes{
+    std::to_array<const char*>({"AspeedFan", "I2CFan", "NuvotonFan"})};
 
 enum FanTypes
 {
@@ -237,6 +235,7 @@
 
             fs::path directory = path.parent_path();
             FanTypes fanType = getFanType(directory);
+            std::string cfgIntf = configInterfaceName(sensorTypes[fanType]);
 
             // convert to 0 based
             size_t index = std::stoul(indexStr) - 1;
@@ -249,7 +248,7 @@
             {
                 // find the base of the configuration to see if indexes
                 // match
-                auto sensorBaseFind = cfgData.find(sensorTypes[fanType]);
+                auto sensorBaseFind = cfgData.find(cfgIntf);
                 if (sensorBaseFind == cfgData.end())
                 {
                     continue;
@@ -364,7 +363,7 @@
             }
 
             auto presenceConfig =
-                sensorData->find(baseType + std::string(".Presence"));
+                sensorData->find(cfgIntf + std::string(".Presence"));
 
             std::unique_ptr<PresenceSensor> presenceSensor(nullptr);
 
@@ -410,7 +409,7 @@
                 std::make_pair(defaultMinReading, defaultMaxReading);
 
             auto connector =
-                sensorData->find(baseType + std::string(".Connector"));
+                sensorData->find(cfgIntf + std::string(".Connector"));
 
             std::optional<std::string> led;
             std::string pwmName;
diff --git a/src/HwmonTempMain.cpp b/src/HwmonTempMain.cpp
index 1431508..5a773b2 100644
--- a/src/HwmonTempMain.cpp
+++ b/src/HwmonTempMain.cpp
@@ -48,29 +48,11 @@
 static constexpr double minValueTemperature = -128; // DegreesC
 
 namespace fs = std::filesystem;
-static auto sensorTypes{
-    std::to_array<const char*>({"xyz.openbmc_project.Configuration.DPS310",
-                                "xyz.openbmc_project.Configuration.EMC1412",
-                                "xyz.openbmc_project.Configuration.EMC1413",
-                                "xyz.openbmc_project.Configuration.EMC1414",
-                                "xyz.openbmc_project.Configuration.HDC1080",
-                                "xyz.openbmc_project.Configuration.JC42",
-                                "xyz.openbmc_project.Configuration.LM75A",
-                                "xyz.openbmc_project.Configuration.LM95234",
-                                "xyz.openbmc_project.Configuration.MAX31725",
-                                "xyz.openbmc_project.Configuration.MAX31730",
-                                "xyz.openbmc_project.Configuration.MAX6581",
-                                "xyz.openbmc_project.Configuration.MAX6654",
-                                "xyz.openbmc_project.Configuration.NCT7802",
-                                "xyz.openbmc_project.Configuration.NCT6779",
-                                "xyz.openbmc_project.Configuration.SBTSI",
-                                "xyz.openbmc_project.Configuration.SI7020",
-                                "xyz.openbmc_project.Configuration.TMP112",
-                                "xyz.openbmc_project.Configuration.TMP175",
-                                "xyz.openbmc_project.Configuration.TMP421",
-                                "xyz.openbmc_project.Configuration.TMP441",
-                                "xyz.openbmc_project.Configuration.TMP75",
-                                "xyz.openbmc_project.Configuration.W83773G"})};
+static auto sensorTypes{std::to_array<const char*>(
+    {"DPS310",  "EMC1412", "EMC1413",  "EMC1414",  "HDC1080", "JC42",
+     "LM75A",   "LM95234", "MAX31725", "MAX31730", "MAX6581", "MAX6654",
+     "NCT7802", "NCT6779", "SBTSI",    "SI7020",   "TMP112",  "TMP175",
+     "TMP421",  "TMP441",  "TMP75",    "W83773G"})};
 
 static struct SensorParams
     getSensorParameters(const std::filesystem::path& path)
diff --git a/src/IntelCPUSensorMain.cpp b/src/IntelCPUSensorMain.cpp
index 2780c1f..485729b 100644
--- a/src/IntelCPUSensorMain.cpp
+++ b/src/IntelCPUSensorMain.cpp
@@ -89,8 +89,7 @@
 
 namespace fs = std::filesystem;
 
-static constexpr auto sensorTypes{
-    std::to_array<const char*>({"xyz.openbmc_project.Configuration.XeonCPU"})};
+static constexpr auto sensorTypes{std::to_array<const char*>({"XeonCPU"})};
 static constexpr auto hiddenProps{std::to_array<const char*>(
     {IntelCPUSensor::labelTcontrol, "Tthrottle", "Tjmax"})};
 
@@ -244,7 +243,8 @@
             for (const char* type : sensorTypes)
             {
                 sensorType = type;
-                auto sensorBase = sensorData->find(sensorType);
+                auto sensorBase =
+                    sensorData->find(configInterfaceName(sensorType));
                 if (sensorBase != sensorData->end())
                 {
                     baseConfiguration = &(*sensorBase);
@@ -623,7 +623,7 @@
         {
             for (const auto& [intf, cfg] : cfgData)
             {
-                if (intf != type)
+                if (intf != configInterfaceName(type))
                 {
                     continue;
                 }
diff --git a/src/IntrusionSensorMain.cpp b/src/IntrusionSensorMain.cpp
index f85b1a6..f46254f 100644
--- a/src/IntrusionSensorMain.cpp
+++ b/src/IntrusionSensorMain.cpp
@@ -43,9 +43,8 @@
 
 static constexpr bool debug = false;
 
-static constexpr const char* sensorType =
-    "xyz.openbmc_project.Configuration.ChassisIntrusionSensor";
-static constexpr const char* nicType = "xyz.openbmc_project.Configuration.NIC";
+static constexpr const char* sensorType = "ChassisIntrusionSensor";
+static constexpr const char* nicType = "NIC";
 static constexpr auto nicTypes{std::to_array<const char*>({nicType})};
 
 namespace fs = std::filesystem;
@@ -77,7 +76,7 @@
         sensorData = &cfgData;
 
         // match sensor type
-        auto sensorBase = sensorData->find(sensorType);
+        auto sensorBase = sensorData->find(configInterfaceName(sensorType));
         if (sensorBase == sensorData->end())
         {
             std::cerr << "error finding base configuration \n";
@@ -188,7 +187,7 @@
                     baseConfiguration = nullptr;
 
                 // find base configuration
-                auto sensorBase = cfgData.find(nicType);
+                auto sensorBase = cfgData.find(configInterfaceName(nicType));
                 if (sensorBase == cfgData.end())
                 {
                     continue;
@@ -473,8 +472,8 @@
         sdbusplus::bus::match_t lanConfigMatch(
             static_cast<sdbusplus::bus_t&>(*systemBus),
             "type='signal', member='PropertiesChanged',path_namespace='" +
-                std::string(inventoryPath) + "',arg0namespace='" + nicType +
-                "'",
+                std::string(inventoryPath) + "',arg0namespace='" +
+                configInterfaceName(nicType) + "'",
             [&systemBus](sdbusplus::message_t& msg) {
             if (msg.is_method_error())
             {
diff --git a/src/IpmbSensor.cpp b/src/IpmbSensor.cpp
index 9d087a7..7c5f965 100644
--- a/src/IpmbSensor.cpp
+++ b/src/IpmbSensor.cpp
@@ -36,8 +36,7 @@
 
 constexpr const bool debug = false;
 
-constexpr const char* configInterface =
-    "xyz.openbmc_project.Configuration.IpmbSensor";
+constexpr const char* sensorType = "IpmbSensor";
 static constexpr double ipmbMaxReading = 0xFF;
 static constexpr double ipmbMinReading = 0;
 
@@ -64,8 +63,8 @@
                        uint8_t deviceAddress, uint8_t hostSMbusIndex,
                        const float pollRate, std::string& sensorTypeName) :
     Sensor(escapeName(sensorName), std::move(thresholdData),
-           sensorConfiguration, "xyz.openbmc_project.Configuration.IpmbSensor",
-           false, false, ipmbMaxReading, ipmbMinReading, conn, PowerState::on),
+           sensorConfiguration, "IpmbSensor", false, false, ipmbMaxReading,
+           ipmbMinReading, conn, PowerState::on),
     deviceAddress(deviceAddress), hostSMbusIndex(hostSMbusIndex),
     sensorPollMs(static_cast<int>(pollRate * 1000)), objectServer(objectServer),
     waitTimer(io)
@@ -499,7 +498,7 @@
         {
             for (const auto& [intf, cfg] : interfaces)
             {
-                if (intf != configInterface)
+                if (intf != configInterfaceName(sensorType))
                 {
                     continue;
                 }
@@ -640,8 +639,7 @@
 
     std::vector<std::unique_ptr<sdbusplus::bus::match_t>> matches =
         setupPropertiesChangedMatches(
-            *systemBus, std::to_array<const char*>({configInterface}),
-            eventHandler);
+            *systemBus, std::to_array<const char*>({sensorType}), eventHandler);
 
     sdbusplus::bus::match_t powerChangeMatch(
         static_cast<sdbusplus::bus_t&>(*systemBus),
diff --git a/src/MCUTempSensor.cpp b/src/MCUTempSensor.cpp
index 8c96154..47893d2 100644
--- a/src/MCUTempSensor.cpp
+++ b/src/MCUTempSensor.cpp
@@ -39,8 +39,7 @@
 
 constexpr const bool debug = false;
 
-constexpr const char* configInterface =
-    "xyz.openbmc_project.Configuration.MCUTempSensor";
+constexpr const char* sensorType = "MCUTempSensor";
 static constexpr double mcuTempMaxReading = 0xFF;
 static constexpr double mcuTempMinReading = 0;
 
@@ -55,8 +54,7 @@
                              uint8_t busId, uint8_t mcuAddress,
                              uint8_t tempReg) :
     Sensor(escapeName(sensorName), std::move(thresholdData),
-           sensorConfiguration,
-           "xyz.openbmc_project.Configuration.MCUTempSensor", false, false,
+           sensorConfiguration, "MCUTempSensor", false, false,
            mcuTempMaxReading, mcuTempMinReading, conn),
     busId(busId), mcuAddress(mcuAddress), tempReg(tempReg),
     objectServer(objectServer), waitTimer(io)
@@ -210,7 +208,7 @@
         {
             for (const auto& [intf, cfg] : interfaces)
             {
-                if (intf != configInterface)
+                if (intf != configInterfaceName(sensorType))
                 {
                     continue;
                 }
@@ -292,8 +290,7 @@
 
     std::vector<std::unique_ptr<sdbusplus::bus::match_t>> matches =
         setupPropertiesChangedMatches(
-            *systemBus, std::to_array<const char*>({configInterface}),
-            eventHandler);
+            *systemBus, std::to_array<const char*>({sensorType}), eventHandler);
     setupManufacturingModeMatch(*systemBus);
     io.run();
     return 0;
diff --git a/src/NVMeSensor.cpp b/src/NVMeSensor.cpp
index a5257f5..d32d166 100644
--- a/src/NVMeSensor.cpp
+++ b/src/NVMeSensor.cpp
@@ -29,7 +29,7 @@
                        const std::string& sensorConfiguration,
                        const int busNumber) :
     Sensor(escapeName(sensorName), std::move(thresholdsIn), sensorConfiguration,
-           NVMeSensor::configType, false, false, maxReading, minReading, conn,
+           NVMeSensor::sensorType, false, false, maxReading, minReading, conn,
            PowerState::on),
     bus(busNumber), objServer(objectServer)
 {
diff --git a/src/NVMeSensorMain.cpp b/src/NVMeSensorMain.cpp
index 71993d2..1398d3c 100644
--- a/src/NVMeSensorMain.cpp
+++ b/src/NVMeSensorMain.cpp
@@ -125,7 +125,8 @@
     for (const auto& [interfacePath, sensorData] : sensorConfigurations)
     {
         // find base configuration
-        auto sensorBase = sensorData.find(NVMeSensor::configType);
+        auto sensorBase =
+            sensorData.find(configInterfaceName(NVMeSensor::sensorType));
         if (sensorBase == sensorData.end())
         {
             continue;
@@ -189,7 +190,7 @@
             handleSensorConfigurations(io, objectServer, dbusConnection,
                                        sensorConfigurations);
         });
-    getter->getConfiguration(std::vector<std::string>{NVMeSensor::configType});
+    getter->getConfiguration(std::vector<std::string>{NVMeSensor::sensorType});
 }
 
 static void interfaceRemoved(sdbusplus::message_t& message, NVMEMap& contexts)
@@ -258,7 +259,7 @@
 
     std::vector<std::unique_ptr<sdbusplus::bus::match_t>> matches =
         setupPropertiesChangedMatches(
-            *systemBus, std::to_array<const char*>({NVMeSensor::configType}),
+            *systemBus, std::to_array<const char*>({NVMeSensor::sensorType}),
             eventHandler);
 
     // Watch for entity-manager to remove configuration interfaces
diff --git a/src/PSUSensorMain.cpp b/src/PSUSensorMain.cpp
index e485598..0a197b8 100644
--- a/src/PSUSensorMain.cpp
+++ b/src/PSUSensorMain.cpp
@@ -40,43 +40,14 @@
 static constexpr bool debug = false;
 
 static constexpr auto sensorTypes{std::to_array<const char*>(
-    {"xyz.openbmc_project.Configuration.ADM1266",
-     "xyz.openbmc_project.Configuration.ADM1272",
-     "xyz.openbmc_project.Configuration.ADM1275",
-     "xyz.openbmc_project.Configuration.ADM1278",
-     "xyz.openbmc_project.Configuration.ADM1293",
-     "xyz.openbmc_project.Configuration.ADS7830",
-     "xyz.openbmc_project.Configuration.BMR490",
-     "xyz.openbmc_project.Configuration.DPS800",
-     "xyz.openbmc_project.Configuration.INA219",
-     "xyz.openbmc_project.Configuration.INA230",
-     "xyz.openbmc_project.Configuration.IPSPS",
-     "xyz.openbmc_project.Configuration.ISL68137",
-     "xyz.openbmc_project.Configuration.ISL68220",
-     "xyz.openbmc_project.Configuration.ISL68223",
-     "xyz.openbmc_project.Configuration.ISL69225",
-     "xyz.openbmc_project.Configuration.ISL69243",
-     "xyz.openbmc_project.Configuration.ISL69260",
-     "xyz.openbmc_project.Configuration.LM25066",
-     "xyz.openbmc_project.Configuration.MAX16601",
-     "xyz.openbmc_project.Configuration.MAX20710",
-     "xyz.openbmc_project.Configuration.MAX20730",
-     "xyz.openbmc_project.Configuration.MAX20734",
-     "xyz.openbmc_project.Configuration.MAX20796",
-     "xyz.openbmc_project.Configuration.MAX34451",
-     "xyz.openbmc_project.Configuration.MP2971",
-     "xyz.openbmc_project.Configuration.MP2973",
-     "xyz.openbmc_project.Configuration.MP5023",
-     "xyz.openbmc_project.Configuration.pmbus",
-     "xyz.openbmc_project.Configuration.PXE1610",
-     "xyz.openbmc_project.Configuration.RAA228000",
-     "xyz.openbmc_project.Configuration.RAA228228",
-     "xyz.openbmc_project.Configuration.RAA228620",
-     "xyz.openbmc_project.Configuration.RAA229001",
-     "xyz.openbmc_project.Configuration.RAA229004",
-     "xyz.openbmc_project.Configuration.RAA229126",
-     "xyz.openbmc_project.Configuration.TPS546D24",
-     "xyz.openbmc_project.Configuration.XDPE12284"})};
+    {"ADM1266",   "ADM1272",   "ADM1275",   "ADM1278",   "ADM1293",
+     "ADS7830",   "BMR490",    "DPS800",    "INA219",    "INA230",
+     "IPSPS",     "ISL68137",  "ISL68220",  "ISL68223",  "ISL69225",
+     "ISL69243",  "ISL69260",  "LM25066",   "MAX16601",  "MAX20710",
+     "MAX20730",  "MAX20734",  "MAX20796",  "MAX34451",  "MP2971",
+     "MP2973",    "MP5023",    "pmbus",     "PXE1610",   "RAA228000",
+     "RAA228228", "RAA228620", "RAA229001", "RAA229004", "RAA229126",
+     "TPS546D24", "XDPE12284"})};
 
 // clang-format off
 static constexpr auto pmbusNames{std::to_array<const char*>({
@@ -395,7 +366,7 @@
             sensorData = &cfgData;
             for (const char* type : sensorTypes)
             {
-                auto sensorBase = sensorData->find(type);
+                auto sensorBase = sensorData->find(configInterfaceName(type));
                 if (sensorBase != sensorData->end())
                 {
                     baseConfig = &sensorBase->second;
diff --git a/src/Utils.cpp b/src/Utils.cpp
index cf9ff75..7b33cb7 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -142,6 +142,7 @@
     ManagedObjectType& resp, bool useCache)
 {
     static ManagedObjectType managedObj;
+    std::string typeIntf = configInterfaceName(type);
 
     if (!useCache)
     {
@@ -169,7 +170,7 @@
     {
         for (const auto& [intf, cfg] : pathPair.second)
         {
-            if (intf.starts_with(type))
+            if (intf.starts_with(typeIntf))
             {
                 resp.emplace(pathPair);
                 break;
@@ -705,7 +706,8 @@
         auto match = std::make_unique<sdbusplus::bus::match_t>(
             static_cast<sdbusplus::bus_t&>(bus),
             "type='signal',member='PropertiesChanged',path_namespace='" +
-                std::string(inventoryPath) + "',arg0namespace='" + type + "'",
+                std::string(inventoryPath) + "',arg0namespace='" +
+                configInterfaceName(type) + "'",
             handler);
         matches.emplace_back(std::move(match));
     }
