diff --git a/crow/include/crow/http_connection.h b/crow/include/crow/http_connection.h
index 2c6a28d..b480d3e 100644
--- a/crow/include/crow/http_connection.h
+++ b/crow/include/crow/http_connection.h
@@ -64,11 +64,16 @@
     const static std::regex r{"(&quot;@odata\\.((id)|(Context))&quot;[ \\n]*:[ "
                               "\\n]*)(&quot;((?!&quot;).*)&quot;)"};
     s = std::regex_replace(s, r, "$1<a href=\"$6\">$5</a>");
+
+    const static std::regex nextLink{
+        "(&quot;Members@odata\\.((nextLink))&quot;[ \\n]*:[ "
+        "\\n]*)(&quot;((?!&quot;).*)&quot;)"};
+    s = std::regex_replace(s, nextLink, "$1<a href=\"$5\">$4</a>");
 }
 
 inline void prettyPrintJson(crow::Response& res)
 {
-    std::string value = res.jsonValue.dump(4);
+    std::string value = res.jsonValue.dump(4, ' ', true);
     escapeHtml(value);
     convertToLinks(value);
     res.body() = "<html>\n"
@@ -443,7 +448,7 @@
             else
             {
                 res.jsonMode();
-                res.body() = res.jsonValue.dump(2);
+                res.body() = res.jsonValue.dump(2, ' ', true);
             }
         }
 
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index 562bbfc..85ef1b0 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -238,6 +238,58 @@
                const std::vector<std::string> &params) override
     {
         std::shared_ptr<AsyncResp> asyncResp = std::make_shared<AsyncResp>(res);
+        static constexpr const long maxEntriesPerPage = 1000;
+        long skip = 0;
+        long top = maxEntriesPerPage; // Show max entries by default
+        char *skipParam = req.urlParams.get("$skip");
+        if (skipParam != nullptr)
+        {
+            char *ptr = nullptr;
+            skip = std::strtol(skipParam, &ptr, 10);
+            if (*skipParam == '\0' || *ptr != '\0')
+            {
+                messages::addMessageToErrorJson(
+                    asyncResp->res.jsonValue,
+                    messages::queryParameterValueTypeError(
+                        std::string(skipParam), "$skip"));
+                asyncResp->res.result(boost::beast::http::status::bad_request);
+                return;
+            }
+            if (skip < 0)
+            {
+                messages::addMessageToErrorJson(
+                    asyncResp->res.jsonValue,
+                    messages::queryParameterOutOfRange(
+                        std::to_string(skip), "$skip", "greater than 0"));
+                asyncResp->res.result(boost::beast::http::status::bad_request);
+                return;
+            }
+        }
+        char *topParam = req.urlParams.get("$top");
+        if (topParam != nullptr)
+        {
+            char *ptr = nullptr;
+            top = std::strtol(topParam, &ptr, 10);
+            if (*topParam == '\0' || *ptr != '\0')
+            {
+                messages::addMessageToErrorJson(
+                    asyncResp->res.jsonValue,
+                    messages::queryParameterValueTypeError(
+                        std::string(topParam), "$top"));
+                asyncResp->res.result(boost::beast::http::status::bad_request);
+                return;
+            }
+            if (top < 1 || top > maxEntriesPerPage)
+            {
+                messages::addMessageToErrorJson(
+                    asyncResp->res.jsonValue,
+                    messages::queryParameterOutOfRange(
+                        std::to_string(top), "$top",
+                        "1-" + std::to_string(maxEntriesPerPage)));
+                asyncResp->res.result(boost::beast::http::status::bad_request);
+                return;
+            }
+        }
         // Collections don't include the static data added by SubRoute because
         // it has a duplicate entry for members
         asyncResp->res.jsonValue["@odata.type"] =
@@ -268,8 +320,17 @@
         journalTmp = nullptr;
         uint64_t prevTs = 0;
         int index = 0;
+        uint64_t entryCount = 0;
         SD_JOURNAL_FOREACH(journal.get())
         {
+            entryCount++;
+            // Handle paging using skip (number of entries to skip from the
+            // start) and top (number of entries to display)
+            if (entryCount <= skip || entryCount > skip + top)
+            {
+                continue;
+            }
+
             // Get the entry timestamp
             uint64_t curTs = 0;
             ret = sd_journal_get_realtime_usec(journal.get(), &curTs);
@@ -305,7 +366,13 @@
                 return;
             }
         }
-        asyncResp->res.jsonValue["Members@odata.count"] = logEntryArray.size();
+        asyncResp->res.jsonValue["Members@odata.count"] = entryCount;
+        if (skip + top < entryCount)
+        {
+            asyncResp->res.jsonValue["Members@odata.nextLink"] =
+                "/redfish/v1/Managers/bmc/LogServices/BmcLog/Entries?$skip=" +
+                std::to_string(skip + top);
+        }
     }
 };
 
