diff --git a/redfish-core/lib/chassis.hpp b/redfish-core/lib/chassis.hpp
index 4a18028..7a7748a 100644
--- a/redfish-core/lib/chassis.hpp
+++ b/redfish-core/lib/chassis.hpp
@@ -326,7 +326,9 @@
                     asyncResp->res.jsonValue["Actions"]["#Chassis.Reset"] = {
                         {"target", "/redfish/v1/Chassis/" + chassisId +
                                        "/Actions/Chassis.Reset"},
-                        {"ResetType@Redfish.AllowableValues", {"PowerCycle"}}};
+                        {"@Redfish.ActionInfo", "/redfish/v1/Chassis/" +
+                                                    chassisId +
+                                                    "/ResetActionInfo"}};
                     asyncResp->res.jsonValue["PCIeDevices"] = {
                         {"@odata.id",
                          "/redfish/v1/Systems/system/PCIeDevices"}};
@@ -592,4 +594,56 @@
         doChassisPowerCycle(asyncResp);
     }
 };
+
+/**
+ * ChassisResetActionInfo derived class for delivering Chassis
+ * ResetType AllowableValues using ResetInfo schema.
+ */
+class ChassisResetActionInfo : public Node
+{
+  public:
+    /*
+     * Default Constructor
+     */
+    ChassisResetActionInfo(CrowApp& app) :
+        Node(app, "/redfish/v1/Chassis/<str>/ResetActionInfo/", std::string())
+    {
+        entityPrivileges = {
+            {boost::beast::http::verb::get, {{"Login"}}},
+            {boost::beast::http::verb::head, {{"Login"}}},
+            {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
+            {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
+            {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
+            {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
+    }
+
+  private:
+    /**
+     * Functions triggers appropriate requests on DBus
+     */
+    void doGet(crow::Response& res, const crow::Request& req,
+               const std::vector<std::string>& params) override
+    {
+        if (params.size() != 1)
+        {
+            messages::internalError(res);
+            res.end();
+            return;
+        }
+        const std::string& chassisId = params[0];
+
+        res.jsonValue = {{"@odata.type", "#ActionInfo.v1_1_2.ActionInfo"},
+                         {"@odata.id", "/redfish/v1/Chassis/" + chassisId +
+                                           "/ResetActionInfo"},
+                         {"Name", "Reset Action Info"},
+                         {"Id", "ResetActionInfo"},
+                         {"Parameters",
+                          {{{"Name", "ResetType"},
+                            {"Required", true},
+                            {"DataType", "String"},
+                            {"AllowableValues", {"PowerCycle"}}}}}};
+        res.end();
+    }
+};
+
 } // namespace redfish
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 2056d10..bb7165e 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -183,6 +183,49 @@
     }
 };
 
+/**
+ * ManagerResetActionInfo derived class for delivering Manager
+ * ResetType AllowableValues using ResetInfo schema.
+ */
+class ManagerResetActionInfo : public Node
+{
+  public:
+    /*
+     * Default Constructor
+     */
+    ManagerResetActionInfo(CrowApp& app) :
+        Node(app, "/redfish/v1/Managers/bmc/ResetActionInfo/")
+    {
+        entityPrivileges = {
+            {boost::beast::http::verb::get, {{"Login"}}},
+            {boost::beast::http::verb::head, {{"Login"}}},
+            {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
+            {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
+            {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
+            {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
+    }
+
+  private:
+    /**
+     * Functions triggers appropriate requests on DBus
+     */
+    void doGet(crow::Response& res, const crow::Request& req,
+               const std::vector<std::string>& params) override
+    {
+        res.jsonValue = {
+            {"@odata.type", "#ActionInfo.v1_1_2.ActionInfo"},
+            {"@odata.id", "/redfish/v1/Managers/bmc/ResetActionInfo"},
+            {"Name", "Reset Action Info"},
+            {"Id", "ResetActionInfo"},
+            {"Parameters",
+             {{{"Name", "ResetType"},
+               {"Required", true},
+               {"DataType", "String"},
+               {"AllowableValues", {"GracefulRestart"}}}}}};
+        res.end();
+    }
+};
+
 static constexpr const char* objectManagerIface =
     "org.freedesktop.DBus.ObjectManager";
 static constexpr const char* pidConfigurationIface =
@@ -1674,7 +1717,8 @@
             res.jsonValue["Actions"]["#Manager.Reset"];
         managerReset["target"] =
             "/redfish/v1/Managers/bmc/Actions/Manager.Reset";
-        managerReset["ResetType@Redfish.AllowableValues"] = {"GracefulRestart"};
+        managerReset["@Redfish.ActionInfo"] =
+            "/redfish/v1/Managers/bmc/ResetActionInfo";
 
         // ResetToDefaults (Factory Reset) has values like
         // PreserveNetworkAndUsers and PreserveNetwork that aren't supported
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index 422b2f7..50e2b93 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -1906,9 +1906,8 @@
         res.jsonValue["Actions"]["#ComputerSystem.Reset"] = {
             {"target",
              "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"},
-            {"ResetType@Redfish.AllowableValues",
-             {"On", "ForceOff", "ForceOn", "ForceRestart", "GracefulRestart",
-              "GracefulShutdown", "PowerCycle", "Nmi"}}};
+            {"@Redfish.ActionInfo",
+             "/redfish/v1/Systems/system/ResetActionInfo"}};
 
         res.jsonValue["LogServices"] = {
             {"@odata.id", "/redfish/v1/Systems/system/LogServices"}};
@@ -2038,4 +2037,49 @@
         }
     }
 };
+
+/**
+ * SystemResetActionInfo derived class for delivering Computer Systems
+ * ResetType AllowableValues using ResetInfo schema.
+ */
+class SystemResetActionInfo : public Node
+{
+  public:
+    /*
+     * Default Constructor
+     */
+    SystemResetActionInfo(CrowApp& app) :
+        Node(app, "/redfish/v1/Systems/system/ResetActionInfo/")
+    {
+        entityPrivileges = {
+            {boost::beast::http::verb::get, {{"Login"}}},
+            {boost::beast::http::verb::head, {{"Login"}}},
+            {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
+            {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
+            {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
+            {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
+    }
+
+  private:
+    /**
+     * Functions triggers appropriate requests on DBus
+     */
+    void doGet(crow::Response& res, const crow::Request& req,
+               const std::vector<std::string>& params) override
+    {
+        res.jsonValue = {
+            {"@odata.type", "#ActionInfo.v1_1_2.ActionInfo"},
+            {"@odata.id", "/redfish/v1/Systems/system/ResetActionInfo"},
+            {"Name", "Reset Action Info"},
+            {"Id", "ResetActionInfo"},
+            {"Parameters",
+             {{{"Name", "ResetType"},
+               {"Required", true},
+               {"DataType", "String"},
+               {"AllowableValues",
+                {"On", "ForceOff", "ForceOn", "ForceRestart", "GracefulRestart",
+                 "GracefulShutdown", "PowerCycle", "Nmi"}}}}}};
+        res.end();
+    }
+};
 } // namespace redfish
