diff --git a/virtualSensor.cpp b/virtualSensor.cpp
index 5e4ca5f..063fb0f 100644
--- a/virtualSensor.cpp
+++ b/virtualSensor.cpp
@@ -188,7 +188,8 @@
     return severity;
 }
 
-void parseThresholds(Json& thresholds, const PropertyMap& propertyMap)
+void parseThresholds(Json& thresholds, const PropertyMap& propertyMap,
+                     const std::string& entityInterface = "")
 {
     std::string direction;
 
@@ -210,6 +211,11 @@
     {
         thresholds[threshold + "Hysteresis"] = hysteresis;
     }
+
+    if (!entityInterface.empty())
+    {
+        thresholds[threshold + "Direction"] = entityInterface;
+    }
 }
 
 void VirtualSensor::parseConfigInterface(const PropertyMap& propertyMap,
@@ -415,7 +421,7 @@
          * eg xyz.openbmc_project.Configuration.ModifiedMedian.Thresholds1 */
         if (interface.find(vsThresholdsIntf) != std::string::npos)
         {
-            parseThresholds(thresholds, propertyMap);
+            parseThresholds(thresholds, propertyMap, interface);
         }
         else if (interface == calculationIface)
         {
@@ -568,6 +574,34 @@
             threshold.value("CriticalHighHysteresis", defaultHysteresis));
         criticalIface->setLowHysteresis(
             threshold.value("CriticalLowHysteresis", defaultHysteresis));
+
+        if (threshold.contains("CriticalHigh"))
+        {
+            criticalIface->setEntityInterfaceHigh(
+                threshold.value("CriticalHighDirection", ""));
+            if (DEBUG)
+            {
+                debug("Sensor Threshold:{NAME} = intf:{INTF}", "NAME", objPath,
+                      "INTF", threshold.value("CriticalHighDirection", ""));
+            }
+        }
+        if (threshold.contains("CriticalLow"))
+        {
+            criticalIface->setEntityInterfaceLow(
+                threshold.value("CriticalLowDirection", ""));
+            if (DEBUG)
+            {
+                debug("Sensor Threshold:{NAME} = intf:{INTF}", "NAME", objPath,
+                      "INTF", threshold.value("CriticalLowDirection", ""));
+            }
+        }
+
+        criticalIface->setEntityPath(entityPath);
+        if (DEBUG)
+        {
+            debug("Sensor Threshold:{NAME} = path:{PATH}", "NAME", objPath,
+                  "PATH", entityPath);
+        }
     }
 
     if (threshold.contains("WarningHigh") || threshold.contains("WarningLow"))
@@ -583,6 +617,34 @@
             threshold.value("WarningHighHysteresis", defaultHysteresis));
         warningIface->setLowHysteresis(
             threshold.value("WarningLowHysteresis", defaultHysteresis));
+
+        if (threshold.contains("WarningHigh"))
+        {
+            warningIface->setEntityInterfaceHigh(
+                threshold.value("WarningHighDirection", ""));
+            if (DEBUG)
+            {
+                debug("Sensor Threshold:{NAME} = intf:{INTF}", "NAME", objPath,
+                      "INTF", threshold.value("WarningHighDirection", ""));
+            }
+        }
+        if (threshold.contains("WarningLow"))
+        {
+            warningIface->setEntityInterfaceLow(
+                threshold.value("WarningLowDirection", ""));
+            if (DEBUG)
+            {
+                debug("Sensor Threshold:{NAME} = intf:{INTF}", "NAME", objPath,
+                      "INTF", threshold.value("WarningLowDirection", ""));
+            }
+        }
+
+        warningIface->setEntityPath(entityPath);
+        if (DEBUG)
+        {
+            debug("Sensor Threshold:{NAME} = path:{PATH}", "NAME", objPath,
+                  "PATH", entityPath);
+        }
     }
 
     if (threshold.contains("HardShutdownHigh") ||
