diff --git a/main/asterisk.c b/main/asterisk.c
index 3eaaf183d479c43d378689561c414c2899a1c95b..baf5ded4fed4488eb967d08d0a1bc06c076f3498 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -4670,11 +4670,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 5df306c916849f639b9191bb22c2ed909769c25d..eac38422cbfd0f7a7fd3aac3ed2163475b9181ea 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;