diff --git a/phosphor-regulators/src/manager.cpp b/phosphor-regulators/src/manager.cpp
index e81d7f1..1bdc9ab 100644
--- a/phosphor-regulators/src/manager.cpp
+++ b/phosphor-regulators/src/manager.cpp
@@ -29,6 +29,7 @@
 #include <exception>
 #include <functional>
 #include <map>
+#include <thread>
 #include <tuple>
 #include <utility>
 #include <variant>
@@ -43,6 +44,7 @@
 constexpr auto compatibleIntf =
     "xyz.openbmc_project.Configuration.IBMCompatibleSystem";
 constexpr auto compatibleNamesProp = "Names";
+constexpr std::chrono::minutes maxTimeToWaitForCompatTypes{5};
 
 /**
  * Default configuration file name.  This is used when the system does not
@@ -95,8 +97,11 @@
     // Clear any cached data or error history related to hardware devices
     clearHardwareData();
 
-    // Verify System object exists; this means config file has been loaded
-    if (system)
+    // Wait until the config file has been loaded or hit max wait time
+    waitUntilConfigFileLoaded();
+
+    // Verify config file has been loaded and System object is valid
+    if (isConfigFileLoaded())
     {
         // Configure the regulator devices in the system
         system->configure(services);
@@ -107,20 +112,13 @@
         services.getJournal().logError("Unable to configure regulator devices: "
                                        "Configuration file not loaded");
 
-        // TODO: Add code to wait for EntityManager to publish the compatible
-        // interface before logging this error.
-
         // Log critical error since regulators could not be configured.  Could
         // cause hardware damage if default regulator settings are very wrong.
-        /*
         services.getErrorLogging().logConfigFileError(Entry::Level::Critical,
                                                       services.getJournal());
-        */
 
         // Throw InternalFailure to propogate error status to D-Bus client
-        /*
         throw sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure{};
-        */
     }
 }
 
@@ -191,8 +189,8 @@
             timers.clear();
         */
 
-        // Verify System object exists; this means config file has been loaded
-        if (system)
+        // Verify config file has been loaded and System object is valid
+        if (isConfigFileLoaded())
         {
             // Close the regulator devices in the system.  Monitoring is
             // normally disabled because the system is being powered off.  The
@@ -222,8 +220,8 @@
     services.getPresenceService().clearCache();
     services.getVPD().clearCache();
 
-    // Verify System object exists; this means config file has been loaded
-    if (system)
+    // Verify config file has been loaded and System object is valid
+    if (isConfigFileLoaded())
     {
         // Clear any cached hardware data in the System object
         system->clearCache();
@@ -350,4 +348,33 @@
     }
 }
 
+void Manager::waitUntilConfigFileLoaded()
+{
+    // If config file not loaded and list of compatible system types is empty
+    if (!isConfigFileLoaded() && compatibleSystemTypes.empty())
+    {
+        // Loop until compatible system types found or waited max amount of time
+        auto start = std::chrono::system_clock::now();
+        std::chrono::system_clock::duration timeWaited{0};
+        while (compatibleSystemTypes.empty() &&
+               (timeWaited <= maxTimeToWaitForCompatTypes))
+        {
+            // Try to find list of compatible system types
+            findCompatibleSystemTypes();
+            if (!compatibleSystemTypes.empty())
+            {
+                // Compatible system types found; try to load config file
+                loadConfigFile();
+            }
+            else
+            {
+                // Sleep 5 seconds
+                using namespace std::chrono_literals;
+                std::this_thread::sleep_for(5s);
+            }
+            timeWaited = std::chrono::system_clock::now() - start;
+        }
+    }
+}
+
 } // namespace phosphor::power::regulators
diff --git a/phosphor-regulators/src/manager.hpp b/phosphor-regulators/src/manager.hpp
index f1aa0d9..e2ec5a7 100644
--- a/phosphor-regulators/src/manager.hpp
+++ b/phosphor-regulators/src/manager.hpp
@@ -131,6 +131,17 @@
     std::filesystem::path findConfigFile();
 
     /**
+     * Returns whether the JSON configuration file has been loaded.
+     *
+     * @return true if config file loaded, false otherwise
+     */
+    bool isConfigFileLoaded() const
+    {
+        // If System object exists, the config file has been loaded
+        return (system != nullptr);
+    }
+
+    /**
      * Loads the JSON configuration file.
      *
      * Looks for the config file using findConfigFile().
@@ -142,6 +153,16 @@
     void loadConfigFile();
 
     /**
+     * Waits until the JSON configuration file has been loaded.
+     *
+     * If the config file has not yet been loaded, waits until one of the
+     * following occurs:
+     * - config file is loaded
+     * - maximum amount of time to wait has elapsed
+     */
+    void waitUntilConfigFileLoaded();
+
+    /**
      * The D-Bus bus
      */
     sdbusplus::bus::bus& bus;
diff --git a/phosphor-regulators/src/regsctl/utility.hpp b/phosphor-regulators/src/regsctl/utility.hpp
index 5e46dd8..b1a1418 100644
--- a/phosphor-regulators/src/regsctl/utility.hpp
+++ b/phosphor-regulators/src/regsctl/utility.hpp
@@ -1,6 +1,9 @@
 #pragma once
 
 #include <sdbusplus/bus.hpp>
+#include <sdbusplus/sdbus.hpp>
+
+#include <chrono>
 
 namespace phosphor::power::regulators::control
 {
@@ -24,7 +27,10 @@
         bus.new_method_call(busName, objPath, interface, method.c_str());
     reqMsg.append(std::forward<Args>(args)...);
 
-    return bus.call(reqMsg);
+    // Set timeout to 6 minutes; some regulator methods take over 5 minutes
+    using namespace std::chrono_literals;
+    sdbusplus::SdBusDuration timeout{6min};
+    return bus.call(reqMsg, timeout);
 }
 
 } // namespace phosphor::power::regulators::control
