diff --git a/include/asterisk/config_options.h b/include/asterisk/config_options.h
index 55e40ad8a901a2484f278fd2ffb8b669fb65dca1..11a8c5bf9feccc71ca719272d3f1c4e94a64b981 100644
--- a/include/asterisk/config_options.h
+++ b/include/asterisk/config_options.h
@@ -156,6 +156,7 @@ struct aco_file {
 
 struct aco_info {
 	const char *module; /*!< The name of the module whose config is being processed */
+	int hidden:1;                /*!< If enabled, this config item is hidden from users */
 	aco_pre_apply_config pre_apply_config; /*!< A callback called after processing, but before changes are applied */
 	aco_post_apply_config post_apply_config;/*!< A callback called after changes are applied */
 	aco_snapshot_alloc snapshot_alloc;     /*!< Allocate an object to hold all global configs and item containers */
@@ -213,6 +214,15 @@ static struct aco_info name = { \
 	__VA_ARGS__ \
 };
 
+#define CONFIG_INFO_TEST(name, arr, alloc, ...) \
+static struct aco_info name = { \
+	.module = AST_MODULE, \
+	.global_obj = &arr, \
+	.snapshot_alloc = alloc, \
+	.hidden = 1, \
+	__VA_ARGS__ \
+};
+
 /*! \brief Initialize an aco_info structure
  * \note aco_info_destroy must be called if this succeeds
  * \param info The address of an aco_info struct to initialize
diff --git a/main/config_options.c b/main/config_options.c
index e789c1cfcf45efe925cbefb2c3df10dd7e976be0..0d869b9601a4b3830e35d3f9ffb880ade6b317a6 100644
--- a/main/config_options.c
+++ b/main/config_options.c
@@ -184,7 +184,9 @@ static int link_option_to_types(struct aco_info *info, struct aco_type **types,
 		}
 		if (!ao2_link(type->internal->opts, opt)
 #ifdef AST_XML_DOCS
-				|| (!opt->no_doc && xmldoc_update_config_option(types, info->module, opt->name, type->name, opt->default_val, opt->match_type == ACO_REGEX, opt->type))
+				|| (!info->hidden && 
+					!opt->no_doc &&
+					xmldoc_update_config_option(types, info->module, opt->name, type->name, opt->default_val, opt->match_type == ACO_REGEX, opt->type))
 #endif /* AST_XML_DOCS */
 		) {
 			do {
@@ -773,7 +775,9 @@ int aco_info_init(struct aco_info *info)
 				goto error;
 			}
 #ifdef AST_XML_DOCS
-			if (!type->hidden && xmldoc_update_config_type(info->module, type->name, type->category, type->matchfield, type->matchvalue, type->category_match == ACO_WHITELIST)) {
+			if (!info->hidden &&
+				!type->hidden &&
+				xmldoc_update_config_type(info->module, type->name, type->category, type->matchfield, type->matchvalue, type->category_match == ACO_WHITELIST)) {
 				goto error;
 			}
 #endif /* AST_XML_DOCS */
diff --git a/tests/test_config.c b/tests/test_config.c
index 8eeb9f8a9bf34c57e53d6db4ef5c121a361e1b8b..6b1a8e420cdb375729a6f52df89a8f0475b0146f 100644
--- a/tests/test_config.c
+++ b/tests/test_config.c
@@ -749,7 +749,7 @@ struct aco_file config_test_conf = {
 };
 
 static AO2_GLOBAL_OBJ_STATIC(global_obj);
-CONFIG_INFO_STANDARD(cfg_info, global_obj, test_config_alloc,
+CONFIG_INFO_TEST(cfg_info, global_obj, test_config_alloc,
 	.files = ACO_FILES(&config_test_conf),
 );