diff --git a/redfish-core/include/schemas.hpp b/redfish-core/include/schemas.hpp
new file mode 100644
index 0000000..1b76abd
--- /dev/null
+++ b/redfish-core/include/schemas.hpp
@@ -0,0 +1,80 @@
+#pragma once
+/****************************************************************
+ *                 READ THIS WARNING FIRST
+ * This is an auto-generated header which contains definitions
+ * for Redfish DMTF defined schemas.
+ * DO NOT modify this registry outside of running the
+ * update_schemas.py script.  The definitions contained within
+ * this file are owned by DMTF.  Any modifications to these files
+ * should be first pushed to the relevant registry in the DMTF
+ * github organization.
+ ***************************************************************/
+// clang-format off
+
+namespace redfish
+{
+    constexpr std::array schemas {
+        "AccountService",
+        "ActionInfo",
+        "Assembly",
+        "AttributeRegistry",
+        "Bios",
+        "Cable",
+        "Certificate",
+        "CertificateLocations",
+        "CertificateService",
+        "Chassis",
+        "ComputerSystem",
+        "Drive",
+        "EthernetInterface",
+        "Event",
+        "EventDestination",
+        "EventService",
+        "IPAddresses",
+        "JsonSchemaFile",
+        "LogEntry",
+        "LogService",
+        "Manager",
+        "ManagerAccount",
+        "ManagerDiagnosticData",
+        "ManagerNetworkProtocol",
+        "Memory",
+        "Message",
+        "MessageRegistry",
+        "MessageRegistryFile",
+        "MetricDefinition",
+        "MetricReport",
+        "MetricReportDefinition",
+        "odata",
+        "OperatingConfig",
+        "PCIeDevice",
+        "PCIeFunction",
+        "PCIeSlots",
+        "PhysicalContext",
+        "Power",
+        "Privileges",
+        "Processor",
+        "redfish-error",
+        "redfish-payload-annotations",
+        "redfish-schema",
+        "Redundancy",
+        "Resource",
+        "Role",
+        "Sensor",
+        "ServiceRoot",
+        "Session",
+        "SessionService",
+        "Settings",
+        "SoftwareInventory",
+        "Storage",
+        "StorageController",
+        "Task",
+        "TaskService",
+        "TelemetryService",
+        "Thermal",
+        "Triggers",
+        "UpdateService",
+        "VirtualMedia",
+        "VLanNetworkInterface",
+    };
+}
diff --git a/redfish-core/lib/redfish_v1.hpp b/redfish-core/lib/redfish_v1.hpp
index 956e2d5..9f7935d 100644
--- a/redfish-core/lib/redfish_v1.hpp
+++ b/redfish-core/lib/redfish_v1.hpp
@@ -1,8 +1,12 @@
 #pragma once
 
+#include "error_messages.hpp"
+#include "utility.hpp"
+
 #include <app.hpp>
 #include <http_request.hpp>
 #include <http_response.hpp>
+#include <schemas.hpp>
 
 #include <string>
 
@@ -42,6 +46,81 @@
     messages::resourceNotFound(asyncResp->res, "", nameStr);
 }
 
+inline void
+    jsonSchemaIndexGet(App& app, const crow::Request& req,
+                       const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
+{
+    if (!redfish::setUpRedfishRoute(app, req, asyncResp))
+    {
+        return;
+    }
+    nlohmann::json& json = asyncResp->res.jsonValue;
+    json["@odata.id"] = "/redfish/v1/JsonSchemas";
+    json["@odata.context"] =
+        "/redfish/v1/$metadata#JsonSchemaFileCollection.JsonSchemaFileCollection";
+    json["@odata.type"] = "#JsonSchemaFileCollection.JsonSchemaFileCollection";
+    json["Name"] = "JsonSchemaFile Collection";
+    json["Description"] = "Collection of JsonSchemaFiles";
+    nlohmann::json::array_t members;
+    for (const std::string_view schema : schemas)
+    {
+        nlohmann::json::object_t member;
+        member["@odata.id"] = crow::utility::urlFromPieces(
+            "redfish", "v1", "JsonSchemas", schema);
+        members.push_back(std::move(member));
+    }
+    json["Members"] = std::move(members);
+    json["Members@odata.count"] = schemas.size();
+}
+
+inline void jsonSchemaGet(App& app, const crow::Request& req,
+                          const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+                          const std::string& schema)
+{
+    if (!redfish::setUpRedfishRoute(app, req, asyncResp))
+    {
+        return;
+    }
+
+    if (std::find(schemas.begin(), schemas.end(), schema) == schemas.end())
+    {
+        messages::resourceNotFound(asyncResp->res,
+                                   "JsonSchemaFile.JsonSchemaFile", schema);
+        return;
+    }
+
+    nlohmann::json& json = asyncResp->res.jsonValue;
+    json["@odata.context"] =
+        "/redfish/v1/$metadata#JsonSchemaFile.JsonSchemaFile";
+    json["@odata.id"] =
+        crow::utility::urlFromPieces("redfish", "v1", "JsonSchemas", schema);
+    json["@odata.type"] = "#JsonSchemaFile.v1_0_2.JsonSchemaFile";
+    json["Name"] = schema + " Schema File";
+    json["Description"] = schema + " Schema File Location";
+    json["Id"] = schema;
+    std::string schemaName = "#";
+    schemaName += schema;
+    schemaName += ".";
+    schemaName += schema;
+    json["Schema"] = std::move(schemaName);
+    constexpr std::array<std::string_view, 1> languages{"en"};
+    json["Languages"] = languages;
+    json["Languages@odata.count"] = languages.size();
+
+    nlohmann::json::array_t locationArray;
+    nlohmann::json::object_t locationEntry;
+    locationEntry["Language"] = "en";
+    locationEntry["PublicationUri"] =
+        "http://redfish.dmtf.org/schemas/v1/" + schema + ".json";
+    locationEntry["Uri"] = crow::utility::urlFromPieces(
+        "redfish", "v1", "JsonSchemas", schema, std::string(schema) + ".json");
+
+    locationArray.emplace_back(locationEntry);
+
+    json["Location"] = std::move(locationArray);
+    json["Location@odata.count"] = 1;
+}
+
 inline void requestRoutesRedfish(App& app)
 {
     BMCWEB_ROUTE(app, "/redfish/")
@@ -50,6 +129,14 @@
 
     BMCWEB_ROUTE(app, "/redfish/<path>")
     (std::bind_front(redfish404, std::ref(app)));
+
+    BMCWEB_ROUTE(app, "/redfish/v1/JsonSchemas/<str>/")
+        .methods(boost::beast::http::verb::get)(
+            std::bind_front(jsonSchemaGet, std::ref(app)));
+
+    BMCWEB_ROUTE(app, "/redfish/v1/JsonSchemas/")
+        .methods(boost::beast::http::verb::get)(
+            std::bind_front(jsonSchemaIndexGet, std::ref(app)));
 }
 
 } // namespace redfish
