diff --git a/pid/builder.cpp b/pid/builder.cpp
index bae0e81..39d0076 100644
--- a/pid/builder.cpp
+++ b/pid/builder.cpp
@@ -95,7 +95,7 @@
                 for (const auto& i : info.inputs)
                 {
                     inputs.push_back(i);
-                    zone->addFanInput(i.name);
+                    zone->addFanInput(i.name, i.missingIsAcceptable);
                 }
 
                 auto pid = FanController::createFanPid(
@@ -108,7 +108,7 @@
                 for (const auto& i : info.inputs)
                 {
                     inputs.push_back(i);
-                    zone->addThermalInput(i.name);
+                    zone->addThermalInput(i.name, i.missingIsAcceptable);
                 }
 
                 auto pid = ThermalController::createThermalPid(
@@ -126,7 +126,7 @@
                 for (const auto& i : info.inputs)
                 {
                     inputs.push_back(i);
-                    zone->addThermalInput(i.name);
+                    zone->addThermalInput(i.name, i.missingIsAcceptable);
                 }
                 auto stepwise = StepwiseController::createStepwiseController(
                     zone.get(), name, splitNames(inputs), info.stepwiseInfo);
@@ -145,6 +145,10 @@
                 {
                     std::cerr << "[" << i.convertMarginZero << "]";
                 }
+                if (i.missingIsAcceptable)
+                {
+                    std::cerr << "?";
+                }
                 std::cerr << ", ";
             }
             std::cerr << "\n";
diff --git a/pid/buildjson.cpp b/pid/buildjson.cpp
index 8396338..dd7d2a3 100644
--- a/pid/buildjson.cpp
+++ b/pid/buildjson.cpp
@@ -37,6 +37,7 @@
 void from_json(const json& j, conf::ControllerInfo& c)
 {
     std::vector<std::string> inputNames;
+    std::vector<std::string> missingAcceptableNames;
 
     j.at("type").get_to(c.type);
     j.at("inputs").get_to(inputNames);
@@ -50,7 +51,14 @@
         findTempToMargin->get_to(inputTempToMargin);
     }
 
-    c.inputs = spliceInputs(inputNames, inputTempToMargin);
+    auto findMissingAcceptable = j.find("missingIsAcceptable");
+    if (findMissingAcceptable != j.end())
+    {
+        findMissingAcceptable->get_to(missingAcceptableNames);
+    }
+
+    c.inputs = spliceInputs(inputNames, inputTempToMargin,
+                            missingAcceptableNames);
 
     /* TODO: We need to handle parsing other PID controller configurations.
      * We can do that by checking for different keys and making the decision
diff --git a/pid/fancontroller.cpp b/pid/fancontroller.cpp
index 44852a0..ddfea20 100644
--- a/pid/fancontroller.cpp
+++ b/pid/fancontroller.cpp
@@ -175,7 +175,7 @@
     {
         auto sensor = _owner->getSensor(it);
         auto redundantWrite = _owner->getRedundantWrite();
-        int64_t rawWritten;
+        int64_t rawWritten = -1;
         sensor->write(percent, redundantWrite, &rawWritten);
 
         // The outputCache will be used later,
diff --git a/pid/zone.cpp b/pid/zone.cpp
index 0b46841..e5eddca 100644
--- a/pid/zone.cpp
+++ b/pid/zone.cpp
@@ -96,6 +96,17 @@
     return !_failSafeSensors.empty();
 }
 
+void DbusPidZone::markSensorMissing(const std::string& name)
+{
+    if (_missingAcceptable.find(name) != _missingAcceptable.end())
+    {
+        // Disallow sensors in MissingIsAcceptable list from causing failsafe
+        return;
+    }
+
+    _failSafeSensors.emplace(name);
+}
+
 int64_t DbusPidZone::getZoneID(void) const
 {
     return _zoneId;
@@ -184,14 +195,25 @@
     _cachedFanOutputs[std::string{name}] = values;
 }
 
-void DbusPidZone::addFanInput(const std::string& fan)
+void DbusPidZone::addFanInput(const std::string& fan, bool missingAcceptable)
 {
     _fanInputs.push_back(fan);
+
+    if (missingAcceptable)
+    {
+        _missingAcceptable.emplace(fan);
+    }
 }
 
-void DbusPidZone::addThermalInput(const std::string& therm)
+void DbusPidZone::addThermalInput(const std::string& therm,
+                                  bool missingAcceptable)
 {
     _thermalInputs.push_back(therm);
+
+    if (missingAcceptable)
+    {
+        _missingAcceptable.emplace(therm);
+    }
 }
 
 // Updates desired RPM setpoint from optional text file
@@ -389,21 +411,23 @@
 
 void DbusPidZone::initializeCache(void)
 {
+    auto nan = std::numeric_limits<double>::quiet_NaN();
+
     for (const auto& f : _fanInputs)
     {
-        _cachedValuesByName[f] = {0, 0};
-        _cachedFanOutputs[f] = {0, 0};
+        _cachedValuesByName[f] = {nan, nan};
+        _cachedFanOutputs[f] = {nan, nan};
 
         // Start all fans in fail-safe mode.
-        _failSafeSensors.insert(f);
+        markSensorMissing(f);
     }
 
     for (const auto& t : _thermalInputs)
     {
-        _cachedValuesByName[t] = {0, 0};
+        _cachedValuesByName[t] = {nan, nan};
 
         // Start all sensors in fail-safe mode.
-        _failSafeSensors.insert(t);
+        markSensorMissing(t);
     }
     // Initialize Pid FailSafePercent
     initPidFailSafePercent();
diff --git a/pid/zone.hpp b/pid/zone.hpp
index 2854997..464e672 100644
--- a/pid/zone.hpp
+++ b/pid/zone.hpp
@@ -71,6 +71,7 @@
     bool getRedundantWrite(void) const override;
     void setManualMode(bool mode);
     bool getFailSafeMode(void) const override;
+    void markSensorMissing(const std::string& name);
 
     int64_t getZoneID(void) const override;
     void addSetPoint(double setPoint, const std::string& name) override;
@@ -99,8 +100,8 @@
     double getCachedValue(const std::string& name) override;
     ValueCacheEntry getCachedValues(const std::string& name) override;
 
-    void addFanInput(const std::string& fan);
-    void addThermalInput(const std::string& therm);
+    void addFanInput(const std::string& fan, bool missingAcceptable);
+    void addThermalInput(const std::string& therm, bool missingAcceptable);
 
     void initializeLog(void) override;
     void writeLog(const std::string& value) override;
@@ -166,7 +167,8 @@
             // check if fan fail.
             if (sensor->getFailed())
             {
-                _failSafeSensors.insert(sensorInput);
+                markSensorMissing(sensorInput);
+
                 if (debugEnabled)
                 {
                     std::cerr << sensorInput << " sensor get failed\n";
@@ -174,7 +176,8 @@
             }
             else if (timeout != 0 && duration >= period)
             {
-                _failSafeSensors.insert(sensorInput);
+                markSensorMissing(sensorInput);
+
                 if (debugEnabled)
                 {
                     std::cerr << sensorInput << " sensor timeout\n";
@@ -191,6 +194,7 @@
                         std::cerr << sensorInput
                                   << " is erased from failsafe sensor set\n";
                     }
+
                     _failSafeSensors.erase(kt);
                 }
             }
@@ -213,6 +217,7 @@
     const conf::CycleTime _cycleTime;
 
     std::set<std::string> _failSafeSensors;
+    std::set<std::string> _missingAcceptable;
 
     std::vector<double> _SetPoints;
     std::vector<double> _RPMCeilings;
