diff --git a/addons/res_config_mysql.c b/addons/res_config_mysql.c
index b9ca81f367ddc433adde22ad6175c7376c146ace..cdc641bd1706799933de4c9377813c432e3e7ac7 100644
--- a/addons/res_config_mysql.c
+++ b/addons/res_config_mysql.c
@@ -525,9 +525,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++) {
@@ -936,8 +935,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 0b59f63b6d1ced4e688b46e07fcbb8556879465d..4dc473cd71b27635169b1516474171b0c2f4d7fd 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 a51802928b1e1e19f2e4a45c0425353fd587ba38..bc1a3fb3564628b07098e245ecdc3ccedfe0fd5a 100644
--- a/res/res_config_curl.c
+++ b/res/res_config_curl.c
@@ -184,7 +184,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;
 		}
 
@@ -571,8 +572,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 fd21aab809e3115e58ad4fe11dd80cf171151e32..9b73493e9d396d69be92ce06aa828cad987b0b5a 100644
--- a/res/res_config_ldap.c
+++ b/res/res_config_ldap.c
@@ -1045,10 +1045,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;
@@ -1197,7 +1195,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 893b9d897d1b88dad73af73ef1eda40682f342cc..583a84558a57ec098081d4548582f3ea4a264851 100644
--- a/res/res_config_odbc.c
+++ b/res/res_config_odbc.c
@@ -409,9 +409,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++) {
@@ -1018,9 +1017,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 58c34d08273898a7452b32fb128f0d4a08aae1bd..824adbf341ddedc2a8bbd9a3cd4711610758f254 100644
--- a/res/res_config_pgsql.c
+++ b/res/res_config_pgsql.c
@@ -683,8 +683,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) {
@@ -1164,9 +1166,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 b97ef7a86ae70290dc7361957e233c6499ba3f64..a5a831ea3054e32edfd1b93ef9a10052d3ea0fd8 100644
--- a/res/res_config_sqlite.c
+++ b/res/res_config_sqlite.c
@@ -875,10 +875,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;
 		}
 
@@ -1087,8 +1085,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 b9a10621506d1fd807762060eaaf8dbc744a176f..5362e9ede1a3d47a07a8a59500d881e83431d2d8 100644
--- a/res/res_config_sqlite3.c
+++ b/res/res_config_sqlite3.c
@@ -505,7 +505,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;
 	}
 
@@ -725,8 +726,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;
 		}