diff --git a/monitor/fan.cpp b/monitor/fan.cpp
index 9d2593f..b1aa233 100644
--- a/monitor/fan.cpp
+++ b/monitor/fan.cpp
@@ -40,34 +40,36 @@
     _numSensorFailsForNonFunc(std::get<numSensorFailsForNonfuncField>(def)),
     _trustManager(trust)
 {
+    // Setup tach sensors for monitoring
+    auto& sensors = std::get<sensorListField>(def);
+    for (auto& s : sensors)
+    {
+        try
+        {
+            _sensors.emplace_back(
+                    std::make_unique<TachSensor>(
+                            mode,
+                            bus,
+                            *this,
+                            std::get<sensorNameField>(s),
+                            std::get<hasTargetField>(s),
+                            std::get<timeoutField>(def),
+                            events));
+
+            _trustManager->registerSensor(_sensors.back());
+        }
+        catch (InvalidSensorError& e)
+        {
+
+        }
+    }
+
     //Start from a known state of functional
     updateInventory(true);
 
-    // Setup tach sensors for monitoring when in monitor mode
+    // Check current tach state when entering monitor mode
     if (mode != Mode::init)
     {
-        auto& sensors = std::get<sensorListField>(def);
-        for (auto& s : sensors)
-        {
-            try
-            {
-                _sensors.emplace_back(
-                        std::make_unique<TachSensor>(
-                                bus,
-                                *this,
-                                std::get<sensorNameField>(s),
-                                std::get<hasTargetField>(s),
-                                std::get<timeoutField>(def),
-                                events));
-
-                _trustManager->registerSensor(_sensors.back());
-            }
-            catch (InvalidSensorError& e)
-            {
-
-            }
-        }
-
         //The TachSensors will now have already read the input
         //and target values, so check them.
         tachChanged();
diff --git a/monitor/fan.hpp b/monitor/fan.hpp
index bd8179f..0b0c047 100644
--- a/monitor/fan.hpp
+++ b/monitor/fan.hpp
@@ -16,17 +16,6 @@
 {
 
 /**
- * The mode fan monitor will run in:
- *   - init - only do the initialization steps
- *   - monitor - run normal monitoring algorithm
- */
-enum class Mode
-{
-    init,
-    monitor
-};
-
-/**
  * @class InvalidSensorError
  *
  * An exception type for sensors that don't exist or
diff --git a/monitor/tach_sensor.cpp b/monitor/tach_sensor.cpp
index 2aa1609..22875a2 100644
--- a/monitor/tach_sensor.cpp
+++ b/monitor/tach_sensor.cpp
@@ -64,7 +64,8 @@
 }
 
 
-TachSensor::TachSensor(sdbusplus::bus::bus& bus,
+TachSensor::TachSensor(Mode mode,
+                       sdbusplus::bus::bus& bus,
                        Fan& fan,
                        const std::string& id,
                        bool hasTarget,
@@ -81,48 +82,50 @@
     // Start from a known state of functional
     setFunctional(true);
 
-    // Load in starting Target and Input values
-    try
+    // Load in current Target and Input values when entering monitor mode
+    if (mode != Mode::init)
     {
-        // Use getProperty directly to allow a missing sensor object
-        // to abort construction.
-        _tachInput = util::SDBusPlus::getProperty<decltype(_tachInput)>(
+        try
+        {
+            // Use getProperty directly to allow a missing sensor object
+            // to abort construction.
+            _tachInput = util::SDBusPlus::getProperty<decltype(_tachInput)>(
+                    _bus,
+                    _name,
+                    FAN_SENSOR_VALUE_INTF,
+                    FAN_VALUE_PROPERTY);
+        }
+        catch (std::exception& e)
+        {
+            throw InvalidSensorError();
+        }
+
+        if (_hasTarget)
+        {
+            readProperty(FAN_SENSOR_CONTROL_INTF,
+                         FAN_TARGET_PROPERTY,
+                         _name,
+                         _bus,
+                         _tachTarget);
+        }
+
+        auto match = getMatchString(FAN_SENSOR_VALUE_INTF);
+
+        tachSignal = std::make_unique<sdbusplus::server::match::match>(
                 _bus,
-                _name,
-                FAN_SENSOR_VALUE_INTF,
-                FAN_VALUE_PROPERTY);
+                match.c_str(),
+                [this](auto& msg){ this->handleTachChange(msg); });
+
+        if (_hasTarget)
+        {
+            match = getMatchString(FAN_SENSOR_CONTROL_INTF);
+
+            targetSignal = std::make_unique<sdbusplus::server::match::match>(
+                    _bus,
+                    match.c_str(),
+                    [this](auto& msg){ this->handleTargetChange(msg); });
+        }
     }
-    catch (std::exception& e)
-    {
-        throw InvalidSensorError();
-    }
-
-    if (_hasTarget)
-    {
-        readProperty(FAN_SENSOR_CONTROL_INTF,
-                     FAN_TARGET_PROPERTY,
-                     _name,
-                     _bus,
-                     _tachTarget);
-    }
-
-    auto match = getMatchString(FAN_SENSOR_VALUE_INTF);
-
-    tachSignal = std::make_unique<sdbusplus::server::match::match>(
-                     _bus,
-                     match.c_str(),
-                     [this](auto& msg){ this->handleTachChange(msg); });
-
-    if (_hasTarget)
-    {
-        match = getMatchString(FAN_SENSOR_CONTROL_INTF);
-
-        targetSignal = std::make_unique<sdbusplus::server::match::match>(
-                           _bus,
-                           match.c_str(),
-                           [this](auto& msg){ this->handleTargetChange(msg); });
-    }
-
 }
 
 std::string TachSensor::getMatchString(const std::string& interface)
diff --git a/monitor/tach_sensor.hpp b/monitor/tach_sensor.hpp
index 4e57ef5..dd89bbf 100644
--- a/monitor/tach_sensor.hpp
+++ b/monitor/tach_sensor.hpp
@@ -18,6 +18,17 @@
 constexpr auto FAN_SENSOR_PATH = "/xyz/openbmc_project/sensors/fan_tach/";
 
 /**
+ * The mode fan monitor will run in:
+ *   - init - only do the initialization steps
+ *   - monitor - run normal monitoring algorithm
+ */
+enum class Mode
+{
+    init,
+    monitor
+};
+
+/**
  * @class TachSensor
  *
  * This class represents the sensor that reads a tach value.
@@ -45,6 +56,7 @@
         /**
          * @brief Constructor
          *
+         * @param[in] mode - mode of fan monitor
          * @param[in] bus - the dbus object
          * @param[in] fan - the parent fan object
          * @param[in] id - the id of the sensor
@@ -53,7 +65,8 @@
          * @param[in] timeout - Normal timeout value to use
          * @param[in] events - sd_event pointer
          */
-        TachSensor(sdbusplus::bus::bus& bus,
+        TachSensor(Mode mode,
+                   sdbusplus::bus::bus& bus,
                    Fan& fan,
                    const std::string& id,
                    bool hasTarget,
