diff --git a/control/fanctl.cpp b/control/fanctl.cpp
index 34677f1..909ea0e 100644
--- a/control/fanctl.cpp
+++ b/control/fanctl.cpp
@@ -19,8 +19,11 @@
 #include "sdbusplus.hpp"
 
 #include <CLI/CLI.hpp>
+#include <nlohmann/json.hpp>
 #include <sdbusplus/bus.hpp>
 
+#include <chrono>
+#include <filesystem>
 #include <iomanip>
 #include <iostream>
 
@@ -30,6 +33,7 @@
 constexpr auto systemdPath = "/org/freedesktop/systemd1";
 constexpr auto systemdService = "org.freedesktop.systemd1";
 constexpr auto phosphorServiceName = "phosphor-fan-control@0.service";
+constexpr auto dumpFile = "/tmp/fan_control_dump.json";
 
 enum
 {
@@ -39,6 +43,13 @@
     METHOD = 3
 };
 
+struct DumpQuery
+{
+    std::string section;
+    std::string name;
+    std::vector<std::string> properties;
+};
+
 /**
  * @function extracts fan name from dbus path string (last token where
  * delimiter is the / character), with proper bounds checking.
@@ -531,8 +542,7 @@
     {
         SDBusPlus::callMethod(systemdService, systemdPath, systemdMgrIface,
                               "KillUnit", phosphorServiceName, "main", SIGUSR1);
-        std::cout << "Fan control dump written to: /tmp/fan_control_dump.json"
-                  << std::endl;
+        std::cout << "Fan control dump written to: " << dumpFile << std::endl;
     }
     catch (const phosphor::fan::util::DBusPropertyError& e)
     {
@@ -541,9 +551,79 @@
 }
 
 /**
+ * @function Query items in the dump file
+ */
+void queryDumpFile(const DumpQuery& dq)
+{
+    nlohmann::json output;
+    std::ifstream file{dumpFile};
+
+    if (!file.good())
+    {
+        std::cerr << "Unable to open dump file, please run 'fanctl dump'.\n";
+        return;
+    }
+
+    auto dumpData = nlohmann::json::parse(file);
+
+    if (!dumpData.contains(dq.section))
+    {
+        std::cerr << "Error: Dump file does not contain " << dq.section
+                  << " section"
+                  << "\n";
+        return;
+    }
+
+    const auto& section = dumpData.at(dq.section);
+
+    for (const auto& [key1, values1] : section.items())
+    {
+        if (dq.name.empty() || (key1.find(dq.name) != std::string::npos))
+        {
+            // If no properties specified, print the whole JSON value
+            if (dq.properties.empty())
+            {
+                output[key1] = values1;
+                continue;
+            }
+
+            // Look for properties both one and two levels down.
+            // Future improvement: Use recursion.
+            for (const auto& [key2, values2] : values1.items())
+            {
+                for (const auto& prop : dq.properties)
+                {
+                    if (prop == key2)
+                    {
+                        output[key1][prop] = values2;
+                    }
+                }
+
+                for (const auto& [key3, values3] : values2.items())
+                {
+                    for (const auto& prop : dq.properties)
+                    {
+                        if (prop == key3)
+                        {
+                            output[key1][prop] = values3;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if (!output.empty())
+    {
+        std::cout << std::setw(4) << output << "\n";
+    }
+}
+
+/**
  * @function setup the CLI object to accept all options
  */
-void initCLI(CLI::App& app, uint64_t& target, std::vector<std::string>& fanList)
+void initCLI(CLI::App& app, uint64_t& target, std::vector<std::string>& fanList,
+             DumpQuery& dq)
 {
     app.set_help_flag("-h,--help", "Print this help page and exit.");
 
@@ -598,6 +678,20 @@
     cmdDump->set_help_flag("-h, --help",
                            "Dump the FlightRecorder diagnostic log");
     cmdDump->require_option(0);
+
+#ifdef CONTROL_USE_JSON
+    auto cmdDumpQuery =
+        commands->add_subcommand("query_dump", "Query the dump file");
+
+    cmdDumpQuery->set_help_flag("-h, --help", "Query the dump file");
+    cmdDumpQuery
+        ->add_option("-s, --section", dq.section, "Dump file section name")
+        ->required();
+    cmdDumpQuery->add_option("-n, --name", dq.name,
+                             "Optional dump file entry name (or substring)");
+    cmdDumpQuery->add_option("-p, --properties", dq.properties,
+                             "Optional list of dump file property names");
+#endif
 }
 
 /**
@@ -608,6 +702,7 @@
     auto rc = 0;
     uint64_t target{0U};
     std::vector<std::string> fanList;
+    DumpQuery dq;
 
     try
     {
@@ -617,7 +712,7 @@
                      "https://github.com/openbmc/phosphor-fan-presence/tree/"
                      "master/docs/control/fanctl"};
 
-        initCLI(app, target, fanList);
+        initCLI(app, target, fanList, dq);
 
         CLI11_PARSE(app, argc, argv);
 
@@ -645,6 +740,12 @@
         {
             dumpFanControl();
         }
+#ifdef CONTROL_USE_JSON
+        else if (app.got_subcommand("query_dump"))
+        {
+            queryDumpFile(dq);
+        }
+#endif
     }
     catch (const std::exception& e)
     {
