diff --git a/addons/res_config_mysql.c b/addons/res_config_mysql.c
index f2ef949fc0cc07f89be0f637cb8f62844da1d36d..b080d118b8612a8030c28587b5019a1939d45f04 100644
--- a/addons/res_config_mysql.c
+++ b/addons/res_config_mysql.c
@@ -523,9 +523,8 @@ static struct ast_config *realtime_multi_mysql(const char *database, const char
 
 		while ((row = mysql_fetch_row(result))) {
 			var = NULL;
-			cat = ast_category_new("", "", -1);
+			cat = ast_category_new_anonymous();
 			if (!cat) {
-				ast_log(LOG_WARNING, "Out of memory!\n");
 				continue;
 			}
 			for (i = 0; i < numFields; i++) {
@@ -934,8 +933,8 @@ static struct ast_config *config_mysql(const char *database, const char *table,
 			}
 
 			if (strcmp(last, row[0]) || last_cat_metric != atoi(row[3])) {
-				if (!(cur_cat = ast_category_new(row[0], "", -1))) {
-					ast_log(LOG_WARNING, "Out of memory!\n");
+				cur_cat = ast_category_new_dynamic(row[0]);
+				if (!cur_cat) {
 					break;
 				}
 				strcpy(last, row[0]);
diff --git a/include/asterisk/config.h b/include/asterisk/config.h
index 4944a3af2022bff802fec9fe7b432cdf3275b84e..f57966b0babe7e9c26b212810b94e82f1f9779f7 100644
--- a/include/asterisk/config.h
+++ b/include/asterisk/config.h
@@ -833,6 +833,18 @@ const char *ast_config_option(struct ast_config *cfg, const char *cat, const cha
  */
 struct ast_category *ast_category_new(const char *name, const char *in_file, int lineno);
 
+/*!
+ * \brief Create a category that is not backed by a file
+ *
+ * \param name name of new category
+ */
+#define ast_category_new_dynamic(name) ast_category_new(name, "", -1)
+
+/*!
+ * \brief Create a nameless category that is not backed by a file
+ */
+#define ast_category_new_anonymous() ast_category_new_dynamic("")
+
 /*!
  * \brief Create a category making it a template
  *
diff --git a/res/res_config_curl.c b/res/res_config_curl.c
index 9ad7a6e3db7bddec8218cbd097f3adbabcfb2f64..06a6aef89e94fae852464188f71f70c2c12c5f77 100644
--- a/res/res_config_curl.c
+++ b/res/res_config_curl.c
@@ -182,7 +182,8 @@ static struct ast_config *realtime_multi_curl(const char *url, const char *unuse
 			continue;
 		}
 
-		if (!(cat = ast_category_new("", "", 99999))) {
+		cat = ast_category_new_anonymous();
+		if (!cat) {
 			continue;
 		}
 
@@ -569,8 +570,10 @@ static struct ast_config *config_curl(const char *url, const char *unused, const
 		}
 
 		if (!cat || strcmp(category, cur_cat) || last_cat_metric != cat_metric) {
-			if (!(cat = ast_category_new(category, "", 99999)))
+			cat = ast_category_new_dynamic(category);
+			if (!cat) {
 				break;
+			}
 			cur_cat = category;
 			last_cat_metric = cat_metric;
 			ast_category_append(cfg, cat);
diff --git a/res/res_config_ldap.c b/res/res_config_ldap.c
index 5e95853d462def6eef468ed05c77b857e16dc960..7bbac0ce0f31d3e969528b5c4f0286773032b587 100644
--- a/res/res_config_ldap.c
+++ b/res/res_config_ldap.c
@@ -1043,10 +1043,8 @@ static struct ast_config *realtime_multi_ldap(const char *basedn,
 			struct ast_variable **p = vars;
 
 			while (*p) {
-				struct ast_category *cat = NULL;
-				cat = ast_category_new("", table_name, -1);
+				struct ast_category *cat = ast_category_new_anonymous();
 				if (!cat) {
-					ast_log(LOG_ERROR, "Unable to create a new category!\n");
 					break;
 				} else {
 					struct ast_variable *var = *p;
@@ -1195,7 +1193,7 @@ static struct ast_config *config_ldap(const char *basedn, const char *table_name
 		if (!last_category || strcmp(last_category, categories[i].name) ||
 			last_category_metric != categories[i].metric) {
 
-			cur_cat = ast_category_new(categories[i].name, table_name, -1);
+			cur_cat = ast_category_new_dynamic(categories[i].name);
 			if (!cur_cat) {
 				break;
 			}
diff --git a/res/res_config_odbc.c b/res/res_config_odbc.c
index 5a25b6b5a0bf34c036fa0fe9d205c8cb584b493f..114708325eef16f12e0a8a2a0020596a94542768 100644
--- a/res/res_config_odbc.c
+++ b/res/res_config_odbc.c
@@ -407,9 +407,8 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
 			ast_log(LOG_WARNING, "SQL Fetch error! [%s]\n", ast_str_buffer(sql));
 			continue;
 		}
-		cat = ast_category_new("","",99999);
+		cat = ast_category_new_anonymous();
 		if (!cat) {
-			ast_log(LOG_WARNING, "Out of memory!\n");
 			continue;
 		}
 		for (x=0;x<colcount;x++) {
@@ -1016,9 +1015,8 @@ static struct ast_config *config_odbc(const char *database, const char *table, c
 			continue;
 		} 
 		if (strcmp(last, q.category) || last_cat_metric != q.cat_metric) {
-			cur_cat = ast_category_new(q.category, "", 99999);
+			cur_cat = ast_category_new_dynamic(q.category);
 			if (!cur_cat) {
-				ast_log(LOG_WARNING, "Out of memory!\n");
 				break;
 			}
 			strcpy(last, q.category);
diff --git a/res/res_config_pgsql.c b/res/res_config_pgsql.c
index f0859617dea216c1b578c1f5d75f887fea36198a..b5f24b0f4da3ccbec16be764356a88359b0fa465 100644
--- a/res/res_config_pgsql.c
+++ b/res/res_config_pgsql.c
@@ -648,8 +648,10 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
 
 		for (rowIndex = 0; rowIndex < num_rows; rowIndex++) {
 			var = NULL;
-			if (!(cat = ast_category_new("","",99999)))
+			cat = ast_category_new_anonymous();
+			if (!cat) {
 				continue;
+			}
 			for (i = 0; i < numFields; i++) {
 				stringp = PQgetvalue(result, rowIndex, i);
 				while (stringp) {
@@ -1129,9 +1131,10 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
 			}
 
 			if (strcmp(last, field_category) || last_cat_metric != atoi(field_cat_metric)) {
-				cur_cat = ast_category_new(field_category, "", 99999);
-				if (!cur_cat)
+				cur_cat = ast_category_new_dynamic(field_category);
+				if (!cur_cat) {
 					break;
+				}
 				ast_copy_string(last, field_category, sizeof(last));
 				last_cat_metric = atoi(field_cat_metric);
 				ast_category_append(cfg, cur_cat);
diff --git a/res/res_config_sqlite.c b/res/res_config_sqlite.c
index 68594978736be45c13c9af46e1c706d8061ea5b7..96a10b43f952cc554e9c7ecdb9cfa60c41b07384 100644
--- a/res/res_config_sqlite.c
+++ b/res/res_config_sqlite.c
@@ -874,10 +874,8 @@ static int add_cfg_entry(void *arg, int argc, char **argv, char **columnNames)
 	}
 
 	if (!args->cat_name || strcmp(args->cat_name, argv[RES_CONFIG_SQLITE_CONFIG_CATEGORY])) {
-		args->cat = ast_category_new(argv[RES_CONFIG_SQLITE_CONFIG_CATEGORY], "", 99999);
-
+		args->cat = ast_category_new_dynamic(argv[RES_CONFIG_SQLITE_CONFIG_CATEGORY]);
 		if (!args->cat) {
-			ast_log(LOG_WARNING, "Unable to allocate category\n");
 			return 1;
 		}
 
@@ -1086,8 +1084,8 @@ static int add_rt_multi_cfg_entry(void *arg, int argc, char **argv, char **colum
 		return 1;
 	}
 
-	if (!(cat = ast_category_new(cat_name, "", 99999))) {
-		ast_log(LOG_WARNING, "Unable to allocate category\n");
+	cat = ast_category_new_dynamic(cat_name);
+	if (!cat) {
 		return 1;
 	}
 
diff --git a/res/res_config_sqlite3.c b/res/res_config_sqlite3.c
index 8c514b07ca157b777b7d431ed7a6d47bbe527738..087843a68057efe297584416859b1e7827ab6fed 100644
--- a/res/res_config_sqlite3.c
+++ b/res/res_config_sqlite3.c
@@ -503,7 +503,8 @@ static int append_row_to_cfg(void *arg, int num_columns, char **values, char **c
 	struct ast_category *cat;
 	int i;
 
-	if (!(cat = ast_category_new("", "", 99999))) {
+	cat = ast_category_new_anonymous();
+	if (!cat) {
 		return SQLITE_ABORT;
 	}
 
@@ -723,8 +724,8 @@ static int static_realtime_cb(void *arg, int num_columns, char **values, char **
 	}
 
 	if (!args->cat_name || strcmp(args->cat_name, values[COL_CATEGORY])) {
-		if (!(args->cat = ast_category_new(values[COL_CATEGORY], "", 99999))) {
-			ast_log(LOG_WARNING, "Unable to allocate category\n");
+		args->cat = ast_category_new_dynamic(values[COL_CATEGORY]);
+		if (!args->cat) {
 			return SQLITE_ABORT;
 		}