diff --git a/main/asterisk.c b/main/asterisk.c
index dd66867b84c356492c7a02288aab8db0af261cb1..bc7ac8bc72f705a45e4ef7db80ff63ccdf68eae4 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -4617,9 +4617,14 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou
 	check_init(init_manager(), "Asterisk Manager Interface");
 	check_init(ast_enum_init(), "ENUM Support");
 	check_init(ast_cc_init(), "Call Completion Supplementary Services");
-	check_init(ast_sounds_index_init(), "Sounds Indexer");
 	check_init(load_modules(0), "Module");
 
+	/*
+	 * This is initialized after the dynamic modules load to avoid repeatedly
+	 * reindexing sounds for every format module load.
+	 */
+	check_init(ast_sounds_index_init(), "Sounds Indexer");
+
 	/*
 	 * This has to load after the dynamic modules load, as items in the media
 	 * cache can't be constructed from items in the AstDB without their
diff --git a/main/sounds_index.c b/main/sounds_index.c
index c7f9f4dd950ec28c577d4e4fb6f74609b2b571dc..c792c1bbd296a9aea80428eea6658e369b56eb41 100644
--- a/main/sounds_index.c
+++ b/main/sounds_index.c
@@ -285,13 +285,15 @@ static void sounds_cleanup(void)
 static void format_update_cb(void *data, struct stasis_subscription *sub,
 	struct stasis_message *message)
 {
-	ast_sounds_reindex();
+	/* Reindexing during shutdown is pointless. */
+	if (!ast_shutting_down()) {
+		ast_sounds_reindex();
+	}
 }
 
 int ast_sounds_index_init(void)
 {
 	int res = 0;
-	sounds_index = NULL;
 	if (ast_sounds_reindex()) {
 		return -1;
 	}
@@ -328,6 +330,5 @@ int ast_sounds_index_init(void)
 
 struct ast_media_index *ast_sounds_get_index(void)
 {
-	ao2_ref(sounds_index, +1);
-	return sounds_index;
+	return ao2_bump(sounds_index);
 }