diff --git a/CHANGES b/CHANGES
index b191f40dae1597d7c5a9ac10cb279b461f5a60ca..5c254a87913e5e83af69a386e3c161aac4279d98 100644
--- a/CHANGES
+++ b/CHANGES
@@ -12,6 +12,12 @@
 --- Functionality changes from Asterisk 13.23.0 to Asterisk 13.24.0 ----------
 ------------------------------------------------------------------------------
 
+pbx_config
+------------------
+ * pbx_config will now find and process multiple 'globals' sections from
+   extensions.conf.  Variables are processed in the order they are found
+   and duplicate variables overwrite the previous value.
+
 res_pjsip
 ------------------
  * New options 'trust_connected_line' and 'send_connected_line' have been
diff --git a/pbx/pbx_config.c b/pbx/pbx_config.c
index 441a996040a287dba3d411705490e448cb98eb83..6c3b9343566a88767f2def3bd48803e794e086c4 100644
--- a/pbx/pbx_config.c
+++ b/pbx/pbx_config.c
@@ -1688,10 +1688,20 @@ static int pbx_load_config(const char *config_file)
 
 	ast_copy_string(userscontext, ast_variable_retrieve(cfg, "general", "userscontext") ?: "default", sizeof(userscontext));
 
-	for (v = ast_variable_browse(cfg, "globals"); v; v = v->next) {
-		pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
-		pbx_builtin_setvar_helper(NULL, v->name, realvalue);
+	/* ast_variable_browse does not merge multiple [globals] sections */
+	for (cxt = ast_category_browse(cfg, NULL);
+	     cxt;
+	     cxt = ast_category_browse(cfg, cxt)) {
+		if (strcasecmp(cxt, "globals")) {
+			continue;
+		}
+
+		for (v = ast_variable_browse(cfg, cxt); v; v = v->next) {
+			pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
+			pbx_builtin_setvar_helper(NULL, v->name, realvalue);
+		}
 	}
+
 	for (cxt = ast_category_browse(cfg, NULL);
 	     cxt;
 	     cxt = ast_category_browse(cfg, cxt)) {