diff --git a/main/cli.c b/main/cli.c
index 80c1843281bff3a6af886bdd2e68e3599082cce3..e46d3427c5e33e706ef8484284a3f90de0771c1d 100644
--- a/main/cli.c
+++ b/main/cli.c
@@ -1655,8 +1655,15 @@ char *ast_cli_complete(const char *word, const char * const choices[], int state
 	len = ast_strlen_zero(word) ? 0 : strlen(word);
 
 	for (i = 0; choices[i]; i++) {
-		if ((!len || !strncasecmp(word, choices[i], len)) && ++which > state)
-			return ast_strdup(choices[i]);
+		if ((!len || !strncasecmp(word, choices[i], len)) && ++which > state) {
+			if (state != -1) {
+				return ast_strdup(choices[i]);
+			}
+
+			if (ast_cli_completion_add(ast_strdup(choices[i]))) {
+				return NULL;
+			}
+		}
 	}
 	return NULL;
 }
@@ -1682,9 +1689,16 @@ char *ast_complete_channels(const char *line, const char *word, int pos, int sta
 		struct ast_channel_snapshot *snapshot = stasis_message_data(msg);
 
 		if (!strncasecmp(word, snapshot->name, wordlen) && (++which > state)) {
-			ret = ast_strdup(snapshot->name);
-			ao2_ref(msg, -1);
-			break;
+			if (state != -1) {
+				ret = ast_strdup(snapshot->name);
+				ao2_ref(msg, -1);
+				break;
+			}
+
+			if (ast_cli_completion_add(ast_strdup(snapshot->name))) {
+				ao2_ref(msg, -1);
+				break;
+			}
 		}
 	}
 	ao2_iterator_destroy(&iter);
diff --git a/main/pbx_app.c b/main/pbx_app.c
index ec6bc75890a5fd7d8d5ac012b0fd4b131fe36cfd..df8126c7f17a34b32a778f6259fa1a6e6682d68c 100644
--- a/main/pbx_app.c
+++ b/main/pbx_app.c
@@ -275,7 +275,7 @@ static char *handle_show_application(struct ast_cli_entry *e, int cmd, struct as
 		 * application at one time. You can type 'show application Dial Echo' and
 		 * you will see informations about these two applications ...
 		 */
-		return ast_complete_applications(a->line, a->word, a->n);
+		return ast_complete_applications(a->line, a->word, -1);
 	}
 
 	if (a->argc < 4) {
@@ -437,20 +437,23 @@ char *ast_complete_applications(const char *line, const char *word, int state)
 	AST_RWLIST_RDLOCK(&apps);
 	AST_RWLIST_TRAVERSE(&apps, app, list) {
 		cmp = strncasecmp(word, app->name, wordlen);
-		if (cmp > 0) {
-			continue;
-		}
-		if (!cmp) {
+		if (cmp < 0) {
+			/* No more matches. */
+			break;
+		} else if (!cmp) {
 			/* Found match. */
-			if (++which <= state) {
-				/* Not enough matches. */
-				continue;
+			if (state != -1) {
+				if (++which <= state) {
+					/* Not enough matches. */
+					continue;
+				}
+				ret = ast_strdup(app->name);
+				break;
+			}
+			if (ast_cli_completion_add(ast_strdup(app->name))) {
+				break;
 			}
-			ret = ast_strdup(app->name);
-			break;
 		}
-		/* Not in container. */
-		break;
 	}
 	AST_RWLIST_UNLOCK(&apps);