diff --git a/channel.c b/channel.c
index a8747b017b51df3443c595f16b69b829fc7159af..dc4dd8fb88314dd8289cb812bd8bb194db6448d6 100644
--- a/channel.c
+++ b/channel.c
@@ -165,6 +165,22 @@ const struct ast_cause {
 };
 
 
+struct ast_variable *ast_channeltype_list(void)
+{
+	struct chanlist *cl;
+	struct ast_variable *var=NULL, *prev = NULL;
+	AST_LIST_TRAVERSE(&backends, cl, list) {
+		if (prev)  {
+			if ((prev->next = ast_variable_new(cl->tech->type, cl->tech->description)))
+				prev = prev->next;
+		} else {
+			var = ast_variable_new(cl->tech->type, cl->tech->description);
+			prev = var;
+		}
+	}
+	return var;
+}
+
 static int show_channeltypes(int fd, int argc, char *argv[])
 {
 #define FORMAT  "%-10.10s  %-40.40s %-12.12s %-12.12s %-12.12s\n"
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index f95faffea8797ac546f2580f70d4512dd5530ba0..94d776e4632fb30fd6acf25d46070eb3bfc00779 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -1236,6 +1236,9 @@ extern char *ast_print_group(char *buf, int buflen, ast_group_t group);
 */
 const char *channelreloadreason2txt(enum channelreloadreason reason);
 
+/*! \brief return an ast_variable list of channeltypes */
+extern struct ast_variable *ast_channeltype_list(void);
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif