diff --git a/asterisk.c b/asterisk.c
index 2ab474ed832717ae9e215734dfde376ad6d56a3b..203e1856060b60617ae71a95a5fbf28b35be450e 100644
--- a/asterisk.c
+++ b/asterisk.c
@@ -160,6 +160,7 @@ struct ast_flags ast_options = { AST_DEFAULT_OPTIONS };
 
 int option_verbose = 0;				/*!< Verbosity level */
 int option_debug = 0;				/*!< Debug level */
+int option_mute = 0;				/*!< Mute console */
 
 double option_maxload = 0.0;			/*!< Max load avg on system */
 int option_maxcalls = 0;			/*!< Max number of active calls */
@@ -176,6 +177,7 @@ struct console {
 	int fd;				/*!< File descriptor */
 	int p[2];			/*!< Pipe */
 	pthread_t t;			/*!< Thread of handler */
+	int mute;			/*!< Is the console muted for logs */
 };
 
 struct ast_atexit {
@@ -680,6 +682,51 @@ int ast_safe_system(const char *s)
 	return res;
 }
 
+/*!
+ * mute or unmute a console from logging
+ */
+void ast_console_mute(int fd) {
+	int x;
+	for (x=0;x<AST_MAX_CONNECTS; x++) {
+		if (fd == consoles[x].fd) {
+			if (consoles[x].mute) {
+				consoles[x].mute=0;
+				ast_cli(fd, "Console is not muted anymore.\n");
+			} else {
+				consoles[x].mute=1;
+				ast_cli(fd, "Console is muted.\n");
+			}
+			return;
+		}
+	}
+	ast_cli(fd, "Couldn't find remote console.\n");
+}
+
+/*!
+ * log the string to all attached console clients
+ */
+static void ast_network_puts_mutable(const char *string)
+{
+	int x;
+	for (x=0;x < AST_MAX_CONNECTS; x++) {
+		if (consoles[x].mute)
+			continue;;
+		if (consoles[x].fd > -1) 
+			fdprint(consoles[x].p[1], string);
+	}
+}
+
+/*!
+ * log the string to the console, and all attached
+ * console clients
+ */
+void ast_console_puts_mutable(const char *string)
+{
+	fputs(string, stdout);
+	fflush(stdout);
+	ast_network_puts_mutable(string);
+}
+
 /*!
  * write the string to all attached console clients
  */
@@ -711,14 +758,14 @@ static void network_verboser(const char *s, int pos, int replace, int complete)
 		if ((t = alloca(strlen(s) + 2))) {
 			sprintf(t, "\r%s", s);
 			if (complete)
-				ast_network_puts(t);
+				ast_network_puts_mutable(t);
 		} else {
 			ast_log(LOG_ERROR, "Out of memory\n");
-			ast_network_puts(s);
+			ast_network_puts_mutable(s);
 		}
 	} else {
 		if (complete)
-			ast_network_puts(s);
+			ast_network_puts_mutable(s);
 	}
 }
 
@@ -819,6 +866,7 @@ static void *listener(void *unused)
 					flags = fcntl(consoles[x].p[1], F_GETFL);
 					fcntl(consoles[x].p[1], F_SETFL, flags | O_NONBLOCK);
 					consoles[x].fd = s;
+					consoles[x].mute = 0;
 					if (ast_pthread_create(&consoles[x].t, &attr, netconsole, &consoles[x])) {
 						ast_log(LOG_ERROR, "Unable to spawn thread to handle connection: %s\n", strerror(errno));
 						close(consoles[x].p[0]);
@@ -2025,6 +2073,10 @@ static void ast_remotecontrol(char * data)
 	fdprint(ast_consock, tmp);
 	snprintf(tmp, sizeof(tmp), "set debug atleast %d", option_debug);
 	fdprint(ast_consock, tmp);
+	if (option_mute) {
+		snprintf(tmp, sizeof(tmp), "logger mute");
+		fdprint(ast_consock, tmp);
+	}
 	ast_verbose("Connected to Asterisk %s currently running on %s (pid = %d)\n", version, hostname, pid);
 	remotehostname = hostname;
 	if (getenv("HOME")) 
@@ -2093,6 +2145,7 @@ static int show_cli_help(void) {
 	printf("   -I              Enable internal timing if Zaptel timer is available\n");
 	printf("   -L <load>       Limit the maximum load average before rejecting new calls\n");
 	printf("   -M <value>      Limit the maximum number of calls to the specified value\n");
+	printf("   -m              Mute the console from debugging and verbose output\n");
 	printf("   -n              Disable console colorization\n");
 	printf("   -p              Run as pseudo-realtime thread\n");
 	printf("   -q              Quiet mode (suppress output)\n");
@@ -2311,7 +2364,7 @@ int main(int argc, char *argv[])
 	if (getenv("HOME")) 
 		snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME"));
 	/* Check for options */
-	while ((c = getopt(argc, argv, "tThfdvVqprRgciInx:U:G:C:L:M:")) != -1) {
+	while ((c = getopt(argc, argv, "mtThfdvVqprRgciInx:U:G:C:L:M:")) != -1) {
 		switch (c) {
 		case 'F':
 			ast_set_flag(&ast_options, AST_OPT_FLAG_ALWAYS_FORK);
@@ -2342,6 +2395,10 @@ int main(int argc, char *argv[])
 			option_verbose++;
 			ast_set_flag(&ast_options, AST_OPT_FLAG_NO_FORK);
 			break;
+		case 'm':
+			option_mute++;
+			ast_set_flag(&ast_options, AST_OPT_FLAG_NO_FORK);
+			break;
 		case 'M':
 			if ((sscanf(optarg, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0))
 				option_maxcalls = 0;
diff --git a/cli.c b/cli.c
index 49147223106bd04ee32fe95d9b8ddf2d9b865952..dcdb057165571a568e420c0633c2ff6add581257 100644
--- a/cli.c
+++ b/cli.c
@@ -114,6 +114,11 @@ static char set_debug_help[] =
 "       no messages should be displayed. Equivalent to -d[d[d...]]\n"
 "       on startup.\n";
 
+static char logger_mute_help[] = 
+"Usage: logger mute\n"
+"       Disables logging output to the current console, making it possible to\n"
+"       gather information without being disturbed by scrolling lines.\n";
+
 static char softhangup_help[] =
 "Usage: soft hangup <channel>\n"
 "       Request that a channel be hung up. The hangup takes effect\n"
@@ -213,6 +218,14 @@ static int handle_set_debug(int fd, int argc, char *argv[])
 	return RESULT_SUCCESS;
 }
 
+static int handle_logger_mute(int fd, int argc, char *argv[])
+{
+	if (argc != 2)
+		return RESULT_SHOWUSAGE;
+	ast_console_mute(fd);
+	return RESULT_SUCCESS;
+}
+
 static int handle_unload(int fd, int argc, char *argv[])
 {
 	int x;
@@ -919,6 +932,7 @@ static struct ast_cli_entry builtins[] = {
 	{ { "reload", NULL }, handle_reload, "Reload configuration", reload_help, complete_mod_2 },
 	{ { "set", "debug", NULL }, handle_set_debug, "Set level of debug chattiness", set_debug_help },
 	{ { "set", "verbose", NULL }, handle_set_verbose, "Set level of verboseness", set_verbose_help },
+	{ { "logger", "mute", NULL }, handle_logger_mute, "Disable logging output to a console", logger_mute_help },
 	{ { "show", "channel", NULL }, handle_showchan, "Display information on a specific channel", showchan_help, complete_ch_3 },
 	{ { "show", "channels", NULL }, handle_chanlist, "Display information on channels", chanlist_help, complete_show_channels },
 	{ { "show", "modules", NULL }, handle_modlist, "List modules and info", modlist_help },
diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h
index 2543e79498ee2f8f0021f5b5a2c6758e679e911f..9d00fba3026dacaa3616cd45878ab36b4daae480 100644
--- a/include/asterisk/logger.h
+++ b/include/asterisk/logger.h
@@ -82,6 +82,9 @@ int ast_unregister_verbose(void (*verboser)(const char *string, int opos, int re
 int ast_verbose_dmesg(void (*verboser)(const char *string, int opos, int replacelast, int complete));
 void ast_console_puts(const char *string);
 
+extern void ast_console_puts_mutable(const char *string);
+extern void ast_console_mute(int fd);
+
 #define _A_ __FILE__, __LINE__, __PRETTY_FUNCTION__
 
 #ifdef LOG_DEBUG
diff --git a/logger.c b/logger.c
index e4673a7182da4aaa88e7a701adc4205b45a7431a..3459e46e9e97cc07aea323be341d9c3f4f2f3ccc 100644
--- a/logger.c
+++ b/logger.c
@@ -756,11 +756,11 @@ void ast_log(int level, const char *file, int line, const char *function, const
 						term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)),
 						term_color(tmp4, function, COLOR_BRWHITE, 0, sizeof(tmp4)));
 					
-					ast_console_puts(buf);
+					ast_console_puts_mutable(buf);
 					va_start(ap, fmt);
 					vsnprintf(buf, sizeof(buf), fmt, ap);
 					va_end(ap);
-					ast_console_puts(buf);
+					ast_console_puts_mutable(buf);
 				}
 			/* File channels */
 			} else if ((chan->logmask & (1 << level)) && (chan->fileptr)) {