diff --git a/redfish-core/include/redfish.hpp b/redfish-core/include/redfish.hpp
index 959c643..cc98e1a 100644
--- a/redfish-core/include/redfish.hpp
+++ b/redfish-core/include/redfish.hpp
@@ -75,11 +75,13 @@
         nodes.emplace_back(std::make_unique<ManagerCollection>(app));
         nodes.emplace_back(std::make_unique<Manager>(app));
         nodes.emplace_back(std::make_unique<ManagerResetAction>(app));
+        nodes.emplace_back(std::make_unique<ManagerResetActionInfo>(app));
         nodes.emplace_back(std::make_unique<ManagerResetToDefaultsAction>(app));
         nodes.emplace_back(std::make_unique<Power>(app));
         nodes.emplace_back(std::make_unique<ChassisCollection>(app));
         nodes.emplace_back(std::make_unique<Chassis>(app));
         nodes.emplace_back(std::make_unique<ChassisResetAction>(app));
+        nodes.emplace_back(std::make_unique<ChassisResetActionInfo>(app));
         nodes.emplace_back(std::make_unique<UpdateService>(app));
         nodes.emplace_back(std::make_unique<StorageCollection>(app));
         nodes.emplace_back(std::make_unique<Storage>(app));
@@ -145,6 +147,7 @@
         nodes.emplace_back(std::make_unique<SystemsCollection>(app));
         nodes.emplace_back(std::make_unique<Systems>(app));
         nodes.emplace_back(std::make_unique<SystemActionsReset>(app));
+        nodes.emplace_back(std::make_unique<SystemResetActionInfo>(app));
         nodes.emplace_back(std::make_unique<BiosService>(app));
         nodes.emplace_back(std::make_unique<BiosReset>(app));
 #ifdef BMCWEB_ENABLE_VM_NBDPROXY
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
