diff --git a/mainloop.cpp b/mainloop.cpp
index be9b680..595432d 100644
--- a/mainloop.cpp
+++ b/mainloop.cpp
@@ -17,7 +17,6 @@
 #include <iostream>
 #include <memory>
 #include <cstdlib>
-#include <cstring>
 #include <string>
 #include <unordered_set>
 #include <sstream>
@@ -79,137 +78,6 @@
 // Store the valueAdjust for sensors
 std::map<SensorSet::key_type, valueAdjust> sensorAdjusts;
 
-void addRemoveRCs(const SensorSet::key_type& sensor,
-                  const std::string& rcList)
-{
-    if (rcList.empty())
-    {
-        return;
-    }
-
-    // Convert to a char* for strtok
-    std::vector<char> rmRCs(rcList.c_str(),
-                            rcList.c_str() + rcList.size() + 1);
-    auto rmRC = std::strtok(&rmRCs[0], ", ");
-    while (rmRC != nullptr)
-    {
-        try
-        {
-            sensorAdjusts[sensor].rmRCs.insert(std::stoi(rmRC));
-        }
-        catch (const std::logic_error& le)
-        {
-            // Unable to convert to int, continue to next token
-            std::string name = sensor.first + "_" + sensor.second;
-            log<level::INFO>("Unable to convert sensor removal return code",
-                             entry("SENSOR=%s", name.c_str()),
-                             entry("RC=%s", rmRC),
-                             entry("EXCEPTION=%s", le.what()));
-        }
-        rmRC = std::strtok(nullptr, ", ");
-    }
-}
-
-int64_t adjustValue(const SensorSet::key_type& sensor, int64_t value)
-{
-// Because read doesn't have an out pointer to store errors.
-// let's assume negative values are errors if they have this
-// set.
-#ifdef NEGATIVE_ERRNO_ON_FAIL
-    if (value < 0)
-    {
-        return value;
-    }
-#endif
-
-    const auto& it = sensorAdjusts.find(sensor);
-    if (it != sensorAdjusts.end())
-    {
-        // Adjust based on gain and offset
-        value = static_cast<decltype(value)>(
-                    static_cast<double>(value) * it->second.gain
-                        + it->second.offset);
-    }
-    return value;
-}
-
-auto addValue(const SensorSet::key_type& sensor,
-              const RetryIO& retryIO,
-              hwmonio::HwmonIO& ioAccess,
-              ObjectInfo& info)
-{
-    static constexpr bool deferSignals = true;
-
-    // Get the initial value for the value interface.
-    auto& bus = *std::get<sdbusplus::bus::bus*>(info);
-    auto& obj = std::get<Object>(info);
-    auto& objPath = std::get<std::string>(info);
-
-    auto senRmRCs = env::getEnv("REMOVERCS", sensor);
-    // Add sensor removal return codes defined per sensor
-    addRemoveRCs(sensor, senRmRCs);
-
-    auto gain = env::getEnv("GAIN", sensor);
-    if (!gain.empty())
-    {
-        sensorAdjusts[sensor].gain = std::stod(gain);
-    }
-
-    auto offset = env::getEnv("OFFSET", sensor);
-    if (!offset.empty())
-    {
-        sensorAdjusts[sensor].offset = std::stoi(offset);
-    }
-
-    int64_t val = 0;
-    std::shared_ptr<StatusObject> statusIface = nullptr;
-    auto it = obj.find(InterfaceType::STATUS);
-    if (it != obj.end())
-    {
-        statusIface = std::experimental::any_cast<
-                std::shared_ptr<StatusObject>>(it->second);
-    }
-
-    // If there's no fault file or the sensor has a fault file and
-    // its status is functional, read the input value.
-    if (!statusIface || (statusIface && statusIface->functional()))
-    {
-        // Retry for up to a second if device is busy
-        // or has a transient error.
-        val = ioAccess.read(
-                sensor.first,
-                sensor.second,
-                hwmon::entry::cinput,
-                std::get<size_t>(retryIO),
-                std::get<std::chrono::milliseconds>(retryIO));
-        val = adjustValue(sensor, val);
-    }
-
-    auto iface = std::make_shared<ValueObject>(bus, objPath.c_str(), deferSignals);
-    iface->value(val);
-
-    hwmon::Attributes attrs;
-    if (hwmon::getAttributes(sensor.first, attrs))
-    {
-        iface->unit(hwmon::getUnit(attrs));
-        iface->scale(hwmon::getScale(attrs));
-    }
-
-    auto maxValue = env::getEnv("MAXVALUE", sensor);
-    if(!maxValue.empty())
-    {
-        iface->maxValue(std::stoll(maxValue));
-    }
-    auto minValue = env::getEnv("MINVALUE", sensor);
-    if(!minValue.empty())
-    {
-        iface->minValue(std::stoll(minValue));
-    }
-
-    obj[InterfaceType::VALUE] = iface;
-    return iface;
-}
-
 std::string MainLoop::getID(SensorSet::container_t::const_reference sensor)
 {
     std::string id;
@@ -295,7 +163,7 @@
     // Get list of return codes for removing sensors on device
     auto devRmRCs = env::getEnv("REMOVERCS");
     // Add sensor removal return codes defined at the device level
-    addRemoveRCs(sensor.first, devRmRCs);
+    sensorObj->addRemoveRCs(devRmRCs);
 
     std::string objectPath{_root};
     objectPath.append(1, '/');
@@ -317,7 +185,7 @@
     {
         // Add status interface based on _fault file being present
         sensorObj->addStatus(info);
-        valueInterface = addValue(sensor.first, retryIO, ioAccess, info);
+        valueInterface = sensorObj->addValue(retryIO, info);
     }
     catch (const std::system_error& e)
     {
@@ -566,7 +434,7 @@
                         hwmonio::retries,
                         hwmonio::delay);
 
-                value = adjustValue(i.first, value);
+                value = sensorObjects[i.first]->adjustValue(value);
 
                 for (auto& iface : obj)
                 {
