diff --git a/phosphor-power-sequencer/config_files/UCD90160Monitor_ibm,bonnell.json b/phosphor-power-sequencer/config_files/UCD90160Monitor_ibm,bonnell.json
deleted file mode 100644
index 2df270a..0000000
--- a/phosphor-power-sequencer/config_files/UCD90160Monitor_ibm,bonnell.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-    "rails": [
-        { "name": "12.0VA" },
-        { "name": "5.0VCS" },
-        { "name": "1.8V" },
-        { "name": "0.9V" },
-        { "name": "3.3V" },
-        { "name": "1.5V_AVDD" },
-        { "name": "0.65V_VDN" },
-        { "name": "0.7VA_VDD" },
-        { "name": "0.7VB_VDD" },
-        { "name": "0.75V_VCS" },
-        { "name": "0.9V_VIO" },
-        { "name": "0.85V_VPCIE" },
-        { "name": "PMIC2_PG" },
-        { "name": "PMIC3_PG" },
-        { "name": "VDDR_1.2VB" },
-        { "name": "VDDR_1.2VA" }
-    ],
-
-    "pins": []
-}
diff --git a/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,blueridge.json b/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,blueridge.json
deleted file mode 100644
index d8b4f60..0000000
--- a/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,blueridge.json
+++ /dev/null
@@ -1,107 +0,0 @@
-{
-    "rails": [
-        { "name": "12.0V" },
-        { "name": "5.0V_USB" },
-        { "name": "5.0V_DASD" },
-        { "name": "3.3VA" },
-        { "name": "3.3VB" },
-        { "name": "1.5V" },
-        { "name": "1.1V" },
-        { "name": "VDDA_DCM0" },
-        { "name": "VDDB_DCM0" },
-        { "name": "VDDA_DCM1" },
-        { "name": "VDDB_DCM1" },
-        { "name": "12.0VCS" },
-        { "name": "3.3VCS" },
-        { "name": "1.1V_Current" },
-        { "name": "5.0V_USB_Current" },
-        { "name": "5.0V_DASD_Current" },
-        { "name": "12.0VN" },
-        { "name": "12.0VP" },
-        { "name": "12.0VQ" },
-        { "name": "12.0VR" },
-        { "name": "ThermalDiode1" },
-        { "name": "ThermalDiode2" },
-        { "name": "ThermalDiode3" },
-        { "name": "ThermalDiode4" },
-        { "name": "VDN_DCM0" },
-        { "name": "VDN_DCM1" },
-        { "name": "VCS_DCM0" },
-        { "name": "VCS_DCM1" },
-        { "name": "VIO_DCM0" },
-        { "name": "VIO_DCM1" },
-        { "name": "VPCIE_DCM0" },
-        { "name": "VPCIE_DCM1" }
-    ],
-
-    "pins": [
-        {
-            "name": "PGOOD_12A",
-            "line": 56
-        },
-        {
-            "name": "PGOOD_12B",
-            "line": 57
-        },
-        {
-            "name": "PGOOD_12C",
-            "line": 58
-        },
-        {
-            "name": "PGOOD_12D",
-            "line": 59
-        },
-        {
-            "name": "PGOOD_12L",
-            "line": 60
-        },
-        {
-            "name": "PGOOD_12M",
-            "line": 61
-        },
-        {
-            "name": "PGOOD_12N",
-            "line": 62
-        },
-        {
-            "name": "PGOOD_12PCIE",
-            "line": 64
-        },
-        {
-            "name": "PGOOD_12Q",
-            "line": 65
-        },
-        {
-            "name": "PGOOD_VDN_DCM0",
-            "line": 72
-        },
-        {
-            "name": "PGOOD_VDN_DCM1",
-            "line": 73
-        },
-        {
-            "name": "PGOOD_VCS_DCM0",
-            "line": 74
-        },
-        {
-            "name": "PGOOD_VCS_DCM1",
-            "line": 75
-        },
-        {
-            "name": "PGOOD_VIO_DCM0",
-            "line": 76
-        },
-        {
-            "name": "PGOOD_VIO_DCM1",
-            "line": 77
-        },
-        {
-            "name": "PGOOD_VPCIE_DCM0",
-            "line": 78
-        },
-        {
-            "name": "PGOOD_VPCIE_DCM1",
-            "line": 79
-        }
-    ]
-}
diff --git a/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,everest.json b/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,everest.json
deleted file mode 100644
index 9b45ba8..0000000
--- a/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,everest.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
-    "rails": [
-        { "name": "12.0V" },
-        { "name": "3V3IO" },
-        { "name": "CP0_VDD0" },
-        { "name": "CP0_VDD1" },
-        { "name": "CP1_VDD0" },
-        { "name": "CP1_VDD1" },
-        { "name": "CP2_VDD0" },
-        { "name": "CP2_VDD1" },
-        { "name": "CP3_VDD0" },
-        { "name": "CP3_VDD1" },
-        { "name": "CP0_VCS0" },
-        { "name": "CP0_VCS1" },
-        { "name": "CP1_VCS0" },
-        { "name": "CP1_VCS1" },
-        { "name": "CP2_VCS0" },
-        {
-            "name": "CP2_VCS1",
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm2/cpu0"
-        },
-        { "name": "CP3_VCS0" },
-        { "name": "CP3_VCS1" },
-        { "name": "CP03_AVDD" },
-        { "name": "CP12_AVDD" },
-        { "name": "CP0_VDN" },
-        { "name": "CP1_VDN" },
-        { "name": "CP2_VDN" },
-        { "name": "CP3_VDN" },
-        { "name": "CP0_VIO" },
-        { "name": "CP1_VIO" },
-        { "name": "CP2_VIO" },
-        { "name": "CP3_VIO" },
-        { "name": "CP0_VPCIE" },
-        { "name": "CP1_VPCIE" },
-        { "name": "CP2_VPCIE" },
-        { "name": "CP3_VPCIE" }
-    ],
-
-    "pins": [
-        {
-            "name": "CP0_VPCIE",
-            "line": 59
-        },
-        {
-            "name": "CP1_VPCIE",
-            "line": 60
-        },
-        {
-            "name": "CP2_VPCIE",
-            "line": 61,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm2/cpu0"
-        },
-        {
-            "name": "CP3_VPCIE",
-            "line": 62,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm3/cpu0"
-        },
-        {
-            "name": "5.0V_USB_front",
-            "line": 67
-        },
-        {
-            "name": "CP0_VDN",
-            "line": 72
-        },
-        {
-            "name": "CP1_VDN",
-            "line": 73
-        },
-        {
-            "name": "CP2_VDN",
-            "line": 74,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm2/cpu0"
-        },
-        {
-            "name": "CP3_VDN",
-            "line": 75,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm3/cpu0"
-        },
-        {
-            "name": "CP0_VIO",
-            "line": 76
-        },
-        {
-            "name": "CP1_VIO",
-            "line": 77
-        },
-        {
-            "name": "CP2_VIO",
-            "line": 78,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm2/cpu0"
-        },
-        {
-            "name": "CP3_VIO",
-            "line": 79,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm3/cpu0"
-        }
-    ]
-}
diff --git a/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,fuji.json b/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,fuji.json
deleted file mode 100644
index 9b45ba8..0000000
--- a/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,fuji.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
-    "rails": [
-        { "name": "12.0V" },
-        { "name": "3V3IO" },
-        { "name": "CP0_VDD0" },
-        { "name": "CP0_VDD1" },
-        { "name": "CP1_VDD0" },
-        { "name": "CP1_VDD1" },
-        { "name": "CP2_VDD0" },
-        { "name": "CP2_VDD1" },
-        { "name": "CP3_VDD0" },
-        { "name": "CP3_VDD1" },
-        { "name": "CP0_VCS0" },
-        { "name": "CP0_VCS1" },
-        { "name": "CP1_VCS0" },
-        { "name": "CP1_VCS1" },
-        { "name": "CP2_VCS0" },
-        {
-            "name": "CP2_VCS1",
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm2/cpu0"
-        },
-        { "name": "CP3_VCS0" },
-        { "name": "CP3_VCS1" },
-        { "name": "CP03_AVDD" },
-        { "name": "CP12_AVDD" },
-        { "name": "CP0_VDN" },
-        { "name": "CP1_VDN" },
-        { "name": "CP2_VDN" },
-        { "name": "CP3_VDN" },
-        { "name": "CP0_VIO" },
-        { "name": "CP1_VIO" },
-        { "name": "CP2_VIO" },
-        { "name": "CP3_VIO" },
-        { "name": "CP0_VPCIE" },
-        { "name": "CP1_VPCIE" },
-        { "name": "CP2_VPCIE" },
-        { "name": "CP3_VPCIE" }
-    ],
-
-    "pins": [
-        {
-            "name": "CP0_VPCIE",
-            "line": 59
-        },
-        {
-            "name": "CP1_VPCIE",
-            "line": 60
-        },
-        {
-            "name": "CP2_VPCIE",
-            "line": 61,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm2/cpu0"
-        },
-        {
-            "name": "CP3_VPCIE",
-            "line": 62,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm3/cpu0"
-        },
-        {
-            "name": "5.0V_USB_front",
-            "line": 67
-        },
-        {
-            "name": "CP0_VDN",
-            "line": 72
-        },
-        {
-            "name": "CP1_VDN",
-            "line": 73
-        },
-        {
-            "name": "CP2_VDN",
-            "line": 74,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm2/cpu0"
-        },
-        {
-            "name": "CP3_VDN",
-            "line": 75,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm3/cpu0"
-        },
-        {
-            "name": "CP0_VIO",
-            "line": 76
-        },
-        {
-            "name": "CP1_VIO",
-            "line": 77
-        },
-        {
-            "name": "CP2_VIO",
-            "line": 78,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm2/cpu0"
-        },
-        {
-            "name": "CP3_VIO",
-            "line": 79,
-            "presence": "/xyz/openbmc_project/inventory/system/chassis/motherboard/dcm3/cpu0"
-        }
-    ]
-}
diff --git a/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,rainier.json b/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,rainier.json
deleted file mode 100644
index d8b4f60..0000000
--- a/phosphor-power-sequencer/config_files/UCD90320Monitor_ibm,rainier.json
+++ /dev/null
@@ -1,107 +0,0 @@
-{
-    "rails": [
-        { "name": "12.0V" },
-        { "name": "5.0V_USB" },
-        { "name": "5.0V_DASD" },
-        { "name": "3.3VA" },
-        { "name": "3.3VB" },
-        { "name": "1.5V" },
-        { "name": "1.1V" },
-        { "name": "VDDA_DCM0" },
-        { "name": "VDDB_DCM0" },
-        { "name": "VDDA_DCM1" },
-        { "name": "VDDB_DCM1" },
-        { "name": "12.0VCS" },
-        { "name": "3.3VCS" },
-        { "name": "1.1V_Current" },
-        { "name": "5.0V_USB_Current" },
-        { "name": "5.0V_DASD_Current" },
-        { "name": "12.0VN" },
-        { "name": "12.0VP" },
-        { "name": "12.0VQ" },
-        { "name": "12.0VR" },
-        { "name": "ThermalDiode1" },
-        { "name": "ThermalDiode2" },
-        { "name": "ThermalDiode3" },
-        { "name": "ThermalDiode4" },
-        { "name": "VDN_DCM0" },
-        { "name": "VDN_DCM1" },
-        { "name": "VCS_DCM0" },
-        { "name": "VCS_DCM1" },
-        { "name": "VIO_DCM0" },
-        { "name": "VIO_DCM1" },
-        { "name": "VPCIE_DCM0" },
-        { "name": "VPCIE_DCM1" }
-    ],
-
-    "pins": [
-        {
-            "name": "PGOOD_12A",
-            "line": 56
-        },
-        {
-            "name": "PGOOD_12B",
-            "line": 57
-        },
-        {
-            "name": "PGOOD_12C",
-            "line": 58
-        },
-        {
-            "name": "PGOOD_12D",
-            "line": 59
-        },
-        {
-            "name": "PGOOD_12L",
-            "line": 60
-        },
-        {
-            "name": "PGOOD_12M",
-            "line": 61
-        },
-        {
-            "name": "PGOOD_12N",
-            "line": 62
-        },
-        {
-            "name": "PGOOD_12PCIE",
-            "line": 64
-        },
-        {
-            "name": "PGOOD_12Q",
-            "line": 65
-        },
-        {
-            "name": "PGOOD_VDN_DCM0",
-            "line": 72
-        },
-        {
-            "name": "PGOOD_VDN_DCM1",
-            "line": 73
-        },
-        {
-            "name": "PGOOD_VCS_DCM0",
-            "line": 74
-        },
-        {
-            "name": "PGOOD_VCS_DCM1",
-            "line": 75
-        },
-        {
-            "name": "PGOOD_VIO_DCM0",
-            "line": 76
-        },
-        {
-            "name": "PGOOD_VIO_DCM1",
-            "line": 77
-        },
-        {
-            "name": "PGOOD_VPCIE_DCM0",
-            "line": 78
-        },
-        {
-            "name": "PGOOD_VPCIE_DCM1",
-            "line": 79
-        }
-    ]
-}
diff --git a/phosphor-power-sequencer/src/power_sequencer_monitor.cpp b/phosphor-power-sequencer/src/power_sequencer_monitor.cpp
deleted file mode 100644
index 3c8f999..0000000
--- a/phosphor-power-sequencer/src/power_sequencer_monitor.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * Copyright © 2021 IBM Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "power_sequencer_monitor.hpp"
-
-#include <fmt/format.h>
-
-#include <phosphor-logging/elog.hpp>
-#include <phosphor-logging/log.hpp>
-
-#include <exception>
-
-namespace phosphor::power::sequencer
-{
-
-using namespace phosphor::logging;
-
-PowerSequencerMonitor::PowerSequencerMonitor(sdbusplus::bus_t& bus) : bus(bus)
-{}
-
-void PowerSequencerMonitor::createBmcDump()
-{
-    try
-    {
-        auto method = bus.new_method_call(
-            "xyz.openbmc_project.Dump.Manager", "/xyz/openbmc_project/dump/bmc",
-            "xyz.openbmc_project.Dump.Create", "CreateDump");
-        method.append(
-            std::vector<
-                std::pair<std::string, std::variant<std::string, uint64_t>>>());
-        bus.call_noreply(method);
-    }
-    catch (const std::exception& e)
-    {
-        log<level::ERR>(
-            fmt::format("Unable to create dump, error: {}", e.what()).c_str());
-    }
-}
-
-void PowerSequencerMonitor::logError(
-    const std::string& message,
-    std::map<std::string, std::string>& additionalData)
-{
-    try
-    {
-        auto method = bus.new_method_call(
-            "xyz.openbmc_project.Logging", "/xyz/openbmc_project/logging",
-            "xyz.openbmc_project.Logging.Create", "Create");
-
-        // Add PID to AdditionalData
-        additionalData.emplace("_PID", std::to_string(getpid()));
-        // Set as system terminating
-        additionalData.emplace("SEVERITY_DETAIL", "SYSTEM_TERM");
-
-        method.append(message,
-                      sdbusplus::xyz::openbmc_project::Logging::server::Entry::
-                          Level::Critical,
-                      additionalData);
-        bus.call_noreply(method);
-    }
-    catch (const std::exception& e)
-    {
-        log<level::ERR>(
-            fmt::format("Unable to log error, message: {}, error: {}", message,
-                        e.what())
-                .c_str());
-    }
-}
-
-void PowerSequencerMonitor::onFailure(bool timeout,
-                                      const std::string& powerSupplyError)
-{
-    std::map<std::string, std::string> additionalData{};
-    if (!powerSupplyError.empty())
-    {
-        // Default to power supply error
-        logError(powerSupplyError, additionalData);
-    }
-    else if (timeout)
-    {
-        // Default to timeout error
-        logError(powerOnTimeoutError, additionalData);
-    }
-    else
-    {
-        // Default to generic pgood error
-        logError(shutdownError, additionalData);
-    }
-    if (!timeout)
-    {
-        createBmcDump();
-    }
-}
-
-} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/power_sequencer_monitor.hpp b/phosphor-power-sequencer/src/power_sequencer_monitor.hpp
deleted file mode 100644
index 740b0cd..0000000
--- a/phosphor-power-sequencer/src/power_sequencer_monitor.hpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#pragma once
-
-#include <sdbusplus/bus.hpp>
-
-#include <map>
-#include <string>
-
-namespace phosphor::power::sequencer
-{
-
-constexpr auto powerOnTimeoutError =
-    "xyz.openbmc_project.Power.Error.PowerOnTimeout";
-constexpr auto shutdownError = "xyz.openbmc_project.Power.Error.Shutdown";
-
-/**
- * @class PowerSequencerMonitor
- * Define a base class for monitoring a power sequencer device.
- */
-class PowerSequencerMonitor
-{
-  public:
-    PowerSequencerMonitor() = delete;
-    PowerSequencerMonitor(const PowerSequencerMonitor&) = delete;
-    PowerSequencerMonitor& operator=(const PowerSequencerMonitor&) = delete;
-    PowerSequencerMonitor(PowerSequencerMonitor&&) = delete;
-    PowerSequencerMonitor& operator=(PowerSequencerMonitor&&) = delete;
-    virtual ~PowerSequencerMonitor() = default;
-
-    /**
-     * Create a base device object for power sequence monitoring.
-     * @param bus D-Bus bus object
-     */
-    explicit PowerSequencerMonitor(sdbusplus::bus_t& bus);
-
-    /**
-     * Logs an error using the D-Bus Create method.
-     * @param message Message property of the error log entry
-     * @param additionalData AdditionalData property of the error log entry
-     */
-    void logError(const std::string& message,
-                  std::map<std::string, std::string>& additionalData);
-
-    /**
-     * Analyzes the device for errors when the device is
-     * known to be in an error state.  A log will be created.
-     * @param timeout if the failure state was determined by timing out
-     * @param powerSupplyError The power supply error to log. A default
-     * std:string, i.e. empty string (""), is passed when there is no power
-     * supply error to log.
-     */
-    virtual void onFailure(bool timeout, const std::string& powerSupplyError);
-
-  protected:
-    /**
-     * The D-Bus bus object
-     */
-    sdbusplus::bus_t& bus;
-
-    /**
-     * Create a BMC Dump
-     */
-    void createBmcDump();
-};
-
-} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/ucd90160_monitor.cpp b/phosphor-power-sequencer/src/ucd90160_monitor.cpp
deleted file mode 100644
index a75a6fc..0000000
--- a/phosphor-power-sequencer/src/ucd90160_monitor.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * Copyright © 2022 IBM Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ucd90160_monitor.hpp"
-
-#include <fmt/format.h>
-#include <fmt/ranges.h>
-
-#include <phosphor-logging/log.hpp>
-
-#include <algorithm>
-#include <array>
-#include <span>
-
-namespace phosphor::power::sequencer
-{
-
-using namespace phosphor::logging;
-
-// Names of the UCD90160 GPIOs.  The array indices correspond to the Pin IDs
-// defined in the UCD90160 PMBus interface documentation.  These Pin IDs are the
-// same as the libgpiod line offsets used to obtain the GPIO values.
-static constexpr std::array<const char*, 26> gpioNames = {
-    "FPWM1_GPIO5", "FPWM2_GPIO6",  "FPWM3_GPIO7",  "FPWM4_GPIO8",
-    "FPWM5_GPIO9", "FPWM6_GPIO10", "FPWM7_GPIO11", "FPWM8_GPIO12",
-    "GPI1_PWM1",   "GPI2_PWM2",    "GPI3_PWM3",    "GPI4_PWM4",
-    "GPIO14",      "GPIO15",       "TDO_GPIO20",   "TCK_GPIO19",
-    "TMS_GPIO22",  "TDI_GPIO21",   "GPIO1",        "GPIO2",
-    "GPIO3",       "GPIO4",        "GPIO13",       "GPIO16",
-    "GPIO17",      "GPIO18"};
-
-UCD90160Monitor::UCD90160Monitor(sdbusplus::bus_t& bus, std::uint8_t i2cBus,
-                                 std::uint16_t i2cAddress) :
-    UCD90xMonitor(bus, i2cBus, i2cAddress, "UCD90160", 16)
-{}
-
-void UCD90160Monitor::formatGpioValues(
-    const std::vector<int>& values, unsigned int numberLines,
-    std::map<std::string, std::string>& additionalData) const
-{
-    // Verify the expected number of GPIO values were passed in
-    if ((values.size() == gpioNames.size()) &&
-        (numberLines == gpioNames.size()))
-    {
-        // Store GPIO names and values in additional data and journal.
-        // Use groups of GPIOs in journal to minimize number of entries.
-        unsigned int groupSize{4};
-        for (unsigned int i = 0; i < gpioNames.size(); ++i)
-        {
-            additionalData.emplace(gpioNames[i], std::to_string(values[i]));
-            if ((i % groupSize) == 0)
-            {
-                unsigned int gpiosLeft = gpioNames.size() - i;
-                unsigned int count = std::min(groupSize, gpiosLeft);
-                log<level::INFO>(
-                    fmt::format("GPIO values: {}: {}",
-                                std::span{gpioNames.begin() + i, count},
-                                std::span{values.begin() + i, count})
-                        .c_str());
-            }
-        }
-    }
-    else
-    {
-        // Unexpected number of GPIO values.  Store without names.
-        additionalData.emplace("GPIO_VALUES", fmt::format("{}", values));
-        log<level::INFO>(fmt::format("GPIO values: {}", values).c_str());
-    }
-}
-
-} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/ucd90160_monitor.hpp b/phosphor-power-sequencer/src/ucd90160_monitor.hpp
deleted file mode 100644
index 00a3cd8..0000000
--- a/phosphor-power-sequencer/src/ucd90160_monitor.hpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#pragma once
-
-#include "ucd90x_monitor.hpp"
-
-#include <sdbusplus/bus.hpp>
-
-#include <cstdint>
-#include <map>
-#include <string>
-#include <vector>
-
-namespace phosphor::power::sequencer
-{
-
-/**
- * @class UCD90160Monitor
- * This class implements fault analysis for the UCD90160
- * power sequencer device.
- */
-class UCD90160Monitor : public UCD90xMonitor
-{
-  public:
-    UCD90160Monitor() = delete;
-    UCD90160Monitor(const UCD90160Monitor&) = delete;
-    UCD90160Monitor& operator=(const UCD90160Monitor&) = delete;
-    UCD90160Monitor(UCD90160Monitor&&) = delete;
-    UCD90160Monitor& operator=(UCD90160Monitor&&) = delete;
-    virtual ~UCD90160Monitor() = default;
-
-    /**
-     * Create a device object for UCD90160 monitoring.
-     * @param bus D-Bus bus object
-     * @param i2cBus The bus number of the power sequencer device
-     * @param i2cAddress The I2C address of the power sequencer device
-     */
-    UCD90160Monitor(sdbusplus::bus_t& bus, std::uint8_t i2cBus,
-                    std::uint16_t i2cAddress);
-
-  protected:
-    /** @copydoc UCD90xMonitor::formatGpioValues() */
-    void formatGpioValues(
-        const std::vector<int>& values, unsigned int numberLines,
-        std::map<std::string, std::string>& additionalData) const override;
-};
-
-} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/ucd90320_monitor.cpp b/phosphor-power-sequencer/src/ucd90320_monitor.cpp
deleted file mode 100644
index 818977b..0000000
--- a/phosphor-power-sequencer/src/ucd90320_monitor.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * Copyright © 2021 IBM Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ucd90320_monitor.hpp"
-
-#include <fmt/format.h>
-#include <fmt/ranges.h>
-
-#include <phosphor-logging/log.hpp>
-
-#include <span>
-
-namespace phosphor::power::sequencer
-{
-
-using namespace phosphor::logging;
-
-UCD90320Monitor::UCD90320Monitor(sdbusplus::bus_t& bus, std::uint8_t i2cBus,
-                                 std::uint16_t i2cAddress) :
-    UCD90xMonitor(bus, i2cBus, i2cAddress, "UCD90320", 32)
-{}
-
-void UCD90320Monitor::formatGpioValues(
-    const std::vector<int>& values, unsigned int numberLines,
-    std::map<std::string, std::string>& additionalData) const
-{
-    // Device has 84 GPIO pins so that value is expected
-    if (numberLines == 84 && values.size() >= 84)
-    {
-        log<level::INFO>(fmt::format("MAR01-24 GPIO values: {}",
-                                     std::span{values}.subspan(0, 24))
-                             .c_str());
-        additionalData.emplace(
-            "MAR01_24_GPIO_VALUES",
-            fmt::format("{}", std::span{values}.subspan(0, 24)));
-        log<level::INFO>(fmt::format("EN1-32 GPIO values: {}",
-                                     std::span{values}.subspan(24, 32))
-                             .c_str());
-        additionalData.emplace(
-            "EN1_32_GPIO_VALUES",
-            fmt::format("{}", std::span{values}.subspan(24, 32)));
-        log<level::INFO>(fmt::format("LGP01-16 GPIO values: {}",
-                                     std::span{values}.subspan(56, 16))
-                             .c_str());
-        additionalData.emplace(
-            "LGP01_16_GPIO_VALUES",
-            fmt::format("{}", std::span{values}.subspan(56, 16)));
-        log<level::INFO>(fmt::format("DMON1-8 GPIO values: {}",
-                                     std::span{values}.subspan(72, 8))
-                             .c_str());
-        additionalData.emplace(
-            "DMON1_8_GPIO_VALUES",
-            fmt::format("{}", std::span{values}.subspan(72, 8)));
-        log<level::INFO>(fmt::format("GPIO1-4 GPIO values: {}",
-                                     std::span{values}.subspan(80, 4))
-                             .c_str());
-        additionalData.emplace(
-            "GPIO1_4_GPIO_VALUES",
-            fmt::format("{}", std::span{values}.subspan(80, 4)));
-    }
-    else
-    {
-        log<level::INFO>(fmt::format("GPIO values: {}", values).c_str());
-        additionalData.emplace("GPIO_VALUES", fmt::format("{}", values));
-    }
-}
-
-} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/ucd90320_monitor.hpp b/phosphor-power-sequencer/src/ucd90320_monitor.hpp
deleted file mode 100644
index a40456d..0000000
--- a/phosphor-power-sequencer/src/ucd90320_monitor.hpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#pragma once
-
-#include "ucd90x_monitor.hpp"
-
-#include <sdbusplus/bus.hpp>
-
-#include <cstdint>
-#include <map>
-#include <string>
-#include <vector>
-
-namespace phosphor::power::sequencer
-{
-
-/**
- * @class UCD90320Monitor
- * This class implements fault analysis for the UCD90320
- * power sequencer device.
- */
-class UCD90320Monitor : public UCD90xMonitor
-{
-  public:
-    UCD90320Monitor() = delete;
-    UCD90320Monitor(const UCD90320Monitor&) = delete;
-    UCD90320Monitor& operator=(const UCD90320Monitor&) = delete;
-    UCD90320Monitor(UCD90320Monitor&&) = delete;
-    UCD90320Monitor& operator=(UCD90320Monitor&&) = delete;
-    virtual ~UCD90320Monitor() = default;
-
-    /**
-     * Create a device object for UCD90320 monitoring.
-     * @param bus D-Bus bus object
-     * @param i2cBus The bus number of the power sequencer device
-     * @param i2cAddress The I2C address of the power sequencer device
-     */
-    UCD90320Monitor(sdbusplus::bus_t& bus, std::uint8_t i2cBus,
-                    std::uint16_t i2cAddress);
-
-  protected:
-    /** @copydoc UCD90xMonitor::formatGpioValues() */
-    void formatGpioValues(
-        const std::vector<int>& values, unsigned int numberLines,
-        std::map<std::string, std::string>& additionalData) const override;
-};
-
-} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/ucd90x_monitor.cpp b/phosphor-power-sequencer/src/ucd90x_monitor.cpp
deleted file mode 100644
index f36d734..0000000
--- a/phosphor-power-sequencer/src/ucd90x_monitor.cpp
+++ /dev/null
@@ -1,568 +0,0 @@
-/**
- * Copyright © 2022 IBM Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ucd90x_monitor.hpp"
-
-#include "types.hpp"
-#include "utility.hpp"
-
-#include <fmt/format.h>
-#include <fmt/ranges.h>
-
-#include <gpiod.hpp>
-#include <nlohmann/json.hpp>
-#include <phosphor-logging/log.hpp>
-
-#include <algorithm>
-#include <chrono>
-#include <exception>
-#include <fstream>
-
-namespace phosphor::power::sequencer
-{
-
-using json = nlohmann::json;
-using namespace pmbus;
-using namespace phosphor::logging;
-
-const std::string compatibleInterface =
-    "xyz.openbmc_project.Configuration.IBMCompatibleSystem";
-const std::string compatibleNamesProperty = "Names";
-
-UCD90xMonitor::UCD90xMonitor(sdbusplus::bus_t& bus, std::uint8_t i2cBus,
-                             std::uint16_t i2cAddress,
-                             const std::string& deviceName,
-                             size_t numberPages) :
-    PowerSequencerMonitor(bus),
-    deviceName{deviceName},
-    match{bus,
-          sdbusplus::bus::match::rules::interfacesAdded() +
-              sdbusplus::bus::match::rules::sender(
-                  "xyz.openbmc_project.EntityManager"),
-          std::bind(&UCD90xMonitor::interfacesAddedHandler, this,
-                    std::placeholders::_1)},
-    numberPages{numberPages},
-    pmbusInterface{
-        fmt::format("/sys/bus/i2c/devices/{}-{:04x}", i2cBus, i2cAddress)
-            .c_str(),
-        "ucd9000", 0}
-{
-    log<level::DEBUG>(
-        fmt::format("Device path: {}", pmbusInterface.path().string()).c_str());
-    log<level::DEBUG>(fmt::format("Hwmon path: {}",
-                                  pmbusInterface.getPath(Type::Hwmon).string())
-                          .c_str());
-    log<level::DEBUG>(fmt::format("Debug path: {}",
-                                  pmbusInterface.getPath(Type::Debug).string())
-                          .c_str());
-    log<level::DEBUG>(
-        fmt::format("Device debug path: {}",
-                    pmbusInterface.getPath(Type::DeviceDebug).string())
-            .c_str());
-    log<level::DEBUG>(
-        fmt::format("Hwmon device debug path: {}",
-                    pmbusInterface.getPath(Type::HwmonDeviceDebug).string())
-            .c_str());
-
-    // Use the compatible system types information, if already available, to
-    // load the configuration file
-    findCompatibleSystemTypes();
-}
-
-void UCD90xMonitor::findCompatibleSystemTypes()
-{
-    try
-    {
-        auto subTree = util::getSubTree(bus, "/xyz/openbmc_project/inventory",
-                                        compatibleInterface, 0);
-
-        auto objectIt = subTree.cbegin();
-        if (objectIt != subTree.cend())
-        {
-            const auto& objPath = objectIt->first;
-
-            // Get the first service name
-            auto serviceIt = objectIt->second.cbegin();
-            if (serviceIt != objectIt->second.cend())
-            {
-                std::string service = serviceIt->first;
-                if (!service.empty())
-                {
-                    std::vector<std::string> compatibleSystemTypes;
-
-                    // Get compatible system types property value
-                    util::getProperty(compatibleInterface,
-                                      compatibleNamesProperty, objPath, service,
-                                      bus, compatibleSystemTypes);
-
-                    log<level::DEBUG>(
-                        fmt::format("Found compatible systems: {}",
-                                    compatibleSystemTypes)
-                            .c_str());
-                    // Use compatible systems information to find config file
-                    findConfigFile(compatibleSystemTypes);
-                }
-            }
-        }
-    }
-    catch (const std::exception&)
-    {
-        // Compatible system types information is not available.
-    }
-}
-
-void UCD90xMonitor::findConfigFile(
-    const std::vector<std::string>& compatibleSystemTypes)
-{
-    // Expected config file path name:
-    // /usr/share/phosphor-power-sequencer/<deviceName>Monitor_<systemType>.json
-
-    // Add possible file names based on compatible system types (if any)
-    for (const std::string& systemType : compatibleSystemTypes)
-    {
-        // Check if file exists
-        std::filesystem::path pathName{"/usr/share/phosphor-power-sequencer/" +
-                                       deviceName + "Monitor_" + systemType +
-                                       ".json"};
-        log<level::DEBUG>(
-            fmt::format("Attempting config file path: {}", pathName.string())
-                .c_str());
-        if (std::filesystem::exists(pathName))
-        {
-            log<level::INFO>(
-                fmt::format("Config file path: {}", pathName.string()).c_str());
-            parseConfigFile(pathName);
-            break;
-        }
-    }
-}
-
-void UCD90xMonitor::interfacesAddedHandler(sdbusplus::message_t& msg)
-{
-    // Only continue if message is valid and rails / pins have not already been
-    // found
-    if (!msg || !rails.empty())
-    {
-        return;
-    }
-
-    try
-    {
-        // Read the dbus message
-        sdbusplus::message::object_path objPath;
-        std::map<std::string,
-                 std::map<std::string, std::variant<std::vector<std::string>>>>
-            interfaces;
-        msg.read(objPath, interfaces);
-
-        // Find the compatible interface, if present
-        auto itIntf = interfaces.find(compatibleInterface);
-        if (itIntf != interfaces.cend())
-        {
-            // Find the Names property of the compatible interface, if present
-            auto itProp = itIntf->second.find(compatibleNamesProperty);
-            if (itProp != itIntf->second.cend())
-            {
-                // Get value of Names property
-                const auto& propValue = std::get<0>(itProp->second);
-                if (!propValue.empty())
-                {
-                    log<level::INFO>(
-                        fmt::format(
-                            "InterfacesAdded for compatible systems: {}",
-                            propValue)
-                            .c_str());
-
-                    // Use compatible systems information to find config file
-                    findConfigFile(propValue);
-                }
-            }
-        }
-    }
-    catch (const std::exception&)
-    {
-        // Error trying to read interfacesAdded message.
-    }
-}
-
-bool UCD90xMonitor::isPresent(const std::string& inventoryPath)
-{
-    // Empty path indicates no presence check is needed
-    if (inventoryPath.empty())
-    {
-        return true;
-    }
-
-    // Get presence from D-Bus interface/property
-    try
-    {
-        bool present{true};
-        util::getProperty(INVENTORY_IFACE, PRESENT_PROP, inventoryPath,
-                          INVENTORY_MGR_IFACE, bus, present);
-        log<level::INFO>(
-            fmt::format("Presence, path: {}, value: {}", inventoryPath, present)
-                .c_str());
-        return present;
-    }
-    catch (const std::exception& e)
-    {
-        log<level::INFO>(
-            fmt::format("Error getting presence property, path: {}, error: {}",
-                        inventoryPath, e.what())
-                .c_str());
-        return false;
-    }
-}
-
-void UCD90xMonitor::formatGpioValues(
-    const std::vector<int>& values, unsigned int /*numberLines*/,
-    std::map<std::string, std::string>& additionalData) const
-{
-    log<level::INFO>(fmt::format("GPIO values: {}", values).c_str());
-    additionalData.emplace("GPIO_VALUES", fmt::format("{}", values));
-}
-
-void UCD90xMonitor::onFailure(bool timeout, const std::string& powerSupplyError)
-{
-    std::string message;
-    std::map<std::string, std::string> additionalData{};
-
-    try
-    {
-        onFailureCheckRails(message, additionalData, powerSupplyError);
-        log<level::DEBUG>(
-            fmt::format("After onFailureCheckRails, message: {}", message)
-                .c_str());
-        onFailureCheckPins(message, additionalData);
-        log<level::DEBUG>(
-            fmt::format("After onFailureCheckPins, message: {}", message)
-                .c_str());
-    }
-    catch (const std::exception& e)
-    {
-        log<level::ERR>(
-            fmt::format("Error when collecting metadata, error: {}", e.what())
-                .c_str());
-        additionalData.emplace("ERROR", e.what());
-    }
-
-    if (message.empty())
-    {
-        // Could not isolate, but we know something failed, so issue a timeout
-        // or generic power good error
-        message = timeout ? powerOnTimeoutError : shutdownError;
-    }
-    logError(message, additionalData);
-    if (!timeout)
-    {
-        createBmcDump();
-    }
-}
-
-void UCD90xMonitor::onFailureCheckPins(
-    std::string& message, std::map<std::string, std::string>& additionalData)
-{
-    // Create a lower case version of device name to use as label in libgpiod
-    std::string label{deviceName};
-    std::transform(label.begin(), label.end(), label.begin(), ::tolower);
-
-    // Setup a list of all the GPIOs on the chip
-    gpiod::chip chip{label, gpiod::chip::OPEN_BY_LABEL};
-    log<level::INFO>(fmt::format("GPIO chip name: {}", chip.name()).c_str());
-    log<level::INFO>(fmt::format("GPIO chip label: {}", chip.label()).c_str());
-    unsigned int numberLines = chip.num_lines();
-    log<level::INFO>(
-        fmt::format("GPIO chip number of lines: {}", numberLines).c_str());
-
-    // Read GPIO values.  Work around libgpiod bulk line maximum by getting
-    // values from individual lines.  The libgpiod line offsets are the same as
-    // the Pin IDs defined in the UCD90xxx PMBus interface documentation.  These
-    // Pin IDs are different from the pin numbers on the chip.  For example, on
-    // the UCD90160, "FPWM1/GPIO5" is Pin ID/line offset 0, but it is pin number
-    // 17 on the chip.
-    std::vector<int> values;
-    try
-    {
-        for (unsigned int offset = 0; offset < numberLines; ++offset)
-        {
-            gpiod::line line = chip.get_line(offset);
-            line.request({"phosphor-power-control",
-                          gpiod::line_request::DIRECTION_INPUT, 0});
-            values.push_back(line.get_value());
-            line.release();
-        }
-    }
-    catch (const std::exception& e)
-    {
-        log<level::ERR>(
-            fmt::format("Error reading device GPIOs, error: {}", e.what())
-                .c_str());
-        additionalData.emplace("GPIO_ERROR", e.what());
-    }
-
-    formatGpioValues(values, numberLines, additionalData);
-
-    // Only check GPIOs if no rail fail was found
-    if (message.empty())
-    {
-        for (size_t pin = 0; pin < pins.size(); ++pin)
-        {
-            unsigned int line = pins[pin].line;
-            if (line < values.size())
-            {
-                int value = values[line];
-
-                if ((value == 0) && isPresent(pins[pin].presence))
-                {
-                    additionalData.emplace("INPUT_NUM",
-                                           fmt::format("{}", line));
-                    additionalData.emplace("INPUT_NAME", pins[pin].name);
-                    message =
-                        "xyz.openbmc_project.Power.Error.PowerSequencerPGOODFault";
-                    return;
-                }
-            }
-        }
-    }
-}
-
-void UCD90xMonitor::onFailureCheckRails(
-    std::string& message, std::map<std::string, std::string>& additionalData,
-    const std::string& powerSupplyError)
-{
-    auto statusWord = readStatusWord();
-    additionalData.emplace("STATUS_WORD", fmt::format("{:#06x}", statusWord));
-    try
-    {
-        additionalData.emplace("MFR_STATUS",
-                               fmt::format("{:#014x}", readMFRStatus()));
-    }
-    catch (const std::exception& e)
-    {
-        log<level::ERR>(
-            fmt::format("Error when collecting MFR_STATUS, error: {}", e.what())
-                .c_str());
-        additionalData.emplace("ERROR", e.what());
-    }
-
-    // The status_word register has a summary bit to tell us if each page even
-    // needs to be checked
-    if (statusWord & status_word::VOUT_FAULT)
-    {
-        for (size_t page = 0; page < numberPages; page++)
-        {
-            auto statusVout = pmbusInterface.insertPageNum(STATUS_VOUT, page);
-            if (pmbusInterface.exists(statusVout, Type::Debug))
-            {
-                uint8_t vout = pmbusInterface.read(statusVout, Type::Debug);
-
-                if (vout)
-                {
-                    // If any bits are on log them, though some are just
-                    // warnings so they won't cause errors
-                    log<level::INFO>(
-                        fmt::format("{}, value: {:#04x}", statusVout, vout)
-                            .c_str());
-
-                    // Log errors if any non-warning bits on
-                    if (vout & ~status_vout::WARNING_MASK)
-                    {
-                        additionalData.emplace(
-                            fmt::format("STATUS{}_VOUT", page),
-                            fmt::format("{:#04x}", vout));
-
-                        // Base the callouts on the first present vout failure
-                        // found
-                        if (message.empty() && (page < rails.size()) &&
-                            isPresent(rails[page].presence))
-                        {
-                            additionalData.emplace("RAIL_NAME",
-                                                   rails[page].name);
-
-                            // Use power supply error if set and 12v rail has
-                            // failed, else use voltage error
-                            message =
-                                ((page == 0) && !powerSupplyError.empty())
-                                    ? powerSupplyError
-                                    : "xyz.openbmc_project.Power.Error.PowerSequencerVoltageFault";
-                        }
-                    }
-                }
-            }
-        }
-    }
-    // If no vout failure found, but power supply error is set, use power supply
-    // error
-    if (message.empty())
-    {
-        message = powerSupplyError;
-    }
-}
-
-void UCD90xMonitor::parseConfigFile(const std::filesystem::path& pathName)
-{
-    try
-    {
-        log<level::DEBUG>(
-            std::string("Loading configuration file " + pathName.string())
-                .c_str());
-
-        std::ifstream file{pathName};
-        json rootElement = json::parse(file);
-        log<level::DEBUG>(fmt::format("Parsed, root element is_object: {}",
-                                      rootElement.is_object())
-                              .c_str());
-
-        // Parse rail information from config file
-        auto railsIterator = rootElement.find("rails");
-        if (railsIterator != rootElement.end())
-        {
-            for (const auto& railElement : *railsIterator)
-            {
-                log<level::DEBUG>(fmt::format("Rail element is_object: {}",
-                                              railElement.is_object())
-                                      .c_str());
-
-                auto nameIterator = railElement.find("name");
-                if (nameIterator != railElement.end())
-                {
-                    log<level::DEBUG>(fmt::format("Name element is_string: {}",
-                                                  (*nameIterator).is_string())
-                                          .c_str());
-                    Rail rail;
-                    rail.name = (*nameIterator).get<std::string>();
-
-                    // Presence element is optional
-                    auto presenceIterator = railElement.find("presence");
-                    if (presenceIterator != railElement.end())
-                    {
-                        log<level::DEBUG>(
-                            fmt::format("Presence element is_string: {}",
-                                        (*presenceIterator).is_string())
-                                .c_str());
-
-                        rail.presence = (*presenceIterator).get<std::string>();
-                    }
-
-                    log<level::DEBUG>(
-                        fmt::format("Adding rail, name: {}, presence: {}",
-                                    rail.name, rail.presence)
-                            .c_str());
-                    rails.emplace_back(std::move(rail));
-                }
-                else
-                {
-                    log<level::ERR>(
-                        fmt::format(
-                            "No name found within rail in configuration file: {}",
-                            pathName.string())
-                            .c_str());
-                }
-            }
-        }
-        else
-        {
-            log<level::ERR>(
-                fmt::format("No rails found in configuration file: {}",
-                            pathName.string())
-                    .c_str());
-        }
-        log<level::DEBUG>(
-            fmt::format("Found number of rails: {}", rails.size()).c_str());
-
-        // Parse pin information from config file
-        auto pinsIterator = rootElement.find("pins");
-        if (pinsIterator != rootElement.end())
-        {
-            for (const auto& pinElement : *pinsIterator)
-            {
-                log<level::DEBUG>(fmt::format("Pin element is_object: {}",
-                                              pinElement.is_object())
-                                      .c_str());
-                auto nameIterator = pinElement.find("name");
-                auto lineIterator = pinElement.find("line");
-                if (nameIterator != pinElement.end() &&
-                    lineIterator != pinElement.end())
-                {
-                    log<level::DEBUG>(fmt::format("Name element is_string: {}",
-                                                  (*nameIterator).is_string())
-                                          .c_str());
-                    log<level::DEBUG>(
-                        fmt::format("Line element is_number_integer: {}",
-                                    (*lineIterator).is_number_integer())
-                            .c_str());
-                    Pin pin;
-                    pin.name = (*nameIterator).get<std::string>();
-                    pin.line = (*lineIterator).get<unsigned int>();
-
-                    // Presence element is optional
-                    auto presenceIterator = pinElement.find("presence");
-                    if (presenceIterator != pinElement.end())
-                    {
-                        log<level::DEBUG>(
-                            fmt::format("Presence element is_string: {}",
-                                        (*presenceIterator).is_string())
-                                .c_str());
-                        pin.presence = (*presenceIterator).get<std::string>();
-                    }
-
-                    log<level::DEBUG>(
-                        fmt::format(
-                            "Adding pin, name: {}, line: {}, presence: {}",
-                            pin.name, pin.line, pin.presence)
-                            .c_str());
-                    pins.emplace_back(std::move(pin));
-                }
-                else
-                {
-                    log<level::ERR>(
-                        fmt::format(
-                            "No name or line found within pin in configuration file: {}",
-                            pathName.string())
-                            .c_str());
-                }
-            }
-        }
-        else
-        {
-            log<level::ERR>(
-                fmt::format("No pins found in configuration file: {}",
-                            pathName.string())
-                    .c_str());
-        }
-        log<level::DEBUG>(
-            fmt::format("Found number of pins: {}", pins.size()).c_str());
-    }
-    catch (const std::exception& e)
-    {
-        log<level::ERR>(
-            fmt::format("Error parsing configuration file, error: {}", e.what())
-                .c_str());
-    }
-}
-
-uint16_t UCD90xMonitor::readStatusWord()
-{
-    return pmbusInterface.read(STATUS_WORD, Type::Debug);
-}
-
-uint64_t UCD90xMonitor::readMFRStatus()
-{
-    const std::string mfrStatus = "mfr_status";
-    return pmbusInterface.read(mfrStatus, Type::HwmonDeviceDebug);
-}
-
-} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/ucd90x_monitor.hpp b/phosphor-power-sequencer/src/ucd90x_monitor.hpp
deleted file mode 100644
index f52046c..0000000
--- a/phosphor-power-sequencer/src/ucd90x_monitor.hpp
+++ /dev/null
@@ -1,178 +0,0 @@
-#pragma once
-
-#include "pmbus.hpp"
-#include "power_sequencer_monitor.hpp"
-
-#include <sdbusplus/bus.hpp>
-#include <sdbusplus/bus/match.hpp>
-
-#include <cstdint>
-#include <filesystem>
-#include <map>
-#include <string>
-#include <vector>
-
-namespace phosphor::power::sequencer
-{
-
-struct Pin
-{
-    std::string name;
-    unsigned int line;
-    std::string presence;
-};
-
-struct Rail
-{
-    std::string name;
-    std::string presence;
-};
-
-/**
- * @class UCD90xMonitor
- * Define a base class for monitoring the UCD90* family of power sequencer
- * devices.
- */
-class UCD90xMonitor : public PowerSequencerMonitor
-{
-  public:
-    UCD90xMonitor() = delete;
-    UCD90xMonitor(const UCD90xMonitor&) = delete;
-    UCD90xMonitor& operator=(const UCD90xMonitor&) = delete;
-    UCD90xMonitor(UCD90xMonitor&&) = delete;
-    UCD90xMonitor& operator=(UCD90xMonitor&&) = delete;
-    virtual ~UCD90xMonitor() = default;
-
-    /**
-     * Create a base object for UCD90* monitoring.
-     * @param bus D-Bus bus object
-     * @param i2cBus The bus number of the power sequencer device
-     * @param i2cAddress The I2C address of the power sequencer device
-     * @param deviceName The name of the device
-     * @param numberPages The number of pages the PMBus device supports
-     */
-    UCD90xMonitor(sdbusplus::bus_t& bus, std::uint8_t i2cBus,
-                  std::uint16_t i2cAddress, const std::string& deviceName,
-                  size_t numberPages);
-
-    /**
-     * Callback function to handle interfacesAdded D-Bus signals
-     * @param msg Expanded sdbusplus message data
-     */
-    void interfacesAddedHandler(sdbusplus::message_t& msg);
-
-    /** @copydoc PowerSequencerMonitor::onFailure() */
-    void onFailure(bool timeout, const std::string& powerSupplyError) override;
-
-  protected:
-    /**
-     * Formats the GPIO values read from the device.
-     * @param values List of GPIO values
-     * @param numberLines Number of GPIO lines
-     * @param additionalData AdditionalData property of the error log entry
-     */
-    virtual void formatGpioValues(
-        const std::vector<int>& values, unsigned int numberLines,
-        std::map<std::string, std::string>& additionalData) const;
-
-  private:
-    /**
-     * Device name
-     */
-    std::string deviceName;
-
-    /**
-     * The match to Entity Manager interfaces added.
-     */
-    sdbusplus::bus::match_t match;
-
-    /**
-     * The number of pages the PMBus device supports
-     */
-    size_t numberPages;
-
-    /**
-     * List of pins
-     */
-    std::vector<Pin> pins;
-
-    /**
-     * The read/write interface to this hardware
-     */
-    pmbus::PMBus pmbusInterface;
-
-    /**
-     * List of rails
-     */
-    std::vector<Rail> rails;
-
-    /**
-     * Finds the list of compatible system types using D-Bus methods.
-     * This list is used to find the correct JSON configuration file for the
-     * current system.
-     */
-    void findCompatibleSystemTypes();
-
-    /**
-     * Finds the JSON configuration file.
-     * Looks for a configuration file based on the list of compatible system
-     * types.
-     * Throws an exception if an operating system error occurs while checking
-     * for the existance of a file.
-     * @param compatibleSystemTypes List of compatible system types
-     */
-    void findConfigFile(const std::vector<std::string>& compatibleSystemTypes);
-
-    /**
-     * Returns whether the hardware with the specified inventory path is
-     * present.
-     * If an error occurs while obtaining the presence value, presence is
-     * assumed to be false. An empty string path indicates no presence check is
-     * needed.
-     * @param inventoryPath D-Bus inventory path of the hardware
-     * @return true if hardware is present, false otherwise
-     */
-    bool isPresent(const std::string& inventoryPath);
-
-    /**
-     * Analyzes the device pins for errors when the device is known to be in an
-     * error state.
-     * @param message Message property of the error log entry
-     * @param additionalData AdditionalData property of the error log entry
-     */
-    void onFailureCheckPins(std::string& message,
-                            std::map<std::string, std::string>& additionalData);
-
-    /**
-     * Analyzes the device rails for errors when the device is known to be in an
-     * error state.
-     * @param message Message property of the error log entry
-     * @param additionalData AdditionalData property of the error log entry
-     * @param powerSupplyError The power supply error to log. A default
-     * std:string, i.e. empty string (""), is passed when there is no power
-     * supply error to log.
-     */
-    void onFailureCheckRails(std::string& message,
-                             std::map<std::string, std::string>& additionalData,
-                             const std::string& powerSupplyError);
-
-    /**
-     * Parse the JSON configuration file.
-     * @param pathName the path name
-     */
-    void parseConfigFile(const std::filesystem::path& pathName);
-
-    /**
-     * Reads the mfr_status register
-     * @return the register contents
-     */
-    uint64_t readMFRStatus();
-
-    /**
-     * Reads the status_word register
-     * @return the register contents
-     */
-    uint16_t readStatusWord();
-};
-
-} // namespace phosphor::power::sequencer
