diff --git a/virtualSensor.cpp b/virtualSensor.cpp
index be9d78a..4e9f50a 100644
--- a/virtualSensor.cpp
+++ b/virtualSensor.cpp
@@ -16,7 +16,8 @@
 static constexpr auto entityManagerBusName =
     "xyz.openbmc_project.EntityManager";
 static constexpr auto vsThresholdsIfaceSuffix = ".Thresholds";
-static constexpr std::array<const char*, 0> calculationIfaces = {};
+static constexpr std::array<const char*, 1> calculationIfaces = {
+    "xyz.openbmc_project.Configuration.ModifiedMedian"};
 
 using namespace phosphor::logging;
 
@@ -384,12 +385,31 @@
     ValueIface::value(value);
 }
 
-double VirtualSensor::calculateValue()
+double VirtualSensor::calculateValue(const std::string& calculation,
+                                     const VirtualSensor::ParamMap& paramMap)
 {
-    // Placeholder until calculation types are added
+    auto itr = std::find(calculationIfaces.begin(), calculationIfaces.end(),
+                         calculation);
+    if (itr == calculationIfaces.end())
+    {
+        return std::numeric_limits<double>::quiet_NaN();
+    }
+    else if (calculation == "xyz.openbmc_project.Configuration.ModifiedMedian")
+    {
+        return calculateModifiedMedianValue(paramMap);
+    }
     return std::numeric_limits<double>::quiet_NaN();
 }
 
+bool VirtualSensor::sensorInRange(double value)
+{
+    if (value <= this->maxValidInput && value >= this->minValidInput)
+    {
+        return true;
+    }
+    return false;
+}
+
 void VirtualSensor::updateVirtualSensor()
 {
     for (auto& param : paramMap)
@@ -408,8 +428,9 @@
     }
     auto itr =
         std::find(calculationIfaces.begin(), calculationIfaces.end(), exprStr);
-    auto val = (itr == calculationIfaces.end()) ? expression.value()
-                                                : calculateValue();
+    auto val = (itr == calculationIfaces.end())
+                   ? expression.value()
+                   : calculateValue(exprStr, paramMap);
 
     /* Set sensor value to dbus interface */
     setSensorValue(val);
@@ -427,6 +448,47 @@
     checkThresholds(val, hardShutdownIface);
 }
 
+double VirtualSensor::calculateModifiedMedianValue(
+    const VirtualSensor::ParamMap& paramMap)
+{
+    std::vector<double> values;
+
+    for (auto& param : paramMap)
+    {
+        auto& name = param.first;
+        if (auto var = symbols.get_variable(name))
+        {
+            if (!sensorInRange(var->ref()))
+            {
+                continue;
+            }
+            values.push_back(var->ref());
+        }
+    }
+
+    size_t size = values.size();
+    std::sort(values.begin(), values.end());
+    switch (size)
+    {
+        case 2:
+            /* Choose biggest value */
+            return values.at(1);
+        case 0:
+            return std::numeric_limits<double>::quiet_NaN();
+        default:
+            /* Choose median value */
+            if (size % 2 == 0)
+            {
+                // Average of the two middle values
+                return (values.at(size / 2) + values.at(size / 2 - 1)) / 2;
+            }
+            else
+            {
+                return values.at((size - 1) / 2);
+            }
+    }
+}
+
 void VirtualSensor::createThresholds(const Json& threshold,
                                      const std::string& objPath)
 {
