diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index 09b2155..2f3c8ab 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -974,32 +974,19 @@
 {
     std::string dumpTypeLowerCopy =
         std::string(boost::algorithm::to_lower_copy(dumpType));
-    std::string interface = "xyz.openbmc_project.Dump.Entry." + dumpType;
-    const std::array<const std::string_view, 1> interfaces{interface};
 
-    dbus::utility::getSubTreePaths(
-        "/xyz/openbmc_project/dump/" + dumpTypeLowerCopy, 0, interfaces,
-        [asyncResp, dumpType](
-            const boost::system::error_code& ec,
-            const dbus::utility::MapperGetSubTreePathsResponse& subTreePaths) {
+    crow::connections::systemBus->async_method_call(
+        [asyncResp](const boost::system::error_code& ec) {
         if (ec)
         {
-            BMCWEB_LOG_ERROR << "resp_handler got error " << ec;
+            BMCWEB_LOG_ERROR << "clearDump resp_handler got error " << ec;
             messages::internalError(asyncResp->res);
             return;
         }
-
-        for (const std::string& path : subTreePaths)
-        {
-            sdbusplus::message::object_path objPath(path);
-            std::string logID = objPath.filename();
-            if (logID.empty())
-            {
-                continue;
-            }
-            deleteDumpEntry(asyncResp, logID, dumpType);
-        }
-        });
+        },
+        "xyz.openbmc_project.Dump.Manager",
+        "/xyz/openbmc_project/dump/" + dumpTypeLowerCopy,
+        "xyz.openbmc_project.Collection.DeleteAll", "DeleteAll");
 }
 
 inline static void
@@ -2632,8 +2619,6 @@
         redfishDateTimeOffset.second;
 
     asyncResp->res.jsonValue["Entries"]["@odata.id"] = dumpPath + "/Entries";
-    asyncResp->res.jsonValue["Actions"]["#LogService.ClearLog"]["target"] =
-        dumpPath + "/Actions/LogService.ClearLog";
 
     if (collectDiagnosticDataSupported)
     {
@@ -2641,6 +2626,37 @@
                                 ["target"] =
             dumpPath + "/Actions/LogService.CollectDiagnosticData";
     }
+
+    constexpr std::array<std::string_view, 1> interfaces = {deleteAllInterface};
+    dbus::utility::getSubTreePaths(
+        "/xyz/openbmc_project/dump", 0, interfaces,
+        [asyncResp, dumpType, dumpPath](
+            const boost::system::error_code& ec,
+            const dbus::utility::MapperGetSubTreePathsResponse& subTreePaths) {
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "getDumpServiceInfo respHandler got error "
+                             << ec;
+            // Assume that getting an error simply means there are no dump
+            // LogServices. Return without adding any error response.
+            return;
+        }
+
+        const std::string dbusDumpPath =
+            "/xyz/openbmc_project/dump/" +
+            boost::algorithm::to_lower_copy(dumpType);
+
+        for (const std::string& path : subTreePaths)
+        {
+            if (path == dbusDumpPath)
+            {
+                asyncResp->res
+                    .jsonValue["Actions"]["#LogService.ClearLog"]["target"] =
+                    dumpPath + "/Actions/LogService.ClearLog";
+                break;
+            }
+        }
+        });
 }
 
 inline void handleLogServicesDumpServiceGet(
diff --git a/test/redfish-core/lib/log_services_dump_test.cpp b/test/redfish-core/lib/log_services_dump_test.cpp
index 5258309..2a6333b 100644
--- a/test/redfish-core/lib/log_services_dump_test.cpp
+++ b/test/redfish-core/lib/log_services_dump_test.cpp
@@ -14,97 +14,6 @@
 namespace
 {
 
-void assertLogServicesDumpServiceGet(crow::Response& res)
-{
-    nlohmann::json& json = res.jsonValue;
-    EXPECT_EQ(json["@odata.type"], "#LogService.v1_2_0.LogService");
-    EXPECT_EQ(json["Name"], "Dump LogService");
-}
-
-void assertLogServicesBMCDumpServiceGet(crow::Response& res)
-{
-    assertLogServicesDumpServiceGet(res);
-
-    nlohmann::json& json = res.jsonValue;
-    EXPECT_EQ(json["@odata.id"], "/redfish/v1/Managers/bmc/LogServices/Dump");
-    EXPECT_EQ(
-        json["Actions"]["#LogService.ClearLog"]["target"],
-        "/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.ClearLog");
-    EXPECT_EQ(
-        json["Actions"]["#LogService.CollectDiagnosticData"]["target"],
-        "/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.CollectDiagnosticData");
-    EXPECT_EQ(json["Description"], "BMC Dump LogService");
-    EXPECT_EQ(json["Entries"]["@odata.id"],
-              "/redfish/v1/Managers/bmc/LogServices/Dump/Entries");
-    EXPECT_EQ(json["Id"], "Dump");
-    EXPECT_EQ(json["OverWritePolicy"], "WrapsWhenFull");
-}
-
-void assertLogServicesFaultLogDumpServiceGet(crow::Response& res)
-{
-    assertLogServicesDumpServiceGet(res);
-
-    nlohmann::json& json = res.jsonValue;
-    EXPECT_EQ(json["@odata.id"],
-              "/redfish/v1/Managers/bmc/LogServices/FaultLog");
-    EXPECT_EQ(
-        json["Actions"]["#LogService.ClearLog"]["target"],
-        "/redfish/v1/Managers/bmc/LogServices/FaultLog/Actions/LogService.ClearLog");
-    EXPECT_EQ(json["Actions"]["#LogService.CollectDiagnosticData"]["target"],
-              nlohmann::detail::value_t::null);
-    EXPECT_EQ(json["Description"], "FaultLog Dump LogService");
-    EXPECT_EQ(json["Entries"]["@odata.id"],
-              "/redfish/v1/Managers/bmc/LogServices/FaultLog/Entries");
-    EXPECT_EQ(json["Id"], "FaultLog");
-    EXPECT_EQ(json["OverWritePolicy"], "Unknown");
-}
-
-void assertLogServicesSystemDumpServiceGet(crow::Response& res)
-{
-    assertLogServicesDumpServiceGet(res);
-
-    nlohmann::json& json = res.jsonValue;
-    EXPECT_EQ(json["@odata.id"], "/redfish/v1/Systems/system/LogServices/Dump");
-    EXPECT_EQ(
-        json["Actions"]["#LogService.ClearLog"]["target"],
-        "/redfish/v1/Systems/system/LogServices/Dump/Actions/LogService.ClearLog");
-    EXPECT_EQ(
-        json["Actions"]["#LogService.CollectDiagnosticData"]["target"],
-        "/redfish/v1/Systems/system/LogServices/Dump/Actions/LogService.CollectDiagnosticData");
-    EXPECT_EQ(json["Description"], "System Dump LogService");
-    EXPECT_EQ(json["Entries"]["@odata.id"],
-              "/redfish/v1/Systems/system/LogServices/Dump/Entries");
-    EXPECT_EQ(json["Id"], "Dump");
-    EXPECT_EQ(json["OverWritePolicy"], "WrapsWhenFull");
-}
-
-TEST(LogServicesDumpServiceTest,
-     LogServicesBMCDumpServiceStaticAttributesAreExpected)
-{
-    auto shareAsyncResp = std::make_shared<bmcweb::AsyncResp>();
-    shareAsyncResp->res.setCompleteRequestHandler(
-        assertLogServicesBMCDumpServiceGet);
-    getDumpServiceInfo(shareAsyncResp, "BMC");
-}
-
-TEST(LogServicesDumpServiceTest,
-     LogServicesFaultLogDumpServiceStaticAttributesAreExpected)
-{
-    auto shareAsyncResp = std::make_shared<bmcweb::AsyncResp>();
-    shareAsyncResp->res.setCompleteRequestHandler(
-        assertLogServicesFaultLogDumpServiceGet);
-    getDumpServiceInfo(shareAsyncResp, "FaultLog");
-}
-
-TEST(LogServicesDumpServiceTest,
-     LogServicesSystemDumpServiceStaticAttributesAreExpected)
-{
-    auto shareAsyncResp = std::make_shared<bmcweb::AsyncResp>();
-    shareAsyncResp->res.setCompleteRequestHandler(
-        assertLogServicesSystemDumpServiceGet);
-    getDumpServiceInfo(shareAsyncResp, "System");
-}
-
 TEST(LogServicesDumpServiceTest, LogServicesInvalidDumpServiceGetReturnsError)
 {
     auto shareAsyncResp = std::make_shared<bmcweb::AsyncResp>();
