diff --git a/sensor-monitor/Makefile.am b/sensor-monitor/Makefile.am
new file mode 100644
index 0000000..2cd7e7d
--- /dev/null
+++ b/sensor-monitor/Makefile.am
@@ -0,0 +1,24 @@
+AM_DEFAULT_SOURCE_EXT = .cpp
+AM_CPPFLAGS = -iquote ${top_srcdir}
+
+bin_PROGRAMS = \
+	sensor-monitor
+
+sensor_monitor_SOURCES = \
+    shutdown_alarm_monitor.cpp \
+	main.cpp
+
+sensor_monitor_LDADD = \
+	$(SDBUSPLUS_LIBS) \
+	$(SDEVENTPLUS_LIBS) \
+	$(PHOSPHOR_LOGGING_LIBS) \
+	${PHOSPHOR_DBUS_INTERFACES_LIBS} \
+	-lstdc++fs \
+	$(FMT_LIBS)
+
+sensor_monitor_CXXFLAGS = \
+	$(SDBUSPLUS_CFLAGS) \
+	$(SDEVENTPLUS_CFLAGS) \
+	$(PHOSPHOR_LOGGING_CFLAGS) \
+	${PHOSPHOR_DBUS_INTERFACES_CFLAGS} \
+	-flto
diff --git a/sensor-monitor/main.cpp b/sensor-monitor/main.cpp
new file mode 100644
index 0000000..bf1bf17
--- /dev/null
+++ b/sensor-monitor/main.cpp
@@ -0,0 +1,32 @@
+/**
+ * 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 "shutdown_alarm_monitor.hpp"
+
+#include <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
+
+using namespace sensor::monitor;
+
+int main(int argc, char* argv[])
+{
+    auto event = sdeventplus::Event::get_default();
+    auto bus = sdbusplus::bus::new_default();
+    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
+
+    ShutdownAlarmMonitor shutdownMonitor{bus, event};
+
+    return event.loop();
+}
diff --git a/sensor-monitor/shutdown_alarm_monitor.cpp b/sensor-monitor/shutdown_alarm_monitor.cpp
new file mode 100644
index 0000000..2017770
--- /dev/null
+++ b/sensor-monitor/shutdown_alarm_monitor.cpp
@@ -0,0 +1,142 @@
+/**
+ * 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 "config.h"
+
+#include "shutdown_alarm_monitor.hpp"
+
+#include <fmt/format.h>
+
+#include <phosphor-logging/log.hpp>
+
+namespace sensor::monitor
+{
+using namespace phosphor::logging;
+using namespace phosphor::fan::util;
+using namespace phosphor::fan;
+namespace fs = std::filesystem;
+
+const std::map<ShutdownType, std::string> shutdownInterfaces{
+    {ShutdownType::hard, "xyz.openbmc_project.Sensor.Threshold.HardShutdown"},
+    {ShutdownType::soft, "xyz.openbmc_project.Sensor.Threshold.SoftShutdown"}};
+
+const std::map<ShutdownType, std::map<AlarmType, std::string>> alarmProperties{
+    {ShutdownType::hard,
+     {{AlarmType::low, "HardShutdownAlarmLow"},
+      {AlarmType::high, "HardShutdownAlarmHigh"}}},
+    {ShutdownType::soft,
+     {{AlarmType::low, "SoftShutdownAlarmLow"},
+      {AlarmType::high, "SoftShutdownAlarmHigh"}}}};
+
+using namespace sdbusplus::bus::match;
+
+ShutdownAlarmMonitor::ShutdownAlarmMonitor(sdbusplus::bus::bus& bus,
+                                           sdeventplus::Event& event) :
+    bus(bus),
+    event(event),
+    hardShutdownMatch(bus,
+                      "type='signal',member='PropertiesChanged',"
+                      "path_namespace='/xyz/openbmc_project/sensors',"
+                      "arg0='" +
+                          shutdownInterfaces.at(ShutdownType::soft) + "'",
+                      std::bind(&ShutdownAlarmMonitor::propertiesChanged, this,
+                                std::placeholders::_1)),
+    softShutdownMatch(bus,
+                      "type='signal',member='PropertiesChanged',"
+                      "path_namespace='/xyz/openbmc_project/sensors',"
+                      "arg0='" +
+                          shutdownInterfaces.at(ShutdownType::hard) + "'",
+                      std::bind(&ShutdownAlarmMonitor::propertiesChanged, this,
+                                std::placeholders::_1)),
+    _powerState(std::make_unique<PGoodState>(
+        bus, std::bind(&ShutdownAlarmMonitor::powerStateChanged, this,
+                       std::placeholders::_1)))
+{
+    findAlarms();
+
+    if (_powerState->isPowerOn())
+    {
+        checkAlarms();
+    }
+}
+
+void ShutdownAlarmMonitor::findAlarms()
+{
+    // Find all shutdown threshold ifaces currently on D-Bus.
+    for (const auto& [shutdownType, interface] : shutdownInterfaces)
+    {
+        auto paths = SDBusPlus::getSubTreePathsRaw(bus, "/", interface, 0);
+
+        std::for_each(
+            paths.begin(), paths.end(), [this, shutdownType](const auto& path) {
+                alarms.emplace(AlarmKey{path, shutdownType, AlarmType::high},
+                               nullptr);
+                alarms.emplace(AlarmKey{path, shutdownType, AlarmType::low},
+                               nullptr);
+            });
+    }
+}
+
+void ShutdownAlarmMonitor::checkAlarms()
+{
+    for (auto& [alarmKey, timer] : alarms)
+    {
+        const auto& [sensorPath, shutdownType, alarmType] = alarmKey;
+        const auto& interface = shutdownInterfaces.at(shutdownType);
+        auto propertyName = alarmProperties.at(shutdownType).at(alarmType);
+        bool value;
+
+        try
+        {
+            value = SDBusPlus::getProperty<bool>(bus, sensorPath, interface,
+                                                 propertyName);
+        }
+        catch (const DBusServiceError& e)
+        {
+            // The sensor isn't on D-Bus anymore
+            log<level::INFO>(fmt::format("No {} interface on {} anymore.",
+                                         interface, sensorPath)
+                                 .c_str());
+            continue;
+        }
+
+        checkAlarm(value, alarmKey);
+    }
+}
+
+void ShutdownAlarmMonitor::propertiesChanged(
+    sdbusplus::message::message& message)
+{
+    // check the values
+}
+
+void ShutdownAlarmMonitor::checkAlarm(bool value, const AlarmKey& alarmKey)
+{
+    // start or stop a timer possibly
+}
+
+void ShutdownAlarmMonitor::powerStateChanged(bool powerStateOn)
+{
+    if (powerStateOn)
+    {
+        checkAlarms();
+    }
+    else
+    {
+        // Cancel and delete all timers
+    }
+}
+
+} // namespace sensor::monitor
diff --git a/sensor-monitor/shutdown_alarm_monitor.hpp b/sensor-monitor/shutdown_alarm_monitor.hpp
new file mode 100644
index 0000000..6b1c823
--- /dev/null
+++ b/sensor-monitor/shutdown_alarm_monitor.hpp
@@ -0,0 +1,154 @@
+/**
+ * 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.
+ */
+#pragma once
+#include "power_state.hpp"
+#include "types.hpp"
+
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/bus/match.hpp>
+#include <sdeventplus/clock.hpp>
+#include <sdeventplus/event.hpp>
+#include <sdeventplus/utility/timer.hpp>
+
+namespace sensor::monitor
+{
+
+/**
+ * @class ShutdownAlarmMonitor
+ *
+ * This class finds all instances of the D-Bus interfaces
+ *   xyz.openbmc_project.Sensor.Threshold.SoftShutdown
+ *   xyz.openbmc_project.Sensor.Threshold.HardShutdown
+ *
+ * and then watches the high and low alarm properties.  If they trip
+ * the code will start a timer, at the end of which the system will
+ * be shut down.  The timer values can be modified with configure.ac
+ * options.  If the alarm is cleared before the timer expires, then
+ * the timer is stopped.
+ *
+ * Event logs are also created when the alarms trip and clear.
+ *
+ * Note that the SoftShutdown alarm code actually implements a hard shutdown.
+ * This is because in the system this is being written for, the host is
+ * driving the shutdown process (i.e. doing a soft shutdown) based on an alert
+ * it receives via another channel.  If the soft shutdown timer expires, it
+ * means that the host didn't do a soft shutdown in the time allowed and
+ * now a hard shutdown is required.  This behavior could be modified with
+ * compile flags if anyone needs a different behavior in the future.
+ *
+ * It currently uses the PGoodState class to check for power state.
+ * If a different property is ever desired, a new class can be
+ * derived from PowerState and a compile option can be used.
+ *
+ */
+class ShutdownAlarmMonitor
+{
+  public:
+    ShutdownAlarmMonitor() = delete;
+    ~ShutdownAlarmMonitor() = default;
+    ShutdownAlarmMonitor(const ShutdownAlarmMonitor&) = delete;
+    ShutdownAlarmMonitor& operator=(const ShutdownAlarmMonitor&) = delete;
+    ShutdownAlarmMonitor(ShutdownAlarmMonitor&&) = delete;
+    ShutdownAlarmMonitor& operator=(ShutdownAlarmMonitor&&) = delete;
+
+    /**
+     * @brief Constructor
+     *
+     * @param[in] bus - The sdbusplus bus object
+     * @param[in] event - The sdeventplus event object
+     */
+    ShutdownAlarmMonitor(sdbusplus::bus::bus& bus, sdeventplus::Event& event);
+
+  private:
+    /**
+     * @brief The propertiesChanged handled for the shutdown interfaces.
+     *
+     * If the power is on, the new alarm values will be checked to see
+     * if the shutdown timer needs to be started or stopped.
+     */
+    void propertiesChanged(sdbusplus::message::message& message);
+
+    /**
+     * @brief Checks an alarm value to see if a shutdown timer needs
+     *        to be started or stopped.
+     *
+     * If the alarm is on and the timer isn't running, start it.
+     * If the alarm is off and the timer is running, stop it.
+     *
+     * @param[in] value - The alarm property value
+     * @param[in] alarmKey - The alarm key
+     */
+    void checkAlarm(bool value, const AlarmKey& alarmKey);
+
+    /**
+     * @brief Checks all currently known alarm properties on D-Bus.
+     *
+     * May result in starting or stopping shutdown timers.
+     */
+    void checkAlarms();
+
+    /**
+     * @brief Finds all shutdown alarm interfaces currently on
+     *        D-Bus and adds them to the alarms map.
+     */
+    void findAlarms();
+
+    /**
+     * @brief The power state changed handler.
+     *
+     * Checks alarms when power is turned on, and clears
+     * any running timers on a power off.
+     *
+     * @param[in] powerStateOn - If the power is now on or off.
+     */
+    void powerStateChanged(bool powerStateOn);
+
+    /**
+     * @brief The sdbusplus bus object
+     */
+    sdbusplus::bus::bus& bus;
+
+    /**
+     * @brief The sdeventplus Event object
+     */
+    sdeventplus::Event& event;
+
+    /**
+     * @brief The match for properties changing on the HardShutdown
+     *        interface.
+     */
+    sdbusplus::bus::match::match hardShutdownMatch;
+
+    /**
+     * @brief The match for properties changing on the SoftShutdown
+     *        interface.
+     */
+    sdbusplus::bus::match::match softShutdownMatch;
+
+    /**
+     * @brief The PowerState object to track power state changes.
+     */
+    std::unique_ptr<phosphor::fan::PowerState> _powerState;
+
+    /**
+     * @brief The map of alarms.
+     */
+    std::map<AlarmKey, std::unique_ptr<sdeventplus::utility::Timer<
+                           sdeventplus::ClockId::Monotonic>>>
+        alarms;
+};
+
+} // namespace sensor::monitor
diff --git a/sensor-monitor/types.hpp b/sensor-monitor/types.hpp
new file mode 100644
index 0000000..3fd9561
--- /dev/null
+++ b/sensor-monitor/types.hpp
@@ -0,0 +1,33 @@
+#pragma once
+
+#include <sdeventplus/clock.hpp>
+#include <sdeventplus/event.hpp>
+#include <sdeventplus/utility/timer.hpp>
+
+#include <memory>
+#include <string>
+#include <tuple>
+
+namespace sensor::monitor
+{
+
+/**
+ * @brief The enum to represent a hard or soft shutdown
+ */
+enum class ShutdownType
+{
+    hard,
+    soft
+};
+
+/**
+ * @brief The enum to represent a low or high alarm
+ */
+enum class AlarmType
+{
+    low,
+    high
+};
+
+using AlarmKey = std::tuple<std::string, ShutdownType, AlarmType>;
+} // namespace sensor::monitor
