diff --git a/src/ADCSensorMain.cpp b/src/ADCSensorMain.cpp
index 8cfba87..7cb31d0 100644
--- a/src/ADCSensorMain.cpp
+++ b/src/ADCSensorMain.cpp
@@ -17,6 +17,7 @@
 #include <ADCSensor.hpp>
 #include <Utils.hpp>
 #include <VariantVisitors.hpp>
+#include <boost/algorithm/string/case_conv.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/container/flat_set.hpp>
@@ -35,6 +36,8 @@
     "xyz.openbmc_project.Configuration.ADC"};
 static std::regex inputRegex(R"(in(\d+)_input)");
 
+static boost::container::flat_map<size_t, bool> cpuPresence;
+
 // filter out adc from any other voltage sensor
 bool isAdc(const fs::path& parentPath)
 {
@@ -212,6 +215,21 @@
             setReadState(powerState, readState);
         }
 
+        auto findCPU = baseConfiguration->second.find("CPURequired");
+        if (findCPU != baseConfiguration->second.end())
+        {
+            size_t index = std::visit(VariantToIntVisitor(), findCPU->second);
+            auto presenceFind = cpuPresence.find(index);
+            if (presenceFind == cpuPresence.end())
+            {
+                continue; // no such cpu
+            }
+            if (!presenceFind->second)
+            {
+                continue; // cpu not installed
+            }
+        }
+
         auto findBridgeGpio = baseConfiguration->second.find("BridgeGpio");
         std::optional<int> gpioNum;
 
@@ -221,8 +239,9 @@
                 std::visit(VariantToIntVisitor(), findBridgeGpio->second);
             gpioNum = static_cast<std::optional<int>>(gpioPin);
         }
-
-        sensors[sensorName] = std::make_unique<ADCSensor>(
+        auto& sensor = sensors[sensorName];
+        sensor = nullptr;
+        sensor = std::make_unique<ADCSensor>(
             path.string(), objectServer, dbusConnection, io, sensorName,
             std::move(sensorThresholds), scaleFactor, readState, *interfacePath,
             gpioNum);
@@ -272,6 +291,53 @@
             });
         };
 
+    std::function<void(sdbusplus::message::message&)> cpuPresenceHandler =
+        [&](sdbusplus::message::message& message) {
+            std::string path = message.get_path();
+            boost::to_lower(path);
+
+            if (path.rfind("cpu") == std::string::npos)
+            {
+                return; // not interested
+            }
+            size_t index = 0;
+            try
+            {
+                index = std::stoi(path.substr(path.size() - 1));
+            }
+            catch (std::invalid_argument&)
+            {
+                std::cerr << "Found invalid path " << path << "\n";
+                return;
+            }
+
+            std::string objectName;
+            boost::container::flat_map<std::string, std::variant<bool>> values;
+            message.read(objectName, values);
+            auto findPresence = values.find("Present");
+            if (findPresence != values.end())
+            {
+                cpuPresence[index] = std::get<bool>(findPresence->second);
+            }
+
+            // this implicitly cancels the timer
+            filterTimer.expires_from_now(boost::posix_time::seconds(1));
+
+            filterTimer.async_wait([&](const boost::system::error_code& ec) {
+                if (ec == boost::asio::error::operation_aborted)
+                {
+                    /* we were canceled*/
+                    return;
+                }
+                else if (ec)
+                {
+                    std::cerr << "timer error\n";
+                    return;
+                }
+                createSensors(io, objectServer, sensors, systemBus, {});
+            });
+        };
+
     for (const char* type : sensorTypes)
     {
         auto match = std::make_unique<sdbusplus::bus::match::match>(
@@ -281,6 +347,12 @@
             eventHandler);
         matches.emplace_back(std::move(match));
     }
+    matches.emplace_back(std::make_unique<sdbusplus::bus::match::match>(
+        static_cast<sdbusplus::bus::bus&>(*systemBus),
+        "type='signal',member='PropertiesChanged',path_namespace='" +
+            std::string(cpuInventoryPath) +
+            "',arg0namespace='xyz.openbmc_project.Inventory.Item'",
+        cpuPresenceHandler));
 
     io.run();
 }
