diff --git a/include/EntityManager.hpp b/include/EntityManager.hpp
index 5867556..748c49b 100644
--- a/include/EntityManager.hpp
+++ b/include/EntityManager.hpp
@@ -29,12 +29,16 @@
 #include <list>
 #include <string>
 
+// paths - > interfaces -> properties
 using DBusProbeObjectT = boost::container::flat_map<
     std::string,
-    std::vector<boost::container::flat_map<std::string, BasicVariantType>>>;
+    boost::container::flat_map<
+        std::string,
+        boost::container::flat_map<std::string, BasicVariantType>>>;
 
-using FoundDeviceT =
-    std::vector<boost::container::flat_map<std::string, BasicVariantType>>;
+// vector of tuple<map<propertyName, variant>, D-Bus path>>
+using FoundDeviceT = std::vector<std::tuple<
+    boost::container::flat_map<std::string, BasicVariantType>, std::string>>;
 
 struct PerformScan : std::enable_shared_from_this<PerformScan>
 {
@@ -60,14 +64,15 @@
 // this class finds the needed dbus fields and on destruction runs the probe
 struct PerformProbe : std::enable_shared_from_this<PerformProbe>
 {
-    PerformProbe(const std::vector<std::string>& probeCommand,
-                 std::shared_ptr<PerformScan>& scanPtr,
-                 std::function<void(FoundDeviceT&)>&& callback);
+    PerformProbe(
+        const std::vector<std::string>& probeCommand,
+        std::shared_ptr<PerformScan>& scanPtr,
+        std::function<void(FoundDeviceT&, const DBusProbeObjectT&)>&& callback);
     virtual ~PerformProbe();
 
     std::vector<std::string> _probeCommand;
     std::shared_ptr<PerformScan> scan;
-    std::function<void(FoundDeviceT&)> _callback;
+    std::function<void(FoundDeviceT&, const DBusProbeObjectT&)> _callback;
 };
 
 inline void logDeviceAdded(const nlohmann::json& record)
diff --git a/include/Utils.hpp b/include/Utils.hpp
index 8ac27a1..657af92 100644
--- a/include/Utils.hpp
+++ b/include/Utils.hpp
@@ -128,6 +128,14 @@
 
 std::optional<std::string> templateCharReplace(
     nlohmann::json::iterator& keyPair,
+    const boost::container::flat_map<
+        std::string, boost::container::flat_map<std::string, BasicVariantType>>&
+        allInterfaces,
+    const size_t foundDeviceIdx,
+    const std::optional<std::string>& replaceStr = std::nullopt);
+
+std::optional<std::string> templateCharReplace(
+    nlohmann::json::iterator& keyPair,
     const boost::container::flat_map<std::string, BasicVariantType>&
         foundDevice,
     const size_t foundDeviceIdx,
diff --git a/src/EntityManager.cpp b/src/EntityManager.cpp
index ccca133..932b6f9 100644
--- a/src/EntityManager.cpp
+++ b/src/EntityManager.cpp
@@ -108,7 +108,7 @@
 
 void registerCallback(nlohmann::json& systemConfiguration,
                       sdbusplus::asio::object_server& objServer,
-                      const std::string& interfaces);
+                      const std::string& path);
 
 static std::shared_ptr<sdbusplus::asio::dbus_interface>
     createInterface(sdbusplus::asio::object_server& objServer,
@@ -169,7 +169,7 @@
                 return;
             }
 
-            scan->dbusProbeObjects[std::get<2>(call)].emplace_back(resp);
+            scan->dbusProbeObjects[std::get<1>(call)][std::get<2>(call)] = resp;
         },
         std::get<0>(call), std::get<1>(call), "org.freedesktop.DBus.Properties",
         "GetAll", std::get<2>(call));
@@ -180,17 +180,19 @@
     }
 }
 
-// calls the mapper to find all exposed objects of an interface type
-// and creates a vector<flat_map> that contains all the key value pairs
-// getManagedObjects
+// Populates scan->dbusProbeObjects with all interfaces and properties
+// for the paths that own the interfaces passed in.
 void findDbusObjects(std::vector<std::shared_ptr<PerformProbe>>&& probeVector,
                      boost::container::flat_set<std::string>&& interfaces,
                      std::shared_ptr<PerformScan> scan, size_t retries = 5)
 {
-
-    for (const auto& [interface, _] : scan->dbusProbeObjects)
+    // Filter out interfaces already obtained.
+    for (const auto& [path, probeInterfaces] : scan->dbusProbeObjects)
     {
-        interfaces.erase(interface);
+        for (const auto& [interface, _] : probeInterfaces)
+        {
+            interfaces.erase(interface);
+        }
     }
     if (interfaces.empty())
     {
@@ -240,14 +242,22 @@
                 {
                     for (const std::string& iface : ifaces)
                     {
-                        auto ifaceObjFind = interfaces.find(iface);
-
-                        if (ifaceObjFind != interfaces.end())
+                        // The 3 default org.freedeskstop interfaces (Peer,
+                        // Introspectable, and Properties) are returned by
+                        // the mapper but don't have properties, so don't bother
+                        // with the GetAll call to save some cycles.
+                        if (!boost::algorithm::starts_with(iface,
+                                                           "org.freedesktop"))
                         {
                             interfaceConnections.emplace(busname, path, iface);
                         }
                     }
                 }
+
+                // Get a PropertiesChanged callback for all
+                // interfaces on this path.
+                registerCallback(scan->_systemConfiguration, scan->objServer,
+                                 path);
             }
 
             if (interfaceConnections.empty())
@@ -272,42 +282,52 @@
 }
 
 // probes dbus interface dictionary for a key with a value that matches a regex
+// When an interface passes a probe, also save its D-Bus path with it.
 bool probeDbus(const std::string& interface,
                const std::map<std::string, nlohmann::json>& matches,
                FoundDeviceT& devices, std::shared_ptr<PerformScan> scan,
                bool& foundProbe)
 {
-    std::vector<boost::container::flat_map<std::string, BasicVariantType>>&
-        dbusObject = scan->dbusProbeObjects[interface];
-    if (dbusObject.empty())
-    {
-        foundProbe = false;
-        return false;
-    }
-    foundProbe = true;
-
     bool foundMatch = false;
-    for (auto& device : dbusObject)
+    foundProbe = false;
+
+    for (const auto& [path, interfaces] : scan->dbusProbeObjects)
     {
-        bool deviceMatches = true;
-        for (auto& match : matches)
+        auto it = interfaces.find(interface);
+        if (it == interfaces.end())
         {
-            auto deviceValue = device.find(match.first);
-            if (deviceValue != device.end())
+            continue;
+        }
+
+        foundProbe = true;
+
+        bool deviceMatches = true;
+        const boost::container::flat_map<std::string, BasicVariantType>&
+            properties = it->second;
+
+        for (const auto& [matchProp, matchJSON] : matches)
+        {
+            auto deviceValue = properties.find(matchProp);
+            if (deviceValue != properties.end())
             {
-                deviceMatches = matchProbe(match.second, deviceValue->second);
+                deviceMatches = matchProbe(matchJSON, deviceValue->second);
             }
             else
             {
+                // Move on to the next DBus path
                 deviceMatches = false;
                 break;
             }
         }
         if (deviceMatches)
         {
-            devices.emplace_back(device);
+            if constexpr (DEBUG)
+            {
+                std::cerr << "probeDBus: Found probe match on " << path << " "
+                          << interface << "\n";
+            }
+            devices.emplace_back(properties, path);
             foundMatch = true;
-            deviceMatches = false; // for next iteration
         }
     }
     return foundMatch;
@@ -315,11 +335,8 @@
 
 // default probe entry point, iterates a list looking for specific types to
 // call specific probe functions
-bool probe(
-    const std::vector<std::string>& probeCommand,
-    std::shared_ptr<PerformScan> scan,
-    std::vector<boost::container::flat_map<std::string, BasicVariantType>>&
-        foundDevs)
+bool probe(const std::vector<std::string>& probeCommand,
+           std::shared_ptr<PerformScan> scan, FoundDeviceT& foundDevs)
 {
     const static std::regex command(R"(\((.*)\))");
     std::smatch match;
@@ -450,7 +467,8 @@
     if (ret && foundDevs.size() == 0)
     {
         foundDevs.emplace_back(
-            boost::container::flat_map<std::string, BasicVariantType>{});
+            boost::container::flat_map<std::string, BasicVariantType>{},
+            std::string{});
     }
     if (matchOne && ret)
     {
@@ -463,9 +481,10 @@
     return ret;
 }
 
-PerformProbe::PerformProbe(const std::vector<std::string>& probeCommand,
-                           std::shared_ptr<PerformScan>& scanPtr,
-                           std::function<void(FoundDeviceT&)>&& callback) :
+PerformProbe::PerformProbe(
+    const std::vector<std::string>& probeCommand,
+    std::shared_ptr<PerformScan>& scanPtr,
+    std::function<void(FoundDeviceT&, const DBusProbeObjectT&)>&& callback) :
     _probeCommand(probeCommand),
     scan(scanPtr), _callback(std::move(callback))
 {}
@@ -474,7 +493,7 @@
     FoundDeviceT foundDevs;
     if (probe(_probeCommand, scan, foundDevs))
     {
-        _callback(foundDevs);
+        _callback(foundDevs, scan->dbusProbeObjects);
     }
 }
 
@@ -1278,7 +1297,8 @@
         auto thisRef = shared_from_this();
         auto probePointer = std::make_shared<PerformProbe>(
             probeCommand, thisRef,
-            [&, recordPtr, probeName](FoundDeviceT& foundDevices) {
+            [&, recordPtr, probeName](FoundDeviceT& foundDevices,
+                                      const DBusProbeObjectT& allInterfaces) {
                 _passed = true;
 
                 std::set<nlohmann::json> usedNames;
@@ -1294,7 +1314,8 @@
                 for (auto itr = foundDevices.begin();
                      itr != foundDevices.end();)
                 {
-                    std::string recordName = getRecordName(*itr, probeName);
+                    std::string recordName =
+                        getRecordName(std::get<0>(*itr), probeName);
 
                     auto fromLastJson = lastJson.find(recordName);
                     if (fromLastJson != lastJson.end())
@@ -1349,8 +1370,24 @@
 
                 std::optional<std::string> replaceStr;
 
-                for (auto& foundDevice : foundDevices)
+                for (auto& foundDeviceAndPath : foundDevices)
                 {
+                    const boost::container::flat_map<
+                        std::string, BasicVariantType>& foundDevice =
+                        std::get<0>(foundDeviceAndPath);
+                    const std::string& path = std::get<1>(foundDeviceAndPath);
+
+                    // Need all interfaces on this path so that template
+                    // substitutions can be done with any of the contained
+                    // properties.
+                    auto allInterfacesOnPath = allInterfaces.find(path);
+                    if (allInterfacesOnPath == allInterfaces.end())
+                    {
+                        // Should be impossible at this point.
+                        std::cerr << "Unrecognized path " << path << "\n";
+                        continue;
+                    }
+
                     nlohmann::json record = *recordPtr;
                     std::string recordName =
                         getRecordName(foundDevice, probeName);
@@ -1367,8 +1404,9 @@
 
                     nlohmann::json copyForName = {{"Name", getName.value()}};
                     nlohmann::json::iterator copyIt = copyForName.begin();
-                    std::optional<std::string> replaceVal = templateCharReplace(
-                        copyIt, foundDevice, foundDeviceIdx, replaceStr);
+                    std::optional<std::string> replaceVal =
+                        templateCharReplace(copyIt, allInterfacesOnPath->second,
+                                            foundDeviceIdx, replaceStr);
 
                     if (!replaceStr && replaceVal)
                     {
@@ -1377,7 +1415,8 @@
                             replaceStr = replaceVal;
                             copyForName = {{"Name", getName.value()}};
                             copyIt = copyForName.begin();
-                            templateCharReplace(copyIt, foundDevice,
+                            templateCharReplace(copyIt,
+                                                allInterfacesOnPath->second,
                                                 foundDeviceIdx, replaceStr);
                         }
                     }
@@ -1400,7 +1439,8 @@
 
                             continue; // already covered above
                         }
-                        templateCharReplace(keyPair, foundDevice,
+                        templateCharReplace(keyPair,
+                                            allInterfacesOnPath->second,
                                             foundDeviceIdx, replaceStr);
                     }
 
@@ -1422,7 +1462,8 @@
                              keyPair != expose.end(); keyPair++)
                         {
 
-                            templateCharReplace(keyPair, foundDevice,
+                            templateCharReplace(keyPair,
+                                                allInterfacesOnPath->second,
                                                 foundDeviceIdx, replaceStr);
 
                             bool isBind =
@@ -1562,11 +1603,6 @@
         it++;
     }
 
-    for (const std::string& interface : dbusProbeInterfaces)
-    {
-        registerCallback(_systemConfiguration, objServer, interface);
-    }
-
     // probe vector stores a shared_ptr to each PerformProbe that cares
     // about a dbus interface
     findDbusObjects(std::move(dbusProbePointers),
@@ -1811,12 +1847,12 @@
 
 void registerCallback(nlohmann::json& systemConfiguration,
                       sdbusplus::asio::object_server& objServer,
-                      const std::string& interface)
+                      const std::string& path)
 {
     static boost::container::flat_map<std::string, sdbusplus::bus::match::match>
         dbusMatches;
 
-    auto find = dbusMatches.find(interface);
+    auto find = dbusMatches.find(path);
     if (find != dbusMatches.end())
     {
         return;
@@ -1829,9 +1865,9 @@
 
     sdbusplus::bus::match::match match(
         static_cast<sdbusplus::bus::bus&>(*SYSTEM_BUS),
-        "type='signal',member='PropertiesChanged',arg0='" + interface + "'",
+        "type='signal',member='PropertiesChanged',path='" + path + "'",
         eventHandler);
-    dbusMatches.emplace(interface, std::move(match));
+    dbusMatches.emplace(path, std::move(match));
 }
 
 int main()
diff --git a/src/Utils.cpp b/src/Utils.cpp
index 45c42e8..a097d06 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -149,6 +149,28 @@
         power::interface, power::property);
 }
 
+// Replaces the template character like the other version of this function,
+// but checks all properties on all interfaces provided to do the substitution
+// with.
+std::optional<std::string> templateCharReplace(
+    nlohmann::json::iterator& keyPair,
+    const boost::container::flat_map<
+        std::string, boost::container::flat_map<std::string, BasicVariantType>>&
+        allInterfaces,
+    const size_t foundDeviceIdx, const std::optional<std::string>& replaceStr)
+{
+    for (const auto& [interface, properties] : allInterfaces)
+    {
+        auto ret = templateCharReplace(keyPair, properties, foundDeviceIdx,
+                                       replaceStr);
+        if (ret)
+        {
+            return ret;
+        }
+    }
+    return std::nullopt;
+}
+
 // finds the template character (currently set to $) and replaces the value with
 // the field found in a dbus object i.e. $ADDRESS would get populated with the
 // ADDRESS field from a object on dbus
