diff --git a/include/ADCSensor.hpp b/include/ADCSensor.hpp
index e15ba0a..59b4450 100644
--- a/include/ADCSensor.hpp
+++ b/include/ADCSensor.hpp
@@ -7,7 +7,6 @@
 class ADCSensor : public Sensor
 {
   public:
-    std::string name;
     std::string configuration;
     ADCSensor(const std::string &path,
               sdbusplus::asio::object_server &objectServer,
@@ -18,7 +17,6 @@
     ~ADCSensor();
 
   private:
-    std::string path;
     sdbusplus::asio::object_server &objServer;
     boost::asio::posix::stream_descriptor inputDev;
     boost::asio::deadline_timer waitTimer;
diff --git a/include/CPUSensor.hpp b/include/CPUSensor.hpp
index c4fca5d..41cc02f 100644
--- a/include/CPUSensor.hpp
+++ b/include/CPUSensor.hpp
@@ -7,7 +7,6 @@
 class CPUSensor : public Sensor
 {
   public:
-    std::string name;
     std::string configuration;
     CPUSensor(const std::string &path, const std::string &objectType,
               sdbusplus::asio::object_server &objectServer,
@@ -20,7 +19,6 @@
     static constexpr unsigned int sensorPollMs = 1000;
 
   private:
-    std::string path;
     std::string objectType;
     sdbusplus::asio::object_server &objServer;
     std::shared_ptr<sdbusplus::asio::connection> dbusConnection;
diff --git a/include/HwmonTempSensor.hpp b/include/HwmonTempSensor.hpp
index 14cb6c7..117f286 100644
--- a/include/HwmonTempSensor.hpp
+++ b/include/HwmonTempSensor.hpp
@@ -7,7 +7,6 @@
 class HwmonTempSensor : public Sensor
 {
   public:
-    std::string name;
     std::string configuration;
     HwmonTempSensor(const std::string &path, const std::string &objectType,
                     sdbusplus::asio::object_server &objectServer,
@@ -18,7 +17,6 @@
     ~HwmonTempSensor();
 
   private:
-    std::string path;
     std::string objectType;
     sdbusplus::asio::object_server &objServer;
     boost::asio::posix::stream_descriptor inputDev;
diff --git a/include/TachSensor.hpp b/include/TachSensor.hpp
index 2dc6216..36e3eaa 100644
--- a/include/TachSensor.hpp
+++ b/include/TachSensor.hpp
@@ -1,6 +1,8 @@
 #pragma once
 
 #include <Thresholds.hpp>
+#include <boost/container/flat_map.hpp>
+#include <boost/container/flat_set.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 #include <sensor.hpp>
 
@@ -23,23 +25,40 @@
     boost::asio::ip::tcp::socket inputDev;
     int fd;
 };
+
+class RedundancySensor
+{
+  public:
+    RedundancySensor(size_t count, const std::vector<std::string> &children,
+                     sdbusplus::asio::object_server &objectServer);
+    ~RedundancySensor();
+
+    void update(const std::string &name, bool failed);
+
+  private:
+    size_t count;
+    std::shared_ptr<sdbusplus::asio::dbus_interface> iface;
+    sdbusplus::asio::object_server &objectServer;
+    boost::container::flat_map<std::string, bool> statuses;
+};
+
 class TachSensor : public Sensor
 {
   public:
-    std::string name;
     std::string configuration;
     TachSensor(const std::string &path,
                sdbusplus::asio::object_server &objectServer,
                std::shared_ptr<sdbusplus::asio::connection> &conn,
                std::unique_ptr<PresenceSensor> &&presence,
+               std::unique_ptr<RedundancySensor> &redundancy,
                boost::asio::io_service &io, const std::string &fanName,
                std::vector<thresholds::Threshold> &&thresholds,
                const std::string &sensorConfiguration);
     ~TachSensor();
 
   private:
-    std::string path;
     sdbusplus::asio::object_server &objServer;
+    std::unique_ptr<RedundancySensor> &redundancy;
     std::shared_ptr<sdbusplus::asio::connection> dbusConnection;
     std::unique_ptr<PresenceSensor> presence;
     boost::asio::posix::stream_descriptor inputDev;
diff --git a/include/Thresholds.hpp b/include/Thresholds.hpp
index 4a07ca2..3f9aa79 100644
--- a/include/Thresholds.hpp
+++ b/include/Thresholds.hpp
@@ -48,7 +48,8 @@
                       const thresholds::Threshold &threshold,
                       std::shared_ptr<sdbusplus::asio::connection> &conn);
 
-void checkThresholds(Sensor *sensor);
+// returns false if a critical threshold has been crossed, true otherwise
+bool checkThresholds(Sensor *sensor);
 void assertThresholds(Sensor *sensor, thresholds::Level level,
                       thresholds::Direction direction, bool assert);
 } // namespace thresholds
diff --git a/include/sensor.hpp b/include/sensor.hpp
index a19b969..dc9cdbe 100644
--- a/include/sensor.hpp
+++ b/include/sensor.hpp
@@ -6,7 +6,15 @@
 constexpr size_t sensorFailedPollTimeMs = 5000;
 struct Sensor
 {
+    Sensor(const std::string& name, const std::string& path,
+           std::vector<thresholds::Threshold>&& thresholdData) :
+        name(name),
+        path(path), thresholds(std::move(thresholdData))
+    {
+    }
     virtual ~Sensor() = default;
+    std::string name;
+    std::string path;
     std::vector<thresholds::Threshold> thresholds;
     std::shared_ptr<sdbusplus::asio::dbus_interface> sensorInterface;
     std::shared_ptr<sdbusplus::asio::dbus_interface> thresholdInterfaceWarning;
diff --git a/src/ADCSensor.cpp b/src/ADCSensor.cpp
index 0955994..09c62cf 100644
--- a/src/ADCSensor.cpp
+++ b/src/ADCSensor.cpp
@@ -39,15 +39,14 @@
                      std::vector<thresholds::Threshold> &&_thresholds,
                      const double scaleFactor,
                      const std::string &sensorConfiguration) :
-    Sensor(),
-    path(path), objServer(objectServer), configuration(sensorConfiguration),
-    name(boost::replace_all_copy(sensorName, " ", "_")),
+    Sensor(boost::replace_all_copy(sensorName, " ", "_"), path,
+           std::move(_thresholds)),
+    objServer(objectServer), configuration(sensorConfiguration),
     scaleFactor(scaleFactor), inputDev(io, open(path.c_str(), O_RDONLY)),
     waitTimer(io), errCount(0),
     // todo, get these from config
     maxValue(20), minValue(0)
 {
-    thresholds = std::move(_thresholds);
     sensorInterface = objectServer.add_interface(
         "/xyz/openbmc_project/sensors/voltage/" + name,
         "xyz.openbmc_project.Sensor.Value");
@@ -118,15 +117,18 @@
     }
     else
     {
-        std::cerr << "Failure to read sensor " << name << " at " << path
-                  << " ec:" << err << "\n";
 
         errCount++;
     }
-
-    // only send value update once
+    // only print once
     if (errCount == warnAfterErrorCount)
     {
+        std::cerr << "Failure to read sensor " << name << " at " << path
+                  << " ec:" << err << "\n";
+    }
+
+    if (errCount >= warnAfterErrorCount)
+    {
         updateValue(0);
     }
 
diff --git a/src/CPUSensor.cpp b/src/CPUSensor.cpp
index 236dd81..eda9a3b 100644
--- a/src/CPUSensor.cpp
+++ b/src/CPUSensor.cpp
@@ -35,16 +35,15 @@
                      boost::asio::io_service &io, const std::string &sensorName,
                      std::vector<thresholds::Threshold> &&_thresholds,
                      const std::string &sensorConfiguration) :
-    Sensor(),
-    path(path), objectType(objectType), objServer(objectServer),
-    name(boost::replace_all_copy(sensorName, " ", "_")), dbusConnection(conn),
+    Sensor(boost::replace_all_copy(sensorName, " ", "_"), path,
+           std::move(_thresholds)),
+    objectType(objectType), objServer(objectServer), dbusConnection(conn),
     configuration(sensorConfiguration),
 
     inputDev(io, open(path.c_str(), O_RDONLY)), waitTimer(io), errCount(0),
     // todo, get these from config
     maxValue(127), minValue(-128)
 {
-    thresholds = std::move(_thresholds);
     sensorInterface = objectServer.add_interface(
         "/xyz/openbmc_project/sensors/temperature/" + name,
         "xyz.openbmc_project.Sensor.Value");
@@ -117,14 +116,17 @@
         errCount++;
     }
 
-    // only send value update once
-    if (errCount == warnAfterErrorCount)
+    if (errCount >= warnAfterErrorCount)
     {
         // only an error if power is on
         if (isPowerOn(dbusConnection))
         {
-            std::cerr << "Failure to read sensor " << name << " at " << path
-                      << "\n";
+            // only print once
+            if (errCount == warnAfterErrorCount)
+            {
+                std::cerr << "Failure to read sensor " << name << " at " << path
+                          << "\n";
+            }
             updateValue(0);
             errCount++;
         }
diff --git a/src/FanMain.cpp b/src/FanMain.cpp
index 542ca78..8401343 100644
--- a/src/FanMain.cpp
+++ b/src/FanMain.cpp
@@ -34,8 +34,13 @@
 namespace variant_ns = sdbusplus::message::variant_ns;
 static constexpr std::array<const char*, 1> sensorTypes = {
     "xyz.openbmc_project.Configuration.AspeedFan"};
+constexpr const char* redundancyConfiguration =
+    "xyz.openbmc_project.Configuration.FanRedundancy";
 static std::regex inputRegex(R"(fan(\d+)_input)");
 
+// todo: power supply fan redundancy
+std::unique_ptr<RedundancySensor> systemRedundancy = nullptr;
+
 void createSensors(
     boost::asio::io_service& io, sdbusplus::asio::object_server& objectServer,
     boost::container::flat_map<std::string, std::unique_ptr<TachSensor>>&
@@ -241,7 +246,7 @@
 
         tachSensors[sensorName] = std::make_unique<TachSensor>(
             path.string(), objectServer, dbusConnection,
-            std::move(presenceSensor), io, sensorName,
+            std::move(presenceSensor), systemRedundancy, io, sensorName,
             std::move(sensorThresholds), *interfacePath);
     }
     std::vector<fs::path> pwms;
@@ -259,6 +264,56 @@
     }
 }
 
+void createRedundancySensor(
+    const boost::container::flat_map<std::string, std::unique_ptr<TachSensor>>&
+        sensors,
+    std::shared_ptr<sdbusplus::asio::connection> conn,
+    sdbusplus::asio::object_server& objectServer)
+{
+
+    conn->async_method_call(
+        [&objectServer, &sensors](boost::system::error_code& ec,
+                                  const ManagedObjectType managedObj) {
+            if (ec)
+            {
+                std::cerr << "Error calling entity manager \n";
+                return;
+            }
+            for (const auto& pathPair : managedObj)
+            {
+                for (const auto& interfacePair : pathPair.second)
+                {
+                    if (interfacePair.first == redundancyConfiguration)
+                    {
+                        // currently only support one
+                        auto findCount =
+                            interfacePair.second.find("AllowedFailures");
+                        if (findCount == interfacePair.second.end())
+                        {
+                            std::cerr << "Malformed redundancy record \n";
+                            return;
+                        }
+                        std::vector<std::string> sensorList;
+
+                        for (const auto& sensor : sensors)
+                        {
+                            sensorList.push_back(
+                                "/xyz/openbmc_project/sensors/fan_tach/" +
+                                sensor.second->name);
+                        }
+                        systemRedundancy = std::make_unique<RedundancySensor>(
+                            variant_ns::get<uint64_t>(findCount->second),
+                            sensorList, objectServer);
+
+                        return;
+                    }
+                }
+            }
+        },
+        "xyz.openbmc_project.EntityManager", "/",
+        "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
+}
+
 int main(int argc, char** argv)
 {
     boost::asio::io_service io;
@@ -276,6 +331,7 @@
     io.post([&]() {
         createSensors(io, objectServer, tachSensors, pwmSensors, systemBus,
                       nullptr);
+        createRedundancySensor(tachSensors, systemBus, objectServer);
     });
 
     boost::asio::deadline_timer filterTimer(io);
@@ -316,5 +372,19 @@
         matches.emplace_back(std::move(match));
     }
 
+    // redundancy sensor
+    std::function<void(sdbusplus::message::message&)> redundancyHandler =
+        [&tachSensors, &systemBus,
+         &objectServer](sdbusplus::message::message& message) {
+            createRedundancySensor(tachSensors, systemBus, objectServer);
+        };
+    auto match = std::make_unique<sdbusplus::bus::match::match>(
+        static_cast<sdbusplus::bus::bus&>(*systemBus),
+        "type='signal',member='PropertiesChanged',path_namespace='" +
+            std::string(inventoryPath) + "',arg0namespace='" +
+            redundancyConfiguration + "'",
+        redundancyHandler);
+    matches.emplace_back(std::move(match));
+
     io.run();
 }
diff --git a/src/HwmonTempSensor.cpp b/src/HwmonTempSensor.cpp
index 1d58f07..8510563 100644
--- a/src/HwmonTempSensor.cpp
+++ b/src/HwmonTempSensor.cpp
@@ -37,15 +37,14 @@
     boost::asio::io_service &io, const std::string &sensorName,
     std::vector<thresholds::Threshold> &&_thresholds,
     const std::string &sensorConfiguration) :
-    Sensor(),
-    path(path), objectType(objectType), configuration(sensorConfiguration),
-    objServer(objectServer),
-    name(boost::replace_all_copy(sensorName, " ", "_")),
-    inputDev(io, open(path.c_str(), O_RDONLY)), waitTimer(io), errCount(0),
+    Sensor(boost::replace_all_copy(sensorName, " ", "_"), path,
+           std::move(_thresholds)),
+    objectType(objectType), configuration(sensorConfiguration),
+    objServer(objectServer), inputDev(io, open(path.c_str(), O_RDONLY)),
+    waitTimer(io), errCount(0),
     // todo, get these from config
     maxValue(127), minValue(-128)
 {
-    thresholds = std::move(_thresholds);
     sensorInterface = objectServer.add_interface(
         "/xyz/openbmc_project/sensors/temperature/" + name,
         "xyz.openbmc_project.Sensor.Value");
@@ -113,13 +112,18 @@
     }
     else
     {
-        std::cerr << "Failure to read sensor " << name << " at " << path
-                  << "\n";
         errCount++;
     }
-    // only send value update once
+
+    // only print once
     if (errCount == warnAfterErrorCount)
     {
+        std::cerr << "Failure to read sensor " << name << " at " << path
+                  << " ec:" << err << "\n";
+    }
+
+    if (errCount >= warnAfterErrorCount)
+    {
         updateValue(0);
     }
     responseStream.clear();
diff --git a/src/TachSensor.cpp b/src/TachSensor.cpp
index 4398f61..0f441cd 100644
--- a/src/TachSensor.cpp
+++ b/src/TachSensor.cpp
@@ -35,19 +35,19 @@
                        sdbusplus::asio::object_server &objectServer,
                        std::shared_ptr<sdbusplus::asio::connection> &conn,
                        std::unique_ptr<PresenceSensor> &&presence,
+                       std::unique_ptr<RedundancySensor> &redundancy,
                        boost::asio::io_service &io, const std::string &fanName,
                        std::vector<thresholds::Threshold> &&_thresholds,
                        const std::string &sensorConfiguration) :
-    Sensor(),
-    path(path), objServer(objectServer), dbusConnection(conn),
-    presence(std::move(presence)),
-    name(boost::replace_all_copy(fanName, " ", "_")),
+    Sensor(boost::replace_all_copy(fanName, " ", "_"), path,
+           std::move(_thresholds)),
+    objServer(objectServer), dbusConnection(conn),
+    presence(std::move(presence)), redundancy(redundancy),
     configuration(sensorConfiguration),
     inputDev(io, open(path.c_str(), O_RDONLY)), waitTimer(io), errCount(0),
     // todo, get these from config
     maxValue(25000), minValue(0)
 {
-    thresholds = std::move(_thresholds);
     sensorInterface = objectServer.add_interface(
         "/xyz/openbmc_project/sensors/fan_tach/" + name,
         "xyz.openbmc_project.Sensor.Value");
@@ -131,14 +131,17 @@
             pollTime = sensorFailedPollTimeMs;
             errCount++;
         }
-        // only send value update once
-        if (errCount == warnAfterErrorCount)
+        if (errCount >= warnAfterErrorCount)
         {
             // only an error if power is on
             if (isPowerOn(dbusConnection))
             {
-                std::cerr << "Failure to read sensor " << name << " at " << path
-                          << "\n";
+                // only print once
+                if (errCount == warnAfterErrorCount)
+                {
+                    std::cerr << "Failure to read sensor " << name << " at "
+                              << path << " ec:" << err << "\n";
+                }
                 updateValue(0);
             }
             else
@@ -168,7 +171,12 @@
 
 void TachSensor::checkThresholds(void)
 {
-    thresholds::checkThresholds(this);
+    bool status = thresholds::checkThresholds(this);
+    if (redundancy)
+    {
+        redundancy->update("/xyz/openbmc_project/sensors/fan_tach/" + name,
+                           !status);
+    }
 }
 
 void TachSensor::updateValue(const double &newValue)
@@ -337,4 +345,47 @@
 bool PresenceSensor::getValue(void)
 {
     return status;
-}
\ No newline at end of file
+}
+
+RedundancySensor::RedundancySensor(
+    size_t count, const std::vector<std::string> &children,
+    sdbusplus::asio::object_server &objectServer) :
+    count(count),
+    iface(objectServer.add_interface(
+        "/xyz/openbmc_project/control/FanRedundancy/Tach",
+        "xyz.openbmc_project.control.FanRedundancy")),
+    objectServer(objectServer)
+{
+    iface->register_property("Collection", children);
+    iface->register_property("Status", std::string("Full"));
+    iface->register_property("AllowedFailures", static_cast<uint8_t>(count));
+    iface->initialize();
+}
+RedundancySensor::~RedundancySensor()
+{
+    objectServer.remove_interface(iface);
+}
+void RedundancySensor::update(const std::string &name, bool failed)
+{
+    statuses[name] = failed;
+    size_t failedCount = 0;
+
+    std::string state = "Full";
+    for (const auto &status : statuses)
+    {
+        if (status.second)
+        {
+            failedCount++;
+        }
+        if (failedCount > count)
+        {
+            state = "Failed";
+            break;
+        }
+        else if (failedCount)
+        {
+            state = "Degraded";
+        }
+    }
+    iface->set_property("Status", state);
+}
diff --git a/src/Thresholds.cpp b/src/Thresholds.cpp
index ee4f7d0..10b1674 100644
--- a/src/Thresholds.cpp
+++ b/src/Thresholds.cpp
@@ -2,6 +2,7 @@
 #include <VariantVisitors.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/lexical_cast.hpp>
+#include <cmath>
 #include <fstream>
 #include <iostream>
 #include <sensor.hpp>
@@ -163,16 +164,21 @@
     }
 }
 
-void checkThresholds(Sensor *sensor)
+bool checkThresholds(Sensor *sensor)
 {
+    bool status = true;
 
     if (sensor->thresholds.empty())
     {
-        return;
+        return true;
     }
     for (auto &threshold : sensor->thresholds)
     {
-        if (threshold.direction == thresholds::Direction::HIGH)
+        if (std::isnan(sensor->value))
+        {
+            threshold.asserted = false;
+        }
+        else if (threshold.direction == thresholds::Direction::HIGH)
         {
             if (sensor->value > threshold.value && !threshold.asserted)
             {
@@ -202,7 +208,13 @@
                 threshold.asserted = false;
             }
         }
+        if (threshold.level == thresholds::Level::CRITICAL &&
+            threshold.asserted)
+        {
+            status = false;
+        }
     }
+    return status;
 }
 
 void assertThresholds(Sensor *sensor, thresholds::Level level,
diff --git a/src/Utils.cpp b/src/Utils.cpp
index 768f708..a5685d5 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -152,7 +152,7 @@
             powerStatusOn = sdbusplus::message::variant_ns::get<int32_t>(pgood);
         },
         powerInterfaceName, powerObjectName, "org.freedesktop.DBus.Properties",
-        "Get", "pgood");
+        "Get", powerInterfaceName, "pgood");
 
     return powerStatusOn;
 }
\ No newline at end of file
