diff --git a/virtualSensor.cpp b/virtualSensor.cpp
index cbf3891..083178f 100644
--- a/virtualSensor.cpp
+++ b/virtualSensor.cpp
@@ -386,6 +386,22 @@
         printParams(paramMap);
 }
 
+void VirtualSensor::createAssociation(const std::string& objPath,
+                                      const std::string& entityPath)
+{
+    if (objPath.empty() || entityPath.empty())
+    {
+        return;
+    }
+
+    std::filesystem::path p(entityPath);
+    auto assocsDbus =
+        AssociationList{{"chassis", "all_sensors", p.parent_path().string()}};
+    associationIface =
+        std::make_unique<AssociationObject>(bus, objPath.c_str());
+    associationIface->associations(assocsDbus);
+}
+
 void VirtualSensor::initVirtualSensor(const InterfaceMap& interfaceMap,
                                       const std::string& objPath,
                                       const std::string& sensorType,
@@ -414,6 +430,7 @@
     symbols.add_package(vecopsPackage);
     expression.register_symbol_table(symbols);
 
+    createAssociation(objPath, entityPath);
     /* Print all parameters for debug purpose only */
     if (DEBUG)
     {
@@ -800,7 +817,7 @@
 
             auto virtualSensorPtr = std::make_unique<VirtualSensor>(
                 bus, virtObjPath.c_str(), interfaceMap, name, sensorType,
-                calculationIface);
+                calculationIface, objpath);
             info("Added a new virtual sensor: {NAME} {TYPE}", "NAME", name,
                  "TYPE", sensorType);
             virtualSensorPtr->updateVirtualSensor();
diff --git a/virtualSensor.hpp b/virtualSensor.hpp
index 8a9b115..286bca3 100644
--- a/virtualSensor.hpp
+++ b/virtualSensor.hpp
@@ -108,13 +108,15 @@
      * @param[in] name         - Virtual sensor name
      * @param[in] type         - Virtual sensor type/unit
      * @param[in] calcType     - Calculation used to calculate sensor value
+     * @param[in] entityPath   - Virtual sensor path in entityManager Dbus
      *
      */
     VirtualSensor(sdbusplus::bus_t& bus, const char* objPath,
                   const InterfaceMap& ifacemap, const std::string& name,
-                  const std::string& type, const std::string& calculationType) :
+                  const std::string& type, const std::string& calculationType,
+                  const std::string& entityPath) :
         ValueObject(bus, objPath, action::defer_emit),
-        bus(bus), name(name)
+        bus(bus), name(name), entityPath(entityPath)
     {
         initVirtualSensor(ifacemap, objPath, type, calculationType);
     }
@@ -136,6 +138,11 @@
     sdbusplus::bus_t& bus;
     /** @brief name of sensor */
     std::string name;
+
+    /** @brief Virtual sensor path in entityManager Dbus.
+     * This value is used to set thresholds/create association
+     */
+    std::string entityPath;
     /** @brief Expression string for virtual sensor value calculations */
     std::string exprStr;
     /** @brief symbol table from exprtk */
@@ -243,6 +250,10 @@
             threshold->alarmLow(!alarmLow);
         }
     }
+
+    /** @brief Create Association from entityPath*/
+    void createAssociation(const std::string& objPath,
+                           const std::string& entityPath);
 };
 
 class VirtualSensors
