diff --git a/CHANGES b/CHANGES
index 301799af38d84320882f62a25105b97a3fbd776a..54665e509247333e17748d89d477311d5551f433 100644
--- a/CHANGES
+++ b/CHANGES
@@ -23,6 +23,11 @@ AMI (Asterisk Manager Interface)
  * Added VoicemailRefresh action to allow an external entity to trigger mailbox
    updates when changes occur instead of requiring the use of pollmailboxes.
 
+ * CLI Command 'Manager Show Commands' no longer truncates command names longer
+   than 15 characters and no longer shows authorization requirement for commands.
+   'Manager Show Command' now displays the privileges needed for using a given
+   manager command instead.
+
 Logging
 -------------------
  * When performing queue pause/unpause on an interface without specifying an
diff --git a/main/manager.c b/main/manager.c
index 0c9c41d1bf6e687d181a55536735af9f2c81be28..e018eeead057ae86754620e8349b06eba9b2496c 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -89,6 +89,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/stringfields.h"
 #include "asterisk/presencestate.h"
 
+#ifdef HAVE_CURSES
+#include <curses.h>
+#endif
+
 /*** DOCUMENTATION
 	<manager name="Ping" language="en_US">
 		<synopsis>
@@ -1036,6 +1040,8 @@ static int block_sockets;
 static int unauth_sessions = 0;
 static struct ast_event_sub *acl_change_event_subscription;
 
+#define MGR_SHOW_TERMINAL_WIDTH 80
+
 /*! \brief
  * Descriptor for a manager session, either on the AMI socket or over HTTP.
  *
@@ -1595,7 +1601,7 @@ static char *handle_showmancmd(struct ast_cli_entry *e, int cmd, struct ast_cli_
 	int num, l, which;
 	char *ret = NULL;
 #ifdef AST_XML_DOCS
-	char syntax_title[64], description_title[64], synopsis_title[64], seealso_title[64], arguments_title[64];
+	char syntax_title[64], description_title[64], synopsis_title[64], seealso_title[64], arguments_title[64], privilege_title[64];
 #endif
 
 	switch (cmd) {
@@ -1630,15 +1636,18 @@ static char *handle_showmancmd(struct ast_cli_entry *e, int cmd, struct ast_cli_
 	term_color(syntax_title, "[Syntax]\n", COLOR_MAGENTA, 0, 40);
 	term_color(seealso_title, "[See Also]\n", COLOR_MAGENTA, 0, 40);
 	term_color(arguments_title, "[Arguments]\n", COLOR_MAGENTA, 0, 40);
+	term_color(privilege_title, "[Privilege]\n", COLOR_MAGENTA, 0,40);
 #endif
 
 	AST_RWLIST_RDLOCK(&actions);
 	AST_RWLIST_TRAVERSE(&actions, cur, list) {
 		for (num = 3; num < a->argc; num++) {
 			if (!strcasecmp(cur->action, a->argv[num])) {
+				authority_to_str(cur->authority, &authority);
+
 #ifdef AST_XML_DOCS
 				if (cur->docsrc == AST_XML_DOC) {
-					ast_cli(a->fd, "%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n\n",
+					ast_cli(a->fd, "%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n\n",
 						syntax_title,
 						ast_xmldoc_printable(S_OR(cur->syntax, "Not available"), 1),
 						synopsis_title,
@@ -1648,13 +1657,15 @@ static char *handle_showmancmd(struct ast_cli_entry *e, int cmd, struct ast_cli_
 						arguments_title,
 						ast_xmldoc_printable(S_OR(cur->arguments, "Not available"), 1),
 						seealso_title,
-						ast_xmldoc_printable(S_OR(cur->seealso, "Not available"), 1));
+						ast_xmldoc_printable(S_OR(cur->seealso, "Not available"), 1),
+						privilege_title,
+						ast_xmldoc_printable(S_OR(authority->str, "Not available"), 1));
 				} else
 #endif
 				{
 					ast_cli(a->fd, "Action: %s\nSynopsis: %s\nPrivilege: %s\n%s\n",
 						cur->action, cur->synopsis,
-						authority_to_str(cur->authority, &authority),
+						authority->str,
 						S_OR(cur->description, ""));
 				}
 			}
@@ -1805,8 +1816,9 @@ static char *handle_showmanagers(struct ast_cli_entry *e, int cmd, struct ast_cl
 static char *handle_showmancmds(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
 	struct manager_action *cur;
-	struct ast_str *authority;
-#define HSMC_FORMAT "  %-15.15s  %-15.15s  %-55.55s\n"
+	int name_len = 1;
+	int space_remaining;
+#define HSMC_FORMAT "  %-*.*s  %-.*s\n"
 	switch (cmd) {
 	case CLI_INIT:
 		e->command = "manager show commands";
@@ -1817,13 +1829,29 @@ static char *handle_showmancmds(struct ast_cli_entry *e, int cmd, struct ast_cli
 	case CLI_GENERATE:
 		return NULL;
 	}
-	authority = ast_str_alloca(80);
-	ast_cli(a->fd, HSMC_FORMAT, "Action", "Privilege", "Synopsis");
-	ast_cli(a->fd, HSMC_FORMAT, "------", "---------", "--------");
 
 	AST_RWLIST_RDLOCK(&actions);
 	AST_RWLIST_TRAVERSE(&actions, cur, list) {
-		ast_cli(a->fd, HSMC_FORMAT, cur->action, authority_to_str(cur->authority, &authority), cur->synopsis);
+		int incoming_len = strlen(cur->action);
+		if (incoming_len > name_len) {
+			name_len = incoming_len;
+		}
+	}
+
+#ifdef HAVE_CURSES
+	space_remaining = COLS - name_len - 4;
+#else
+	space_remaining = MGR_SHOW_TERMINAL_WIDTH - name_len - 4;
+#endif
+	if (space_remaining < 0) {
+		space_remaining = 0;
+	}
+
+	ast_cli(a->fd, HSMC_FORMAT, name_len, name_len, "Action", space_remaining, "Synopsis");
+	ast_cli(a->fd, HSMC_FORMAT, name_len, name_len, "------", space_remaining, "--------");
+
+	AST_RWLIST_TRAVERSE(&actions, cur, list) {
+		ast_cli(a->fd, HSMC_FORMAT, name_len, name_len, cur->action, space_remaining, cur->synopsis);
 	}
 	AST_RWLIST_UNLOCK(&actions);