diff --git a/control/json/utils/modifier.cpp b/control/json/utils/modifier.cpp
new file mode 100644
index 0000000..6d00bc1
--- /dev/null
+++ b/control/json/utils/modifier.cpp
@@ -0,0 +1,173 @@
+/**
+ * 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 "modifier.hpp"
+
+#include "json/manager.hpp"
+
+#include <fmt/format.h>
+
+#include <phosphor-logging/log.hpp>
+
+using namespace phosphor::logging;
+
+namespace phosphor::fan::control::json
+{
+
+/**
+ * @brief Variant visitor to return a value of the template type specified.
+ */
+template <typename T>
+struct ToTypeVisitor
+{
+    template <typename U>
+    T operator()(const U& t) const
+    {
+        if constexpr (std::is_arithmetic_v<U> && std::is_arithmetic_v<T>)
+        {
+            return static_cast<T>(t);
+        }
+        throw std::invalid_argument(
+            "Non arithmetic type used in ToTypeVisitor");
+    }
+};
+
+/**
+ * @brief Implements the minus operator to subtract two values.
+ *
+ * With strings values, A - B removes all occurrences of B in A.
+ * Throws if the type is a bool.
+ */
+struct MinusOperator : public Modifier::BaseOperator
+{
+    PropertyVariantType operator()(double val) override
+    {
+        return val - std::visit(ToTypeVisitor<double>(), arg);
+    }
+
+    PropertyVariantType operator()(int32_t val) override
+    {
+        return val - std::visit(ToTypeVisitor<int32_t>(), arg);
+    }
+
+    PropertyVariantType operator()(int64_t val) override
+    {
+        return val - std::visit(ToTypeVisitor<int64_t>(), arg);
+    }
+
+    PropertyVariantType operator()(const std::string& val) override
+    {
+        // Remove all occurrences of arg from val.
+        auto value = val;
+        auto toRemove = std::get<std::string>(arg);
+        size_t pos;
+        while ((pos = value.find(toRemove)) != std::string::npos)
+        {
+            value.erase(pos, toRemove.size());
+        }
+
+        return value;
+    }
+
+    PropertyVariantType operator()(bool val) override
+    {
+        throw std::runtime_error{
+            "Bool not allowed as a 'minus' modifier value"};
+    }
+
+    MinusOperator(PropertyVariantType& arg) : arg(arg)
+    {}
+
+    PropertyVariantType arg;
+};
+
+Modifier::Modifier(const json& jsonObj)
+{
+    setValue(jsonObj);
+    setOperator(jsonObj);
+}
+
+void Modifier::setValue(const json& jsonObj)
+{
+    if (!jsonObj.contains("value"))
+    {
+        log<level::ERR>(
+            fmt::format("Modifier entry in JSON missing 'value': {}",
+                        jsonObj.dump())
+                .c_str());
+        throw std::invalid_argument("Invalid modifier JSON");
+    }
+
+    const auto& object = jsonObj.at("value");
+    if (auto boolPtr = object.get_ptr<const bool*>())
+    {
+        _value = *boolPtr;
+    }
+    else if (auto intPtr = object.get_ptr<const int64_t*>())
+    {
+        _value = *intPtr;
+    }
+    else if (auto doublePtr = object.get_ptr<const double*>())
+    {
+        _value = *doublePtr;
+    }
+    else if (auto stringPtr = object.get_ptr<const std::string*>())
+    {
+        _value = *stringPtr;
+    }
+    else
+    {
+        log<level::ERR>(
+            fmt::format(
+                "Invalid JSON type for value property in modifer json: {}",
+                jsonObj.dump())
+                .c_str());
+        throw std::invalid_argument("Invalid modifier JSON");
+    }
+}
+
+void Modifier::setOperator(const json& jsonObj)
+{
+    if (!jsonObj.contains("operator"))
+    {
+        log<level::ERR>(
+            fmt::format("Modifier entry in JSON missing 'operator': {}",
+                        jsonObj.dump())
+                .c_str());
+        throw std::invalid_argument("Invalid modifier JSON");
+    }
+
+    auto op = jsonObj["operator"].get<std::string>();
+
+    if (op == "minus")
+    {
+        _operator = std::make_unique<MinusOperator>(_value);
+    }
+    else
+    {
+        log<level::ERR>(fmt::format("Invalid operator in the modifier JSON: {}",
+                                    jsonObj.dump())
+                            .c_str());
+        throw std::invalid_argument("Invalid operator in the modifier JSON");
+    }
+}
+
+PropertyVariantType Modifier::doOp(const PropertyVariantType& val)
+{
+    return std::visit(*_operator, val);
+}
+
+} // namespace phosphor::fan::control::json
diff --git a/control/json/utils/modifier.hpp b/control/json/utils/modifier.hpp
new file mode 100644
index 0000000..3f59246
--- /dev/null
+++ b/control/json/utils/modifier.hpp
@@ -0,0 +1,120 @@
+/**
+ * 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 "config_base.hpp"
+
+#include <string>
+#include <vector>
+
+namespace phosphor::fan::control::json
+{
+
+using json = nlohmann::json;
+
+/**
+ * @class Modifier
+ *
+ * This class provides a doOp() function to modify a PropertyVariantType value
+ * based on a JSON config passed into its constructor.
+ *
+ * For example, with the JSON:
+ * {
+ *   "operator": "minus",
+ *   "value": 3
+ * }
+ *
+ * When doOp() is called, it will subtract 3 from the value passed
+ * into doOp() and return the result.
+ *
+ * The valid operators are:
+ *  - "minus"
+ *
+ * To add a new operator, derive a new class from BaseOperator and
+ * then create it accordingly in setOperator.
+ */
+class Modifier
+{
+  public:
+    /**
+     * @brief Base class for operators
+     */
+    struct BaseOperator
+    {
+        virtual PropertyVariantType operator()(double val) = 0;
+
+        virtual PropertyVariantType operator()(int32_t val) = 0;
+
+        virtual PropertyVariantType operator()(int64_t val) = 0;
+
+        virtual PropertyVariantType operator()(const std::string& val) = 0;
+
+        virtual PropertyVariantType operator()(bool val) = 0;
+    };
+
+    Modifier() = delete;
+    ~Modifier() = default;
+    Modifier(const Modifier&) = delete;
+    Modifier& operator=(const Modifier&) = delete;
+    Modifier(Modifier&&) = delete;
+    Modifier& operator=(Modifier&&) = delete;
+
+    /**
+     * @brief Constructor
+     *
+     * @param[in] jsonObj - The JSON config object
+     */
+    Modifier(const json& jsonObj);
+
+    /**
+     * @brief Performs the operation
+     *
+     * @param[in] value - The variant to do the operation on
+     *
+     * @return PropertyVariantType - The result
+     */
+    PropertyVariantType doOp(const PropertyVariantType& value);
+
+  private:
+    /**
+     * @brief Parse and set the value
+     *
+     * @param[in] jsonObj - The JSON config object
+     */
+    void setValue(const json& jsonObj);
+
+    /**
+     * @brief Parse and set the operator
+     *
+     * @param[in] jsonObj - The JSON config object
+     */
+    void setOperator(const json& jsonObj);
+
+    /**
+     * @brief Subtracts _value from value
+     *
+     * @param[in] value - The value to subtract from
+     */
+    PropertyVariantType minus(const PropertyVariantType& value);
+
+    /** @brief The value used by the operator */
+    PropertyVariantType _value;
+
+    /** @brief The operator that will be used */
+    std::unique_ptr<BaseOperator> _operator;
+};
+
+} // namespace phosphor::fan::control::json
