diff --git a/main/asterisk.c b/main/asterisk.c
index 082935d22b95369f08dc17ae5f3db8012ee9ab12..aa9d1f6b778e5f27b65021441581e3a42536acc6 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -4671,11 +4671,11 @@ int main(int argc, char *argv[])
 		sig_alert_pipe[0] = sig_alert_pipe[1] = -1;
 	}
 
+	ast_process_pending_reloads();
+
 	ast_set_flag(&ast_options, AST_OPT_FLAG_FULLY_BOOTED);
 	publish_fully_booted();
 
-	ast_process_pending_reloads();
-
 	pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
 
 #if defined(__AST_DEBUG_MALLOC)
diff --git a/main/loader.c b/main/loader.c
index 3a596bcf4c45f49383832ffeb14ea626e6aed389..814bb976893b6b2f175b577654a01e77ae794bb8 100644
--- a/main/loader.c
+++ b/main/loader.c
@@ -115,6 +115,11 @@ static unsigned int embedding = 1; /* we always start out by registering embedde
 				      since they are here before we dlopen() any
 				   */
 
+/*!
+ * \brief Internal flag to indicate all modules have been initially loaded.
+ */
+static int modules_loaded;
+
 struct ast_module {
 	const struct ast_module_info *info;
 #ifdef REF_DEBUG
@@ -767,9 +772,7 @@ void ast_process_pending_reloads(void)
 {
 	struct reload_queue_item *item;
 
-	if (!ast_fully_booted) {
-		return;
-	}
+	modules_loaded = 1;
 
 	AST_LIST_LOCK(&reload_queue);
 
@@ -879,7 +882,7 @@ enum ast_module_reload_result ast_module_reload(const char *name)
 
 	/* If we aren't fully booted, we just pretend we reloaded but we queue this
 	   up to run once we are booted up. */
-	if (!ast_fully_booted) {
+	if (!modules_loaded) {
 		queue_reload_request(name);
 		res = AST_MODULE_RELOAD_QUEUED;
 		goto module_reload_exit;