From 77b670c4ab62db2fa2386e15aa6ae4860bb401c9 Mon Sep 17 00:00:00 2001
From: Tilghman Lesher <tilghman@meg.abyt.es>
Date: Tue, 29 Nov 2011 18:43:16 +0000
Subject: [PATCH] Allow each logging destination and console to have its own
 notion of the verbosity level.

Review: https://reviewboard.asterisk.org/r/1599


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@346391 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 CHANGES                    |  10 ++
 UPGRADE.txt                |   6 +-
 addons/chan_ooh323.c       | 223 +++++++++++++++++++------------------
 addons/res_config_mysql.c  |   6 +-
 apps/app_rpt.c             |  45 +++-----
 apps/app_verbose.c         |  10 +-
 apps/app_voicemail.c       |  10 +-
 channels/chan_sip.c        |  12 +-
 channels/chan_skinny.c     |   4 +-
 channels/chan_usbradio.c   |   3 +-
 codecs/codec_dahdi.c       |   8 +-
 configs/logger.conf.sample |   6 +-
 include/asterisk/logger.h  |  34 ++----
 main/asterisk.c            | 147 +++++++++++++++++-------
 main/bridging.c            |   8 +-
 main/cli.c                 |  16 +++
 main/dial.c                |   3 +-
 main/logger.c              |  83 +++++++++-----
 main/say.c                 |  10 +-
 res/res_clialiases.c       |   2 +-
 res/res_fax.c              |   2 +-
 res/res_jabber.c           |   4 +-
 res/res_musiconhold.c      |  10 +-
 23 files changed, 376 insertions(+), 286 deletions(-)

diff --git a/CHANGES b/CHANGES
index 5dc86231e0..3554d45cf7 100644
--- a/CHANGES
+++ b/CHANGES
@@ -64,6 +64,16 @@ DUNDi changes
  * Allow the built in variables ${NUMBER}, ${IPADDR} and ${SECRET} to be
    used within the dynamic weight attribute when specifying a mapping.
 
+Core changes
+------------
+ * Each logging destination and console now have an independent notion of the
+   current verbosity level.  Logger.conf now allows an optional argument to
+   the 'verbose' specifier, indicating the level of verbosity sent to that
+   particular logging destination.  Additionally, remote consoles now each
+   have their own verbosity level.  While 'core set verbose' still works to
+   affect the core console verbosity, 'remote set verbose' will now set a
+   separate level for each remote console without affecting any other console.
+
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 1.8 to Asterisk 10 -------------------
 ------------------------------------------------------------------------------
diff --git a/UPGRADE.txt b/UPGRADE.txt
index dee01945a7..ac88afddf9 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -20,7 +20,7 @@
 ===
 ===========================================================
 
-From 10 to 12:
+From 10 to 11:
 
 func_enum:
  - ENUM query functions now return a count of -1 on lookup error to
@@ -36,6 +36,10 @@ Configuration Files:
    - dnsmgr.conf
    - dsp.conf
 
+ - The 'verbose' setting in logger.conf now takes an optional argument,
+   specifying the verbosity level for each logging destination.  The default,
+   if not otherwise specified, is a verbosity of 3.
+
 AMI:
   - DBDelTree now correctly returns an error when 0 rows are deleted just as
     the DBDel action does.
diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c
index 1592c1a4da..bca7a8b96a 100644
--- a/addons/chan_ooh323.c
+++ b/addons/chan_ooh323.c
@@ -361,8 +361,9 @@ static struct ast_channel *ooh323_new(struct ooh323_pvt *i, int state,
 	struct ast_format tmpfmt;
 	int features = 0;
 
-	if (gH323Debug)
-		ast_verbose("---   ooh323_new - %s\n", host);
+	if (gH323Debug) {
+		ast_verb(0, "---   ooh323_new - %s\n", host);
+	}
 
 	ast_format_clear(&tmpfmt);
 	/* Don't hold a h323 pvt lock while we allocate a channel */
@@ -480,8 +481,9 @@ static struct ast_channel *ooh323_new(struct ooh323_pvt *i, int state,
 
    	if(ch)   ast_channel_unlock(ch);
 
-	if (gH323Debug)
-		ast_verbose("+++   h323_new\n");
+	if (gH323Debug) {
+		ast_verb(0, "+++   h323_new\n");
+	}
 
 	return ch;
 }
@@ -492,8 +494,9 @@ static struct ooh323_pvt *ooh323_alloc(int callref, char *callToken)
 {
 	struct ooh323_pvt *pvt = NULL;
 
-	if (gH323Debug)
-		ast_verbose("---   ooh323_alloc\n");
+	if (gH323Debug) {
+		ast_verb(0, "---   ooh323_alloc\n");
+	}
 
 	if (!(pvt = ast_calloc(1, sizeof(*pvt)))) {
 		ast_log(LOG_ERROR, "Couldn't allocate private ooh323 structure\n");
@@ -542,8 +545,9 @@ static struct ooh323_pvt *ooh323_alloc(int callref, char *callToken)
 	iflist = pvt;
 	ast_mutex_unlock(&iflock);
 
-	if (gH323Debug)
-		ast_verbose("+++   ooh323_alloc\n");
+	if (gH323Debug) {
+		ast_verb(0, "+++   ooh323_alloc\n");
+	}
 
 	return pvt;
 }
@@ -566,7 +570,7 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca
 	int port = 0;
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_request - data %s format %s\n", (char*)data,  
+		ast_verb(0, "---   ooh323_request - data %s format %s\n", (char*)data,  
 										ast_getformatname_multiple(formats,FORMAT_STRING_SIZE,cap));
 
 	if (!(ast_format_cap_has_type(cap, AST_FORMAT_TYPE_AUDIO))) {
@@ -719,7 +723,7 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca
 
 	restart_monitor();
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_request\n");
+		ast_verb(0, "+++   ooh323_request\n");
 
 	return chan;
 
@@ -731,7 +735,7 @@ static struct ooh323_pvt* find_call(ooCallData *call)
 	struct ooh323_pvt *p;
 
 	if (gH323Debug)
-		ast_verbose("---   find_call\n");
+		ast_verb(0, "---   find_call\n");
 
 	ast_mutex_lock(&iflock);
 
@@ -743,7 +747,7 @@ static struct ooh323_pvt* find_call(ooCallData *call)
 	ast_mutex_unlock(&iflock);
 
 	if (gH323Debug)
-		ast_verbose("+++   find_call\n");
+		ast_verb(0, "+++   find_call\n");
 
 	return p;
 }
@@ -753,7 +757,7 @@ struct ooh323_user *find_user(const char * name, const char* ip)
 	struct ooh323_user *user;
 
 	if (gH323Debug)
-      ast_verbose("---   find_user: %s, %s\n",name,ip);
+      ast_verb(0, "---   find_user: %s, %s\n",name,ip);
 
 	ast_mutex_lock(&userl.lock);
 
@@ -769,7 +773,7 @@ struct ooh323_user *find_user(const char * name, const char* ip)
 	ast_mutex_unlock(&userl.lock);
 
 	if (gH323Debug)
-		ast_verbose("+++   find_user\n");
+		ast_verb(0, "+++   find_user\n");
 
 	return user;
 }
@@ -779,13 +783,13 @@ struct ooh323_peer *find_friend(const char *name, int port)
 	struct ooh323_peer *peer;  
 
 	if (gH323Debug)
-		ast_verbose("---   find_friend \"%s\"\n", name);
+		ast_verb(0, "---   find_friend \"%s\"\n", name);
 
 
 	ast_mutex_lock(&peerl.lock);
 	for (peer = peerl.peers; peer; peer = peer->next) {
 		if (gH323Debug) {
-			ast_verbose("		comparing with \"%s\"\n", peer->ip);
+			ast_verb(0, "		comparing with \"%s\"\n", peer->ip);
 		}
 		if (!strcmp(peer->ip, name)) {
 			if (port <= 0 || (port > 0 && peer->port == port)) {
@@ -797,9 +801,9 @@ struct ooh323_peer *find_friend(const char *name, int port)
 
 	if (gH323Debug) {
 		if (peer) {
-			ast_verbose("		found matching friend\n");
+			ast_verb(0, "		found matching friend\n");
 		}
-		ast_verbose("+++   find_friend \"%s\"\n", name);
+		ast_verb(0, "+++   find_friend \"%s\"\n", name);
 	}
 
 	return peer;		
@@ -811,13 +815,13 @@ struct ooh323_peer *find_peer(const char * name, int port)
 	struct ooh323_peer *peer;
 
 	if (gH323Debug)
-		ast_verbose("---   find_peer \"%s\"\n", name);
+		ast_verb(0, "---   find_peer \"%s\"\n", name);
 
 
 	ast_mutex_lock(&peerl.lock);
 	for (peer = peerl.peers; peer; peer = peer->next) {
 		if (gH323Debug) {
-			ast_verbose("		comparing with \"%s\"\n", peer->ip);
+			ast_verb(0, "		comparing with \"%s\"\n", peer->ip);
 		}
 		if (!strcasecmp(peer->name, name))
 			break;
@@ -836,9 +840,9 @@ struct ooh323_peer *find_peer(const char * name, int port)
 
 	if (gH323Debug) {
 		if (peer) {
-			ast_verbose("		found matching peer\n");
+			ast_verb(0, "		found matching peer\n");
 		}
-		ast_verbose("+++   find_peer \"%s\"\n", name);
+		ast_verb(0, "+++   find_peer \"%s\"\n", name);
 	}
 
 	return peer;		
@@ -850,7 +854,7 @@ static int ooh323_digit_begin(struct ast_channel *chan, char digit)
 	struct ooh323_pvt *p = (struct ooh323_pvt *) chan->tech_pvt;
 	
 	if (gH323Debug)
-		ast_verbose("---   ooh323_digit_begin\n");
+		ast_verb(0, "---   ooh323_digit_begin\n");
 
 	if (!p) {
 		ast_log(LOG_ERROR, "No private structure for call\n");
@@ -869,7 +873,7 @@ static int ooh323_digit_begin(struct ast_channel *chan, char digit)
 	}
 	ast_mutex_unlock(&p->lock);
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_digit_begin\n");
+		ast_verb(0, "+++   ooh323_digit_begin\n");
 
 	return 0;
 }
@@ -879,7 +883,7 @@ static int ooh323_digit_end(struct ast_channel *chan, char digit, unsigned int d
 	struct ooh323_pvt *p = (struct ooh323_pvt *) chan->tech_pvt;
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_digit_end\n");
+		ast_verb(0, "---   ooh323_digit_end\n");
 
 	if (!p) {
 		ast_log(LOG_ERROR, "No private structure for call\n");
@@ -891,7 +895,7 @@ static int ooh323_digit_end(struct ast_channel *chan, char digit, unsigned int d
 
 	ast_mutex_unlock(&p->lock);
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_digit_end\n");
+		ast_verb(0, "+++   ooh323_digit_end\n");
 
 	return 0;
 }
@@ -912,7 +916,7 @@ static int ooh323_call(struct ast_channel *ast, char *dest, int timeout)
 	};
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_call- %s\n", dest);
+		ast_verb(0, "---   ooh323_call- %s\n", dest);
 
 
    	if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
@@ -989,7 +993,7 @@ static int ooh323_call(struct ast_channel *ast, char *dest, int timeout)
       		return -1; /* ToDO: cleanup */
 	}
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_call\n");
+		ast_verb(0, "+++   ooh323_call\n");
 
   return 0;
 }
@@ -1000,7 +1004,7 @@ static int ooh323_hangup(struct ast_channel *ast)
    	int q931cause = AST_CAUSE_NORMAL_CLEARING;
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_hangup\n");
+		ast_verb(0, "---   ooh323_hangup\n");
 
 	if (p) {
 		ast_mutex_lock(&p->lock);
@@ -1027,7 +1031,7 @@ static int ooh323_hangup(struct ast_channel *ast)
 
 
 		if (gH323Debug)
-			ast_verbose("    hanging %s with cause: %d\n", p->username, q931cause);
+			ast_verb(0, "    hanging %s with cause: %d\n", p->username, q931cause);
 		ast->tech_pvt = NULL; 
 		if (!ast_test_flag(p, H323_ALREADYGONE)) {
          		ooHangCall(p->callToken, 
@@ -1056,7 +1060,7 @@ static int ooh323_hangup(struct ast_channel *ast)
 	}
 	
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_hangup\n");
+		ast_verb(0, "+++   ooh323_hangup\n");
 
   return 0;
 }
@@ -1067,7 +1071,7 @@ static int ooh323_answer(struct ast_channel *ast)
 	char *callToken = (char *)NULL;
 
 	if (gH323Debug)
-		ast_verbose("--- ooh323_answer\n");
+		ast_verb(0, "--- ooh323_answer\n");
 
 	if (p) {
 
@@ -1097,7 +1101,7 @@ static int ooh323_answer(struct ast_channel *ast)
 	}
 
 	if (gH323Debug)
-		ast_verbose("+++ ooh323_answer\n");
+		ast_verb(0, "+++ ooh323_answer\n");
 
   return 0;
 }
@@ -1201,12 +1205,12 @@ static int ooh323_indicate(struct ast_channel *ast, int condition, const void *d
 
 	if (!callToken) {
 		if (gH323Debug)
-			ast_verbose("	ooh323_indicate - No callToken\n");
+			ast_verb(0, "	ooh323_indicate - No callToken\n");
 		return -1;
 	}
 
 	if (gH323Debug)
-		ast_verbose("----- ooh323_indicate %d on call %s\n", condition, callToken);
+		ast_verb(0, "----- ooh323_indicate %d on call %s\n", condition, callToken);
 	 
    	ast_mutex_lock(&p->lock);
 	switch (condition) {
@@ -1359,7 +1363,7 @@ static int ooh323_indicate(struct ast_channel *ast, int condition, const void *d
    	ast_mutex_unlock(&p->lock);
 
 	if (gH323Debug)
-		ast_verbose("++++  ooh323_indicate %d on %s\n", condition, callToken);
+		ast_verb(0, "++++  ooh323_indicate %d on %s\n", condition, callToken);
 
    	free(callToken);
 	return res;
@@ -1378,7 +1382,7 @@ static int ooh323_queryoption(struct ast_channel *ast, int option, void *data, i
 	ast_mutex_lock(&p->lock);
 
 	if (gH323Debug)
-		ast_verbose("----- ooh323_queryoption %d on channel %s\n", option, ast->name);
+		ast_verb(0, "----- ooh323_queryoption %d on channel %s\n", option, ast->name);
 	 
 	switch (option) {
 
@@ -1418,7 +1422,7 @@ static int ooh323_queryoption(struct ast_channel *ast, int option, void *data, i
 	}
 
 	if (gH323Debug)
-		ast_verbose("+++++ ooh323_queryoption %d on channel %s\n", option, ast->name);
+		ast_verb(0, "+++++ ooh323_queryoption %d on channel %s\n", option, ast->name);
 	 
    	ast_mutex_unlock(&p->lock);
 
@@ -1434,7 +1438,7 @@ static int ooh323_fixup(struct ast_channel *oldchan, struct ast_channel *newchan
 	if (!p) return -1;
 
 	if (gH323Debug)
-		ast_verbose("--- ooh323c ooh323_fixup\n");
+		ast_verb(0, "--- ooh323c ooh323_fixup\n");
 
 	ast_mutex_lock(&p->lock);
 	if (p->owner != oldchan) {
@@ -1452,7 +1456,7 @@ static int ooh323_fixup(struct ast_channel *oldchan, struct ast_channel *newchan
 	ast_mutex_unlock(&p->lock);
 
 	if (gH323Debug)
-		ast_verbose("+++ ooh323c ooh323_fixup \n");
+		ast_verb(0, "+++ ooh323c ooh323_fixup \n");
 
 	return 0;
 }
@@ -1464,7 +1468,7 @@ void ooh323_set_write_format(ooCallData *call, struct ast_format *fmt, int txfra
 	char formats[FORMAT_STRING_SIZE];
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_update_writeformat %s/%d\n", 
+		ast_verb(0, "---   ooh323_update_writeformat %s/%d\n", 
 				ast_getformatname(fmt), txframes);
 	
 	p = find_call(call);
@@ -1488,7 +1492,7 @@ void ooh323_set_write_format(ooCallData *call, struct ast_format *fmt, int txfra
 			return;
 		}
 		if (gH323Debug)
-	  		ast_verbose("Writeformat before update %s/%s\n", 
+	  		ast_verb(0, "Writeformat before update %s/%s\n", 
 			  ast_getformatname(&p->owner->writeformat),
 			  ast_getformatname_multiple(formats, sizeof(formats), p->owner->nativeformats));
 		if (txframes)
@@ -1514,7 +1518,7 @@ void ooh323_set_write_format(ooCallData *call, struct ast_format *fmt, int txfra
 	ast_mutex_unlock(&p->lock);
 
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_update_writeformat\n");
+		ast_verb(0, "+++   ooh323_update_writeformat\n");
 }
 
 void ooh323_set_read_format(ooCallData *call, struct ast_format *fmt)
@@ -1522,7 +1526,7 @@ void ooh323_set_read_format(ooCallData *call, struct ast_format *fmt)
 	struct ooh323_pvt *p = NULL;
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_update_readformat %s\n", 
+		ast_verb(0, "---   ooh323_update_readformat %s\n", 
 				ast_getformatname(fmt));
 	
 	p = find_call(call);
@@ -1547,7 +1551,7 @@ void ooh323_set_read_format(ooCallData *call, struct ast_format *fmt)
 		}
 
 		if (gH323Debug)
-	  		ast_verbose("Readformat before update %s\n", 
+	  		ast_verb(0, "Readformat before update %s\n", 
 				  ast_getformatname(&p->owner->readformat));
 		ast_format_cap_set(p->owner->nativeformats, fmt);
 	  	ast_set_read_format(p->owner, &p->owner->readformat);
@@ -1558,7 +1562,7 @@ void ooh323_set_read_format(ooCallData *call, struct ast_format *fmt)
 	ast_mutex_unlock(&p->lock);
 
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_update_readformat\n");
+		ast_verb(0, "+++   ooh323_update_readformat\n");
 }
 
 
@@ -1568,7 +1572,7 @@ int onAlerting(ooCallData *call)
 	struct ast_channel *c = NULL;
 
 	if (gH323Debug)
-		ast_verbose("--- onAlerting %s\n", call->callToken);
+		ast_verb(0, "--- onAlerting %s\n", call->callToken);
 
    	p = find_call(call);
 
@@ -1613,7 +1617,7 @@ int onAlerting(ooCallData *call)
       	ast_mutex_unlock(&p->lock);
 
 	if (gH323Debug)
-		ast_verbose("+++ onAlerting %s\n", call->callToken);
+		ast_verb(0, "+++ onAlerting %s\n", call->callToken);
 
 	return OO_OK;
 }
@@ -1624,7 +1628,7 @@ int onProgress(ooCallData *call)
 	struct ast_channel *c = NULL;
 
 	if (gH323Debug)
-		ast_verbose("--- onProgress %s\n", call->callToken);
+		ast_verb(0, "--- onProgress %s\n", call->callToken);
 
    	p = find_call(call);
 
@@ -1669,7 +1673,7 @@ int onProgress(ooCallData *call)
       	ast_mutex_unlock(&p->lock);
 
 	if (gH323Debug)
-		ast_verbose("+++ onProgress %s\n", call->callToken);
+		ast_verb(0, "+++ onProgress %s\n", call->callToken);
 
 	return OO_OK;
 }
@@ -1730,7 +1734,7 @@ int ooh323_onReceivedSetup(ooCallData *call, Q931Message *pmsg)
 	char number [OO_MAX_NUMBER_LENGTH];
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_onReceivedSetup %s\n", call->callToken);
+		ast_verb(0, "---   ooh323_onReceivedSetup %s\n", call->callToken);
 
 
 	if (!(p = ooh323_alloc(call->callReference, call->callToken))) {
@@ -1877,7 +1881,7 @@ int ooh323_onReceivedSetup(ooCallData *call, Q931Message *pmsg)
 	ast_mutex_unlock(&p->lock);
 
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_onReceivedSetup - Determined context %s, "
+		ast_verb(0, "+++   ooh323_onReceivedSetup - Determined context %s, "
 						"extension %s\n", p->context, p->exten);
 
 	return OO_OK;
@@ -1891,7 +1895,7 @@ int onOutgoingCall(ooCallData *call)
 	int i = 0;
 
 	if (gH323Debug)
-		ast_verbose("---   onOutgoingCall %lx: %s\n", (long unsigned int) call, call->callToken);
+		ast_verb(0, "---   onOutgoingCall %lx: %s\n", (long unsigned int) call, call->callToken);
 
 	if (!strcmp(call->callType, "outgoing")) {
 		p = find_call(call);
@@ -1923,13 +1927,13 @@ int onOutgoingCall(ooCallData *call)
 
 		if (!ast_strlen_zero(p->caller_dialedDigits)) {
 			if (gH323Debug) {
-				ast_verbose("Setting dialed digits %s\n", p->caller_dialedDigits);
+				ast_verb(0, "Setting dialed digits %s\n", p->caller_dialedDigits);
 			}
 			ooCallAddAliasDialedDigits(call, p->caller_dialedDigits);
 		} else if (!ast_strlen_zero(p->callerid_num)) {
 			if (ooIsDailedDigit(p->callerid_num)) {
 				if (gH323Debug) {
-					ast_verbose("setting callid number %s\n", p->callerid_num);
+					ast_verb(0, "setting callid number %s\n", p->callerid_num);
 				}
 				ooCallAddAliasDialedDigits(call, p->callerid_num);
 			} else if (ast_strlen_zero(p->caller_h323id)) {
@@ -1953,7 +1957,7 @@ int onOutgoingCall(ooCallData *call)
 	}
 
 	if (gH323Debug)
-		ast_verbose("+++   onOutgoingCall %s\n", call->callToken);
+		ast_verb(0, "+++   onOutgoingCall %s\n", call->callToken);
 	return OO_OK;
 }
 
@@ -1964,7 +1968,7 @@ int onNewCallCreated(ooCallData *call)
 	int i = 0;
 
 	if (gH323Debug)
-		ast_verbose("---   onNewCallCreated %lx: %s\n", (long unsigned int) call, call->callToken);
+		ast_verb(0, "---   onNewCallCreated %lx: %s\n", (long unsigned int) call, call->callToken);
 
    	ast_mutex_lock(&call->Lock);
    	if (ooh323c_start_call_thread(call)) {
@@ -2004,13 +2008,13 @@ int onNewCallCreated(ooCallData *call)
 
 		if (!ast_strlen_zero(p->caller_dialedDigits)) {
 			if (gH323Debug) {
-				ast_verbose("Setting dialed digits %s\n", p->caller_dialedDigits);
+				ast_verb(0, "Setting dialed digits %s\n", p->caller_dialedDigits);
 			}
 			ooCallAddAliasDialedDigits(call, p->caller_dialedDigits);
 		} else if (!ast_strlen_zero(p->callerid_num)) {
 			if (ooIsDailedDigit(p->callerid_num)) {
 				if (gH323Debug) {
-					ast_verbose("setting callid number %s\n", p->callerid_num);
+					ast_verb(0, "setting callid number %s\n", p->callerid_num);
 				}
 				ooCallAddAliasDialedDigits(call, p->callerid_num);
 			} else if (ast_strlen_zero(p->caller_h323id)) {
@@ -2031,7 +2035,7 @@ int onNewCallCreated(ooCallData *call)
 		if (gH323Debug) {
 			char prefsBuf[256];
 			ast_codec_pref_string(&p->prefs, prefsBuf, sizeof(prefsBuf));
-			ast_verbose(" Outgoing call %s(%s) - Codec prefs - %s\n", 
+			ast_verb(0, " Outgoing call %s(%s) - Codec prefs - %s\n", 
 				p->username?p->username:"NULL", call->callToken, prefsBuf);
 		}
 
@@ -2044,7 +2048,7 @@ int onNewCallCreated(ooCallData *call)
 
    	ast_mutex_unlock(&call->Lock);
 	if (gH323Debug)
-		ast_verbose("+++   onNewCallCreated %s\n", call->callToken);
+		ast_verb(0, "+++   onNewCallCreated %s\n", call->callToken);
 	return OO_OK;
 }
 
@@ -2053,7 +2057,7 @@ int onCallEstablished(ooCallData *call)
 	struct ooh323_pvt *p = NULL;
 
 	if (gH323Debug)
-		ast_verbose("---   onCallEstablished %s\n", call->callToken);
+		ast_verb(0, "---   onCallEstablished %s\n", call->callToken);
 
 
 	if (!(p = find_call(call))) {
@@ -2099,7 +2103,7 @@ int onCallEstablished(ooCallData *call)
 	}
 
 	if (gH323Debug)
-		ast_verbose("+++   onCallEstablished %s\n", call->callToken);
+		ast_verb(0, "+++   onCallEstablished %s\n", call->callToken);
 
 	return OO_OK;
 }
@@ -2110,7 +2114,7 @@ int onCallCleared(ooCallData *call)
 	int ownerLock = 0;
 
 	if (gH323Debug)
-		ast_verbose("---   onCallCleared %s \n", call->callToken);
+		ast_verb(0, "---   onCallCleared %s \n", call->callToken);
 
 
    if ((p = find_call(call))) {
@@ -2155,7 +2159,7 @@ int onCallCleared(ooCallData *call)
     }
 
 	if (gH323Debug)
-		ast_verbose("+++   onCallCleared\n");
+		ast_verb(0, "+++   onCallCleared\n");
 
 	return OO_OK;
 }
@@ -2165,7 +2169,7 @@ int onCallCleared(ooCallData *call)
 	struct ooh323_user *prev = NULL, *cur = NULL;
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_delete_user\n");
+		ast_verb(0, "---   ooh323_delete_user\n");
 
 	if (user) {	
 		cur = userl.users;
@@ -2188,7 +2192,7 @@ int onCallCleared(ooCallData *call)
 	}  
 
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_delete_user\n");
+		ast_verb(0, "+++   ooh323_delete_user\n");
 
 } */
 
@@ -2197,7 +2201,7 @@ void ooh323_delete_peer(struct ooh323_peer *peer)
 	struct ooh323_peer *prev = NULL, *cur = NULL;
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_delete_peer\n");
+		ast_verb(0, "---   ooh323_delete_peer\n");
 
 	if (peer) {	
       cur = peerl.peers;
@@ -2226,7 +2230,7 @@ void ooh323_delete_peer(struct ooh323_peer *peer)
 	}  
 
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_delete_peer\n");
+		ast_verb(0, "+++   ooh323_delete_peer\n");
 
 }
 
@@ -2237,7 +2241,7 @@ static struct ooh323_user *build_user(const char *name, struct ast_variable *v)
 	struct ooh323_user *user = NULL;
 
 	if (gH323Debug)
-		ast_verbose("---   build_user\n");
+		ast_verb(0, "---   build_user\n");
 
    	user = ast_calloc(1,sizeof(struct ooh323_user));
 	if (user) {
@@ -2366,7 +2370,7 @@ static struct ooh323_user *build_user(const char *name, struct ast_variable *v)
 	}
 
 	if (gH323Debug)
-		ast_verbose("+++   build_user\n");
+		ast_verb(0, "+++   build_user\n");
 
 	return user;
 }
@@ -2376,7 +2380,7 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v,
 	struct ooh323_peer *peer = NULL;
 
 	if (gH323Debug)
-		ast_verbose("---   build_peer\n");
+		ast_verb(0, "---   build_peer\n");
 
 	peer = ast_calloc(1, sizeof(*peer));
 	if (peer) {
@@ -2534,7 +2538,7 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v,
 	}
 
 	if (gH323Debug)
-		ast_verbose("+++   build_peer\n");
+		ast_verb(0, "+++   build_peer\n");
 
 	return peer;
 }
@@ -2542,13 +2546,13 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v,
 static int ooh323_do_reload(void)
 {
 	if (gH323Debug) {
-		ast_verbose("---   ooh323_do_reload\n");
+		ast_verb(0, "---   ooh323_do_reload\n");
 	}
 
    	reload_config(1);
 
 	if (gH323Debug) {
-		ast_verbose("+++   ooh323_do_reload\n");
+		ast_verb(0, "+++   ooh323_do_reload\n");
 	}
 
 	return 0;
@@ -2574,11 +2578,11 @@ char *handle_cli_ooh323_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_
                return CLI_SHOWUSAGE;
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_reload\n");
+		ast_verb(0, "---   ooh323_reload\n");
 
 	ast_mutex_lock(&h323_reload_lock);
 	if (h323_reloading) {
-		ast_verbose("Previous OOH323 reload not yet done\n");
+		ast_verb(0, "Previous OOH323 reload not yet done\n");
    } else {
 		h323_reloading = 1;
 	}
@@ -2586,7 +2590,7 @@ char *handle_cli_ooh323_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_
 	restart_monitor();
 
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_reload\n");
+		ast_verb(0, "+++   ooh323_reload\n");
 
 	return 0;
 }
@@ -2605,7 +2609,7 @@ int reload_config(int reload)
 	struct ast_format tmpfmt;
 
 	if (gH323Debug)
-		ast_verbose("---   reload_config\n");
+		ast_verb(0, "---   reload_config\n");
 
 	cfg = ast_config_load((char*)config, config_flags);
 
@@ -2620,7 +2624,7 @@ int reload_config(int reload)
 		delete_users();
 		delete_peers();
 		if (gH323Debug) {
-			ast_verbose("  reload_config - Freeing up alias list\n");
+			ast_verb(0, "  reload_config - Freeing up alias list\n");
 		}
 		cur = gAliasList;
 		while (cur) {
@@ -2788,8 +2792,7 @@ int reload_config(int reload)
          strncpy(gLogFile, v->value, sizeof(gLogFile)-1);
 		} else if (!strcasecmp(v->name, "context")) {
          strncpy(gContext, v->value, sizeof(gContext)-1);
-         ast_verbose(VERBOSE_PREFIX_3 "  == Setting default context to %s\n", 
-                                                      gContext);
+         ast_verb(3, "  == Setting default context to %s\n", gContext);
 		} else if (!strcasecmp(v->name, "rtptimeout")) {
 			gRTPTimeout = atoi(v->value);
 			if (gRTPTimeout <= 0)
@@ -2926,7 +2929,7 @@ int reload_config(int reload)
 	}
 
 	if (gH323Debug)
-		ast_verbose("+++   reload_config\n");
+		ast_verb(0, "+++   reload_config\n");
 
 	return 0;
 
@@ -3760,10 +3763,10 @@ int ooh323_destroy(struct ooh323_pvt *p)
 	struct ooh323_user *user = NULL;
 
 	if (gH323Debug) {
-		ast_verbose("---   ooh323_destroy \n");
+		ast_verb(0, "---   ooh323_destroy \n");
 
 		if (p)
-			ast_verbose(" Destroying %s\n", p->username);
+			ast_verb(0, " Destroying %s\n", p->username);
 	}
 
 	cur = iflist;
@@ -3782,7 +3785,7 @@ int ooh323_destroy(struct ooh323_pvt *p)
 
 		if (cur->callToken) {
 	 		if (gH323Debug) 
-				ast_verbose(" Destroying %s\n", cur->callToken);
+				ast_verb(0, " Destroying %s\n", cur->callToken);
 			ast_free(cur->callToken);
 			cur->callToken = 0;
 		}
@@ -3858,7 +3861,7 @@ int ooh323_destroy(struct ooh323_pvt *p)
 	}
 
 	if (gH323Debug)
-		ast_verbose("+++   ooh323_destroy\n");
+		ast_verb(0, "+++   ooh323_destroy\n");
 
 	return 0;
 }
@@ -3935,7 +3938,7 @@ static int unload_module(void)
 	struct ooAliases *cur = NULL, *prev = NULL;
 
 	if (gH323Debug) {
-		ast_verbose("--- ooh323  unload_module \n");
+		ast_verb(0, "--- ooh323  unload_module \n");
 	}
 	/* First, take us out of the channel loop */
 	ast_cli_unregister_multiple(cli_ooh323, sizeof(cli_ooh323) / sizeof(struct ast_cli_entry));
@@ -3947,7 +3950,7 @@ static int unload_module(void)
 #endif
 
 	if (gH323Debug) {
-		ast_verbose("  unload_module - hanging up all interfaces\n");
+		ast_verb(0, "  unload_module - hanging up all interfaces\n");
 	}
 	if (!ast_mutex_lock(&iflock)) {
 		/* Hangup all interfaces if they have an owner */
@@ -3967,7 +3970,7 @@ static int unload_module(void)
 
 
 	if (gH323Debug) {
-		ast_verbose("  unload_module - stopping monitor thread\n");
+		ast_verb(0, "  unload_module - stopping monitor thread\n");
 	}  
 	if (monitor_thread != AST_PTHREADT_NULL) {
 		if (!ast_mutex_lock(&monlock)) {
@@ -3986,13 +3989,13 @@ static int unload_module(void)
 
 
 	if (gH323Debug) {
-		ast_verbose("   unload_module - stopping stack thread\n");
+		ast_verb(0, "   unload_module - stopping stack thread\n");
 	}
 	ooh323c_stop_stack_thread();
 
 
 	if (gH323Debug) {
-		ast_verbose("   unload_module - freeing up memory used by interfaces\n");
+		ast_verb(0, "   unload_module - freeing up memory used by interfaces\n");
 	}
 	if (!ast_mutex_lock(&iflock)) {
 		struct ooh323_pvt *pl;
@@ -4014,19 +4017,19 @@ static int unload_module(void)
  
 
 	if (gH323Debug) {
-		ast_verbose("  unload_module - deleting users\n");
+		ast_verb(0, "  unload_module - deleting users\n");
 	}
 	delete_users();
 
 
 	if (gH323Debug) {
-		ast_verbose("  unload_module - deleting peers\n");
+		ast_verb(0, "  unload_module - deleting peers\n");
 	}
 	delete_peers();
 
 
 	if (gH323Debug) {
-		ast_verbose("  unload_module - Freeing up alias list\n");
+		ast_verb(0, "  unload_module - Freeing up alias list\n");
 	}
 	cur = gAliasList;
 	while (cur) {
@@ -4039,12 +4042,12 @@ static int unload_module(void)
 
 
 	if (gH323Debug) {
-		ast_verbose("	unload_module- destroying OOH323 endpoint \n");
+		ast_verb(0, "	unload_module- destroying OOH323 endpoint \n");
 	}
 	ooH323EpDestroy();
 
 	if (gH323Debug) {
-		ast_verbose("+++ ooh323  unload_module \n");
+		ast_verb(0, "+++ ooh323  unload_module \n");
 	}
 
 	gCap = ast_format_cap_destroy(gCap);
@@ -4158,7 +4161,7 @@ static int ooh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance
 	int mode;
 
 	if (gH323Debug)
-		ast_verbose("---   ooh323_set_peer - %s\n", chan->name);
+		ast_verb(0, "---   ooh323_set_peer - %s\n", chan->name);
 
 	if (!rtp) {
 		return 0;
@@ -4194,7 +4197,7 @@ int configure_local_rtp(struct ooh323_pvt *p, ooCallData *call)
 	ast_format_clear(&tmpfmt);
 
 	if (gH323Debug)
-		ast_verbose("---   configure_local_rtp\n");
+		ast_verb(0, "---   configure_local_rtp\n");
 
 
 	if (ast_parse_arg(call->localIP, PARSE_ADDR, &tmp)) {
@@ -4262,7 +4265,7 @@ int configure_local_rtp(struct ooh323_pvt *p, ooCallData *call)
 
 	if (p->rtdrcount) {
 		if (gH323Debug)
-			ast_verbose("Setup RTDR info: %d, %d\n", p->rtdrinterval, p->rtdrcount);
+			ast_verb(0, "Setup RTDR info: %d, %d\n", p->rtdrinterval, p->rtdrcount);
 		call->rtdrInterval = p->rtdrinterval;
 		call->rtdrCount = p->rtdrcount;
 	}
@@ -4307,7 +4310,7 @@ int configure_local_rtp(struct ooh323_pvt *p, ooCallData *call)
 	}
 
 	if (gH323Debug)
-		ast_verbose("+++   configure_local_rtp\n");
+		ast_verb(0, "+++   configure_local_rtp\n");
 
 	return 1;
 }
@@ -4319,7 +4322,7 @@ void setup_rtp_connection(ooCallData *call, const char *remoteIp,
 	struct ast_sockaddr tmp;
 
 	if (gH323Debug)
-		ast_verbose("---   setup_rtp_connection %s:%d\n", remoteIp, remotePort);
+		ast_verb(0, "---   setup_rtp_connection %s:%d\n", remoteIp, remotePort);
 
 	/* Find the call or allocate a private structure if call not found */
 	p = find_call(call); 
@@ -4338,7 +4341,7 @@ void setup_rtp_connection(ooCallData *call, const char *remoteIp,
 							"audio", "G726-32", AST_RTP_OPT_G726_NONSTANDARD);
 
 	if(gH323Debug)
-		ast_verbose("+++   setup_rtp_connection\n");
+		ast_verb(0, "+++   setup_rtp_connection\n");
 
 	return;
 }
@@ -4348,7 +4351,7 @@ void close_rtp_connection(ooCallData *call)
 	struct ooh323_pvt *p = NULL;
 
    if(gH323Debug)
-		ast_verbose("---   close_rtp_connection\n");
+		ast_verb(0, "---   close_rtp_connection\n");
 
 	p = find_call(call);
 	if (!p) {
@@ -4363,7 +4366,7 @@ void close_rtp_connection(ooCallData *call)
 	ast_mutex_unlock(&p->lock);
 
    if(gH323Debug)
-		ast_verbose("+++   close_rtp_connection\n");
+		ast_verb(0, "+++   close_rtp_connection\n");
 
 	return;
 }
@@ -4414,7 +4417,7 @@ void setup_udptl_connection(ooCallData *call, const char *remoteIp,
 	struct ast_sockaddr them;
 
 	if (gH323Debug)
-		ast_verbose("---   setup_udptl_connection\n");
+		ast_verb(0, "---   setup_udptl_connection\n");
 
 	/* Find the call or allocate a private structure if call not found */
 	p = find_call(call); 
@@ -4463,7 +4466,7 @@ void setup_udptl_connection(ooCallData *call, const char *remoteIp,
 	ast_mutex_unlock(&p->lock);
 
 	if(gH323Debug)
-		ast_verbose("+++   setup_udptl_connection\n");
+		ast_verb(0, "+++   setup_udptl_connection\n");
 
 	return;
 }
@@ -4473,7 +4476,7 @@ void close_udptl_connection(ooCallData *call)
 	struct ooh323_pvt *p = NULL;
 
    	if(gH323Debug)
-		ast_verbose("---   close_udptl_connection\n");
+		ast_verb(0, "---   close_udptl_connection\n");
 
 	p = find_call(call);
 	if (!p) {
@@ -4509,7 +4512,7 @@ void close_udptl_connection(ooCallData *call)
 	ast_mutex_unlock(&p->lock);
 
    	if(gH323Debug)
-		ast_verbose("+++   close_udptl_connection\n");
+		ast_verb(0, "+++   close_udptl_connection\n");
 
 	return;
 }
@@ -4600,7 +4603,7 @@ struct ast_frame *ooh323_rtp_read(struct ast_channel *ast, struct ooh323_pvt *p)
 		/* Switch to T.38 ON CED*/
 		if (!p->faxmode && !p->chmodepend && (dfr->subclass.integer == 'e') && (p->t38support != T38_DISABLED)) {
 			if (gH323Debug)
-				ast_verbose("request to change %s to t.38 because fax ced\n", p->callToken);
+				ast_verb(0, "request to change %s to t.38 because fax ced\n", p->callToken);
 			p->chmodepend = 1;
 			p->faxdetected = 1;
 			ooRequestChangeMode(p->callToken, 1);
diff --git a/addons/res_config_mysql.c b/addons/res_config_mysql.c
index d393de6c16..f011e0d724 100644
--- a/addons/res_config_mysql.c
+++ b/addons/res_config_mysql.c
@@ -1379,8 +1379,7 @@ static int load_module(void)
 	parse_config(0);
 
 	ast_config_engine_register(&mysql_engine);
-	if (option_verbose > 1)
-		ast_verbose(VERBOSE_PREFIX_2 "MySQL RealTime driver loaded.\n");
+	ast_verb(2, "MySQL RealTime driver loaded.\n");
 	ast_cli_register_multiple(cli_realtime_mysql_status, sizeof(cli_realtime_mysql_status) / sizeof(struct ast_cli_entry));
 	return 0;
 }
@@ -1392,8 +1391,7 @@ static int unload_module(void)
 
 	ast_cli_unregister_multiple(cli_realtime_mysql_status, sizeof(cli_realtime_mysql_status) / sizeof(struct ast_cli_entry));
 	ast_config_engine_deregister(&mysql_engine);
-	if (option_verbose > 1)
-		ast_verbose(VERBOSE_PREFIX_2 "MySQL RealTime unloaded.\n");
+	ast_verb(2, "MySQL RealTime unloaded.\n");
 
 	ast_module_user_hangup_all();
 
diff --git a/apps/app_rpt.c b/apps/app_rpt.c
index f37083695a..6722040e5f 100644
--- a/apps/app_rpt.c
+++ b/apps/app_rpt.c
@@ -2254,8 +2254,7 @@ char s1[256];
 static char *cs_keywords[] = {"rptena","rptdis","apena","apdis","lnkena","lnkdis","totena","totdis","skena","skdis",
 				"ufena","ufdis","atena","atdis",NULL};
 
-	if (option_verbose > 2)
-		ast_verbose(VERBOSE_PREFIX_3 "%s config for repeater %s\n",
+	ast_verb(3, "%s config for repeater %s\n",
 			(init) ? "Loading initial" : "Re-Loading",rpt_vars[n].name);
 	ast_mutex_lock(&rpt_vars[n].lock);
 	if (rpt_vars[n].cfg) ast_config_destroy(rpt_vars[n].cfg);
@@ -10411,9 +10410,8 @@ static int attempt_reconnect(struct rpt *myrpt, struct rpt_link *l)
 #endif
 		l->chan->appl = "Apprpt";
 		l->chan->data = "(Remote Rx)";
-		if (option_verbose > 2)
-			ast_verbose(VERBOSE_PREFIX_3 "rpt (attempt_reconnect) initiating call to %s/%s on %s\n",
-				deststr, tele, l->chan->name);
+		ast_verb(3, "rpt (attempt_reconnect) initiating call to %s/%s on %s\n",
+			deststr, tele, l->chan->name);
 		l->chan->caller.id.number.valid = 1;
 		ast_free(l->chan->caller.id.number.str);
 		l->chan->caller.id.number.str = ast_strdup(myrpt->name);
@@ -10422,9 +10420,8 @@ static int attempt_reconnect(struct rpt *myrpt, struct rpt_link *l)
 	}
 	else 
 	{
-		if (option_verbose > 2)
-			ast_verbose(VERBOSE_PREFIX_3 "Unable to place call to %s/%s on %s\n",
-				deststr,tele,l->chan->name);
+		ast_verb(3, "Unable to place call to %s/%s on %s\n",
+			deststr,tele,l->chan->name);
 		return -1;
 	}
 	rpt_mutex_lock(&myrpt->lock);
@@ -10848,8 +10845,7 @@ struct ast_format_cap *cap = NULL;
 #endif
 		myrpt->rxchannel->appl = "Apprpt";
 		myrpt->rxchannel->data = "(Repeater Rx)";
-		if (option_verbose > 2)
-			ast_verbose(VERBOSE_PREFIX_3 "rpt (Rx) initiating call to %s/%s on %s\n",
+		ast_verb(3, "rpt (Rx) initiating call to %s/%s on %s\n",
 				tmpstr,tele,myrpt->rxchannel->name);
 		ast_call(myrpt->rxchannel,tele,999);
 		if (myrpt->rxchannel->_state != AST_STATE_UP)
@@ -10907,8 +10903,7 @@ struct ast_format_cap *cap = NULL;
 #endif
 			myrpt->txchannel->appl = "Apprpt";
 			myrpt->txchannel->data = "(Repeater Tx)";
-			if (option_verbose > 2)
-				ast_verbose(VERBOSE_PREFIX_3 "rpt (Tx) initiating call to %s/%s on %s\n",
+			ast_verb(3, "rpt (Tx) initiating call to %s/%s on %s\n",
 					tmpstr,tele,myrpt->txchannel->name);
 			ast_call(myrpt->txchannel,tele,999);
 			if (myrpt->rxchannel->_state != AST_STATE_UP)
@@ -13447,14 +13442,12 @@ static int rpt_exec(struct ast_channel *chan, const char *data)
 			chan->priority++;
 		}
 
-		if(option_verbose > 2) {
-			ast_verbose(VERBOSE_PREFIX_3 "Return Context: (%s,%s,%d) ID: %s\n",
-				chan->context, chan->exten, chan->priority,
-				S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, ""));
-			if(!ast_exists_extension(chan, chan->context, chan->exten, chan->priority,
-				S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL))) {
-				ast_verbose( VERBOSE_PREFIX_3 "Warning: Return Context Invalid, call will return to default|s\n");
-			}
+		ast_verb(3, "Return Context: (%s,%s,%d) ID: %s\n",
+			chan->context, chan->exten, chan->priority,
+			S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, ""));
+		if (!ast_exists_extension(chan, chan->context, chan->exten, chan->priority,
+			S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL))) {
+			ast_verb(3, "Warning: Return Context Invalid, call will return to default|s\n");
 		}
   
 		/* we are using masq_park here to protect * from touching the channel once we park it.  If the channel comes out of timeout
@@ -13462,7 +13455,7 @@ static int rpt_exec(struct ast_channel *chan, const char *data)
 
 		ast_masq_park_call(chan, NULL, timeout, &lot);
 
-		if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "Call Parking Called, lot: %d, timeout: %d, context: %s\n", lot, timeout, return_context);
+		ast_verb(3, "Call Parking Called, lot: %d, timeout: %d, context: %s\n", lot, timeout, return_context);
 
 		snprintf(buffer, sizeof(buffer) - 1, "%d,%s", lot, template + 1);
 
@@ -13833,9 +13826,8 @@ static int rpt_exec(struct ast_channel *chan, const char *data)
 #endif
 		myrpt->rxchannel->appl = "Apprpt";
 		myrpt->rxchannel->data = "(Link Rx)";
-		if (option_verbose > 2)
-			ast_verbose(VERBOSE_PREFIX_3 "rpt (Rx) initiating call to %s/%s on %s\n",
-				myrpt->rxchanname,tele,myrpt->rxchannel->name);
+		ast_verb(3, "rpt (Rx) initiating call to %s/%s on %s\n",
+			myrpt->rxchanname,tele,myrpt->rxchannel->name);
 		rpt_mutex_unlock(&myrpt->lock);
 		ast_call(myrpt->rxchannel,tele,999);
 		rpt_mutex_lock(&myrpt->lock);
@@ -13876,9 +13868,8 @@ static int rpt_exec(struct ast_channel *chan, const char *data)
 #endif
 			myrpt->txchannel->appl = "Apprpt";
 			myrpt->txchannel->data = "(Link Tx)";
-			if (option_verbose > 2)
-				ast_verbose(VERBOSE_PREFIX_3 "rpt (Tx) initiating call to %s/%s on %s\n",
-					myrpt->txchanname,tele,myrpt->txchannel->name);
+			ast_verb(3, "rpt (Tx) initiating call to %s/%s on %s\n",
+				myrpt->txchanname,tele,myrpt->txchannel->name);
 			rpt_mutex_unlock(&myrpt->lock);
 			ast_call(myrpt->txchannel,tele,999);
 			rpt_mutex_lock(&myrpt->lock);
diff --git a/apps/app_verbose.c b/apps/app_verbose.c
index ca1a010cc3..c8c64617c2 100644
--- a/apps/app_verbose.c
+++ b/apps/app_verbose.c
@@ -103,19 +103,19 @@ static int verbose_exec(struct ast_channel *chan, const char *data)
 	if (option_verbose >= vsize) {
 		switch (vsize) {
 		case 0:
-			ast_verbose("%s\n", args.msg);
+			ast_verb(0, "%s\n", args.msg);
 			break;
 		case 1:
-			ast_verbose(VERBOSE_PREFIX_1 "%s\n", args.msg);
+			ast_verb(1, "%s\n", args.msg);
 			break;
 		case 2:
-			ast_verbose(VERBOSE_PREFIX_2 "%s\n", args.msg);
+			ast_verb(2, "%s\n", args.msg);
 			break;
 		case 3:
-			ast_verbose(VERBOSE_PREFIX_3 "%s\n", args.msg);
+			ast_verb(3, "%s\n", args.msg);
 			break;
 		default:
-			ast_verbose(VERBOSE_PREFIX_4 "%s\n", args.msg);
+			ast_verb(4, "%s\n", args.msg);
 		}
 	}
 
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index be604f0c18..c43a0ceaa6 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -13044,16 +13044,14 @@ static int dialout(struct ast_channel *chan, struct ast_vm_user *vmu, char *num,
 		}
 		
 	} else {
-		if (option_verbose > 2)
-			ast_verbose( VERBOSE_PREFIX_3 "Destination number is CID number '%s'\n", num);
+		ast_verb(3, "Destination number is CID number '%s'\n", num);
 		ast_copy_string(destination, num, sizeof(destination));
 	}
 
 	if (!ast_strlen_zero(destination)) {
 		if (destination[strlen(destination) -1 ] == '*')
 			return 0; 
-		if (option_verbose > 2)
-			ast_verbose( VERBOSE_PREFIX_3 "Placing outgoing call to extension '%s' in context '%s' from context '%s'\n", destination, outgoing_context, chan->context);
+		ast_verb(3, "Placing outgoing call to extension '%s' in context '%s' from context '%s'\n", destination, outgoing_context, chan->context);
 		ast_copy_string(chan->exten, destination, sizeof(chan->exten));
 		ast_copy_string(chan->context, outgoing_context, sizeof(chan->context));
 		chan->priority = 0;
@@ -13388,11 +13386,11 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
 			if (outsidecaller) {  /* only mark vm messages */
 				/* Mark Urgent */
 				if ((flag && ast_strlen_zero(flag)) || (!ast_strlen_zero(flag) && strcmp(flag, "Urgent"))) {
-					ast_verbose(VERBOSE_PREFIX_3 "marking message as Urgent\n");
+					ast_verb(3, "marking message as Urgent\n");
 					res = ast_play_and_wait(chan, "vm-marked-urgent");
 					strcpy(flag, "Urgent");
 				} else if (flag) {
-					ast_verbose(VERBOSE_PREFIX_3 "UNmarking message as Urgent\n");
+					ast_verb(3, "UNmarking message as Urgent\n");
 					res = ast_play_and_wait(chan, "vm-urgent-removed");
 					strcpy(flag, "");
 				} else {
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index a20d9316dc..3b3a3460a9 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -7471,7 +7471,7 @@ static struct ast_frame *sip_read(struct ast_channel *ast)
 				S_COR(ast->caller.id.number.valid, ast->caller.id.number.str, NULL))) {
 				ast_channel_lock(ast);
 				sip_pvt_lock(p);
-				ast_verbose(VERBOSE_PREFIX_2 "Redirecting '%s' to fax extension due to CNG detection\n", ast->name);
+				ast_verb(2, "Redirecting '%s' to fax extension due to CNG detection\n", ast->name);
 				pbx_builtin_setvar_helper(ast, "FAXEXTEN", ast->exten);
 				if (ast_async_goto(ast, target_context, "fax", 1)) {
 					ast_log(LOG_NOTICE, "Failed to async goto '%s' into fax of '%s'\n", ast->name, target_context);
@@ -9426,7 +9426,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
 						ast_channel_unlock(p->owner);
 						if (ast_exists_extension(p->owner, target_context, "fax", 1,
 							S_COR(p->owner->caller.id.number.valid, p->owner->caller.id.number.str, NULL))) {
-							ast_verbose(VERBOSE_PREFIX_2 "Redirecting '%s' to fax extension due to peer T.38 re-INVITE\n", p->owner->name);
+							ast_verb(2, "Redirecting '%s' to fax extension due to peer T.38 re-INVITE\n", p->owner->name);
 							pbx_builtin_setvar_helper(p->owner, "FAXEXTEN", p->owner->exten);
 							if (ast_async_goto(p->owner, target_context, "fax", 1)) {
 								ast_log(LOG_NOTICE, "Failed to async goto '%s' into fax of '%s'\n", p->owner->name, target_context);
@@ -14260,13 +14260,13 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
 	manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: Registered\r\nAddress: %s\r\n", peer->name,  ast_sockaddr_stringify(&peer->addr));
 
 	/* Is this a new IP address for us? */
-	if (VERBOSITY_ATLEAST(2) && ast_sockaddr_cmp(&peer->addr, &oldsin)) {
-		ast_verbose(VERBOSE_PREFIX_3 "Registered SIP '%s' at %s\n", peer->name,
-				ast_sockaddr_stringify(&peer->addr));
+	if (ast_sockaddr_cmp(&peer->addr, &oldsin)) {
+		ast_verb(3, "Registered SIP '%s' at %s\n", peer->name,
+			ast_sockaddr_stringify(&peer->addr));
 	}
 	sip_poke_peer(peer, 0);
 	register_peer_exten(peer, 1);
-	
+
 	/* Save User agent */
 	useragent = sip_get_header(req, "User-Agent");
 	if (strcasecmp(useragent, peer->useragent)) {
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index a61e21a77e..37997472df 100644
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -5927,9 +5927,9 @@ static int handle_offhook_message(struct skinny_req *req, struct skinnysession *
 	SKINNY_DEVONLY(if (skinnydebug > 1) {
 		ast_verb(4, "Received OFFHOOK_MESSAGE from %s, instance=%d, callid=%d\n", d->name, instance, reference);
 	})
-	
+
 	if (d->hookstate == SKINNY_OFFHOOK) {
-		ast_verbose(VERBOSE_PREFIX_3 "Got offhook message when device (%s) already offhook\n", d->name);
+		ast_verb(3, "Got offhook message when device (%s) already offhook\n", d->name);
 		return 0;
 	}
 
diff --git a/channels/chan_usbradio.c b/channels/chan_usbradio.c
index e89cf302e4..a6cc03a667 100644
--- a/channels/chan_usbradio.c
+++ b/channels/chan_usbradio.c
@@ -1546,8 +1546,7 @@ static int setformat(struct chan_usbradio_pvt *o, int mode)
 			/* Check to see if duplex set (FreeBSD Bug) */
 			res = ioctl(fd, SNDCTL_DSP_GETCAPS, &fmt);
 			if (res == 0 && (fmt & DSP_CAP_DUPLEX)) {
-				if (option_verbose > 1)
-					ast_verbose(VERBOSE_PREFIX_2 "Console is full duplex\n");
+				ast_verb(2, "Console is full duplex\n");
 				o->duplex = M_FULL;
 			};
 			break;
diff --git a/codecs/codec_dahdi.c b/codecs/codec_dahdi.c
index 9e15d40953..bca0256e35 100644
--- a/codecs/codec_dahdi.c
+++ b/codecs/codec_dahdi.c
@@ -603,8 +603,7 @@ static int find_transcoders(void)
 	}
 
 	for (info.tcnum = 0; !(res = ioctl(fd, DAHDI_TC_GETINFO, &info)); info.tcnum++) {
-		if (option_verbose > 1)
-			ast_verbose(VERBOSE_PREFIX_2 "Found transcoder '%s'.\n", info.name);
+		ast_verb(2, "Found transcoder '%s'.\n", info.name);
 
 		/* Complex codecs need to support signed linear.  If the
 		 * hardware transcoder does not natively support signed linear
@@ -628,8 +627,9 @@ static int find_transcoders(void)
 
 	close(fd);
 
-	if (!info.tcnum && (option_verbose > 1))
-		ast_verbose(VERBOSE_PREFIX_2 "No hardware transcoders found.\n");
+	if (!info.tcnum) {
+		ast_verb(2, "No hardware transcoders found.\n");
+	}
 
 	for (x = 0; x < 32; x++) {
 		for (y = 0; y < 32; y++) {
diff --git a/configs/logger.conf.sample b/configs/logger.conf.sample
index af1f90c0b1..3f4850788b 100644
--- a/configs/logger.conf.sample
+++ b/configs/logger.conf.sample
@@ -73,7 +73,7 @@
 ;    notice
 ;    warning
 ;    error
-;    verbose
+;    verbose(<level>)
 ;    dtmf
 ;    fax
 ;    security
@@ -93,6 +93,10 @@
 ; a filename; the "*" level means all levels, and the remaining level names
 ; will be ignored.
 ;
+; Verbose takes an additional argument, in the form of an integer level.
+; Messages with higher levels will be ignored.  If verbose is specified at
+; all, it will default to 3.
+;
 ; We highly recommend that you DO NOT turn on debug mode if you are simply
 ; running a production system.  Debug mode turns on a LOT of extra messages,
 ; most of which you are unlikely to understand without an understanding of
diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h
index 9363caa748..a3e436d441 100644
--- a/include/asterisk/logger.h
+++ b/include/asterisk/logger.h
@@ -68,19 +68,20 @@ int logger_reload(void);
 void __attribute__((format(printf, 5, 6))) ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt, ...);
 
 /*! Send a verbose message (based on verbose level)
- 	\brief This works like ast_log, but prints verbose messages to the console depending on verbosity level set.
- 	ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing");
- 	This will print the message to the console if the verbose level is set to a level >= 3
- 	Note the abscence of a comma after the VERBOSE_PREFIX_3.  This is important.
- 	VERBOSE_PREFIX_1 through VERBOSE_PREFIX_3 are defined.
+ *	\brief This works like ast_log, but prints verbose messages to the console depending on verbosity level set.
+ *	ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing");
+ *	This will print the message to the console if the verbose level is set to a level >= 3
+ *	Note the absence of a comma after the VERBOSE_PREFIX_3.  This is important.
+ *	VERBOSE_PREFIX_1 through VERBOSE_PREFIX_4 are defined.
+ *  \version 11 added level parameter
  */
-void __attribute__((format(printf, 4, 5))) __ast_verbose(const char *file, int line, const char *func, const char *fmt, ...);
+void __attribute__((format(printf, 5, 6))) __ast_verbose(const char *file, int line, const char *func, int level, const char *fmt, ...);
 
-#define ast_verbose(...) __ast_verbose(__FILE__, __LINE__, __PRETTY_FUNCTION__,  __VA_ARGS__)
+#define ast_verbose(...) __ast_verbose(__FILE__, __LINE__, __PRETTY_FUNCTION__, -1, __VA_ARGS__)
 
-void __attribute__((format(printf, 4, 0))) __ast_verbose_ap(const char *file, int line, const char *func, const char *fmt, va_list ap);
+void __attribute__((format(printf, 5, 0))) __ast_verbose_ap(const char *file, int line, const char *func, int level, const char *fmt, va_list ap);
 
-#define ast_verbose_ap(fmt, ap)	__ast_verbose_ap(__FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ap)
+#define ast_verbose_ap(fmt, ap)	__ast_verbose_ap(__FILE__, __LINE__, __PRETTY_FUNCTION__, -1, fmt, ap)
 
 void __attribute__((format(printf, 2, 3))) ast_child_verbose(int level, const char *fmt, ...);
 
@@ -240,20 +241,7 @@ void ast_logger_unregister_level(const char *name);
 
 #define VERBOSITY_ATLEAST(level) (option_verbose >= (level) || (ast_opt_verb_module && ast_verbose_get_by_module(AST_MODULE) >= (level)))
 
-#define ast_verb(level, ...) do { \
-	if (VERBOSITY_ATLEAST((level)) ) { \
-		if (level >= 4) \
-			ast_verbose(VERBOSE_PREFIX_4 __VA_ARGS__); \
-		else if (level == 3) \
-			ast_verbose(VERBOSE_PREFIX_3 __VA_ARGS__); \
-		else if (level == 2) \
-			ast_verbose(VERBOSE_PREFIX_2 __VA_ARGS__); \
-		else if (level == 1) \
-			ast_verbose(VERBOSE_PREFIX_1 __VA_ARGS__); \
-		else \
-			ast_verbose(__VA_ARGS__); \
-	} \
-} while (0)
+#define ast_verb(level, ...) __ast_verbose(__FILE__, __LINE__, __PRETTY_FUNCTION__, level, __VA_ARGS__)
 
 #ifndef _LOGGER_BACKTRACE_H
 #define _LOGGER_BACKTRACE_H
diff --git a/main/asterisk.c b/main/asterisk.c
index 16f3efa0e9..acddc96d97 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -1749,11 +1749,6 @@ static const char *fix_header(char *outbuf, int maxout, const char *s, char *cmp
 {
 	const char *c;
 
-	/* Check for verboser preamble */
-	if (*s == 127) {
-		s++;
-	}
-
 	if (!strncmp(s, cmp, strlen(cmp))) {
 		c = s + strlen(cmp);
 		term_color(outbuf, cmp, COLOR_GRAY, 0, maxout);
@@ -1762,10 +1757,25 @@ static const char *fix_header(char *outbuf, int maxout, const char *s, char *cmp
 	return NULL;
 }
 
+/* These gymnastics are due to platforms which designate char as unsigned by
+ * default. Level is the negative character -- offset by 1, because \0 is the
+ * EOS delimiter. */
+#define VERBOSE_MAGIC2LEVEL(x) (((char) -*(signed char *) (x)) - 1)
+#define VERBOSE_HASMAGIC(x)	(*(signed char *) (x) < 0)
+
 static void console_verboser(const char *s)
 {
 	char tmp[80];
 	const char *c = NULL;
+	char level = 0;
+
+	if (VERBOSE_HASMAGIC(s)) {
+		level = VERBOSE_MAGIC2LEVEL(s);
+		s++;
+		if (level > option_verbose) {
+			return;
+		}
+	}
 
 	if ((c = fix_header(tmp, sizeof(tmp), s, VERBOSE_PREFIX_4)) ||
 	    (c = fix_header(tmp, sizeof(tmp), s, VERBOSE_PREFIX_3)) ||
@@ -1774,17 +1784,15 @@ static void console_verboser(const char *s)
 		fputs(tmp, stdout);
 		fputs(c, stdout);
 	} else {
-		if (*s == 127) {
-			s++;
-		}
 		fputs(s, stdout);
 	}
 
 	fflush(stdout);
-	
+
 	/* Wake up a poll()ing console */
-	if (ast_opt_console && consolethread != AST_PTHREADT_NULL)
+	if (ast_opt_console && consolethread != AST_PTHREADT_NULL) {
 		pthread_kill(consolethread, SIGURG);
+	}
 }
 
 static int ast_all_zeros(char *s)
@@ -1829,8 +1837,26 @@ static int remoteconsolehandler(char *s)
 		else
 			ast_safe_system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh");
 		ret = 1;
-	}
-	if ((strncasecmp(s, "quit", 4) == 0 || strncasecmp(s, "exit", 4) == 0) &&
+	} else if (strncasecmp(s, "remote set verbose ", 19) == 0) {
+		if (strncasecmp(s + 19, "atleast ", 8) == 0) {
+			int tmp;
+			if (sscanf(s + 27, "%d", &tmp) != 1) {
+				fprintf(stderr, "Usage: remote set verbose [atleast] <level>\n");
+			} else {
+				if (tmp > option_verbose) {
+					option_verbose = tmp;
+				}
+				fprintf(stdout, "Set remote console verbosity to %d\n", option_verbose);
+			}
+		} else {
+			if (sscanf(s + 19, "%d", &option_verbose) != 1) {
+				fprintf(stderr, "Usage: remote set verbose [atleast] <level>\n");
+			} else {
+				fprintf(stdout, "Set remote console verbosity to %d\n", option_verbose);
+			}
+		}
+		ret = 1;
+	} else if ((strncasecmp(s, "quit", 4) == 0 || strncasecmp(s, "exit", 4) == 0) &&
 	    (s[4] == '\0' || isspace(s[4]))) {
 		quit_handler(0, 0, 0, 0);
 		ret = 1;
@@ -2133,6 +2159,23 @@ static struct ast_cli_entry cli_asterisk[] = {
 #endif /* ! LOW_MEMORY */
 };
 
+struct el_read_char_state_struct {
+	unsigned int line_full:1;
+	unsigned int prev_line_full:1;
+	char prev_line_verbosity;
+};
+
+static int el_read_char_state_init(void *ptr)
+{
+	struct el_read_char_state_struct *state = ptr;
+	state->line_full = 1;
+	state->prev_line_full = 1;
+	state->prev_line_verbosity = 0;
+	return 0;
+}
+
+AST_THREADSTORAGE_CUSTOM(el_read_char_state, el_read_char_state_init, ast_free_ptr);
+
 static int ast_el_read_char(EditLine *editline, char *cp)
 {
 	int num_read = 0;
@@ -2142,6 +2185,7 @@ static int ast_el_read_char(EditLine *editline, char *cp)
 	int max;
 #define EL_BUF_SIZE 512
 	char buf[EL_BUF_SIZE];
+	struct el_read_char_state_struct *state = ast_threadstorage_get(&el_read_char_state, sizeof(*state));
 
 	for (;;) {
 		max = 1;
@@ -2166,11 +2210,13 @@ static int ast_el_read_char(EditLine *editline, char *cp)
 			num_read = read(STDIN_FILENO, cp, 1);
 			if (num_read < 1) {
 				break;
-			} else 
+			} else {
 				return (num_read);
+			}
 		}
 		if (fds[0].revents) {
-			char *tmp;
+			char level = 0;
+			char *curline = buf, *nextline;
 			res = read(ast_consock, buf, sizeof(buf) - 1);
 			/* if the remote side disappears exit */
 			if (res < 1) {
@@ -2203,22 +2249,35 @@ static int ast_el_read_char(EditLine *editline, char *cp)
 
 			buf[res] = '\0';
 
-			/* Strip preamble from asynchronous events, too */
-			for (tmp = buf; *tmp; tmp++) {
-				if (*tmp == 127) {
-					memmove(tmp, tmp + 1, strlen(tmp));
-					tmp--;
-					res--;
-				}
-			}
-
 			/* Write over the CLI prompt */
 			if (!ast_opt_exec && !lastpos) {
 				if (write(STDOUT_FILENO, "\r", 5) < 0) {
 				}
 			}
-			if (write(STDOUT_FILENO, buf, res) < 0) {
-			}
+
+			do {
+				state->prev_line_full = state->line_full;
+				if ((nextline = strchr(curline, '\n'))) {
+					state->line_full = 1;
+					nextline++;
+				} else {
+					state->line_full = 0;
+					nextline = strchr(curline, '\0');
+				}
+
+				if (state->prev_line_full && VERBOSE_HASMAGIC(curline)) {
+					level = VERBOSE_MAGIC2LEVEL(curline);
+					curline++;
+				}
+				if ((!state->prev_line_full && state->prev_line_verbosity <= option_verbose) || (state->prev_line_full && level <= option_verbose)) {
+					if (write(STDOUT_FILENO, curline, nextline - curline) < 0) {
+					}
+				}
+
+				state->prev_line_verbosity = level;
+				curline = nextline;
+			} while (!ast_strlen_zero(curline));
+
 			if ((res < EL_BUF_SIZE - 1) && ((buf[res-1] == '\n') || (buf[res-2] == '\n'))) {
 				*cp = CC_REFRESH;
 				return(1);
@@ -2729,22 +2788,20 @@ static void ast_remotecontrol(char *data)
 	else
 		pid = -1;
 	if (!data) {
-		char tmp[80];
-		snprintf(tmp, sizeof(tmp), "core set verbose atleast %d", option_verbose);
-		fdsend(ast_consock, tmp);
-		snprintf(tmp, sizeof(tmp), "core set debug atleast %d", option_debug);
-		fdsend(ast_consock, tmp);
-		if (!ast_opt_mute)
+		if (!ast_opt_mute) {
 			fdsend(ast_consock, "logger mute silent");
-		else 
+		} else {
 			printf("log and verbose output currently muted ('logger mute' to unmute)\n");
+		}
 	}
 
 	if (ast_opt_exec && data) {  /* hack to print output then exit if asterisk -rx is used */
+		int linefull = 1, prev_linefull = 1, prev_line_verbose = 0;
 		struct pollfd fds;
 		fds.fd = ast_consock;
 		fds.events = POLLIN;
 		fds.revents = 0;
+
 		while (ast_poll(&fds, 1, 60000) > 0) {
 			char buffer[512] = "", *curline = buffer, *nextline;
 			int not_written = 1;
@@ -2758,18 +2815,34 @@ static void ast_remotecontrol(char *data)
 			}
 
 			do {
+				prev_linefull = linefull;
 				if ((nextline = strchr(curline, '\n'))) {
+					linefull = 1;
 					nextline++;
 				} else {
+					linefull = 0;
 					nextline = strchr(curline, '\0');
 				}
 
 				/* Skip verbose lines */
-				if (*curline != 127) {
+				/* Prev line full? | Line is verbose | Last line verbose? | Print
+				 * TRUE            | TRUE*           | TRUE               | FALSE
+				 * TRUE            | TRUE*           | FALSE              | FALSE
+				 * TRUE            | FALSE*          | TRUE               | TRUE
+				 * TRUE            | FALSE*          | FALSE              | TRUE
+				 * FALSE           | TRUE            | TRUE*              | FALSE
+				 * FALSE           | TRUE            | FALSE*             | TRUE
+				 * FALSE           | FALSE           | TRUE*              | FALSE
+				 * FALSE           | FALSE           | FALSE*             | TRUE
+				 */
+				if ((!prev_linefull && !prev_line_verbose) || (prev_linefull && *curline > 0)) {
+					prev_line_verbose = 0;
 					not_written = 0;
 					if (write(STDOUT_FILENO, curline, nextline - curline) < 0) {
 						ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
 					}
+				} else {
+					prev_line_verbose = 1;
 				}
 				curline = nextline;
 			} while (!ast_strlen_zero(curline));
@@ -2808,14 +2881,6 @@ static void ast_remotecontrol(char *data)
 			if (ebuf[strlen(ebuf)-1] == '\n')
 				ebuf[strlen(ebuf)-1] = '\0';
 			if (!remoteconsolehandler(ebuf)) {
-				/* Strip preamble from output */
-				char *temp;
-				for (temp = ebuf; *temp; temp++) {
-					if (*temp == 127) {
-						memmove(temp, temp + 1, strlen(temp));
-						temp--;
-					}
-				}
 				res = write(ast_consock, ebuf, strlen(ebuf) + 1);
 				if (res < 1) {
 					ast_log(LOG_WARNING, "Unable to write: %s\n", strerror(errno));
diff --git a/main/bridging.c b/main/bridging.c
index 503e865097..5ae8617850 100644
--- a/main/bridging.c
+++ b/main/bridging.c
@@ -87,9 +87,7 @@ int __ast_bridge_technology_register(struct ast_bridge_technology *technology, s
 
 	AST_RWLIST_UNLOCK(&bridge_technologies);
 
-	if (option_verbose > 1) {
-		ast_verbose(VERBOSE_PREFIX_2 "Registered bridge technology %s\n", technology->name);
-	}
+	ast_verb(2, "Registered bridge technology %s\n", technology->name);
 
 	return 0;
 }
@@ -104,9 +102,7 @@ int ast_bridge_technology_unregister(struct ast_bridge_technology *technology)
 	AST_RWLIST_TRAVERSE_SAFE_BEGIN(&bridge_technologies, current, entry) {
 		if (current == technology) {
 			AST_RWLIST_REMOVE_CURRENT(entry);
-			if (option_verbose > 1) {
-				ast_verbose(VERBOSE_PREFIX_2 "Unregistered bridge technology %s\n", technology->name);
-			}
+			ast_verb(2, "Unregistered bridge technology %s\n", technology->name);
 			break;
 		}
 	}
diff --git a/main/cli.c b/main/cli.c
index c35b941d10..9c66b67677 100644
--- a/main/cli.c
+++ b/main/cli.c
@@ -382,6 +382,20 @@ static char *complete_number(const char *partial, unsigned int min, unsigned int
 	return NULL;
 }
 
+static char *handle_localverbose(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+	switch (cmd) {
+	case CLI_INIT:
+		e->command = "remote set verbose";
+		e->usage = "Usage: remote set verbose <level>\n";
+		return NULL;
+	case CLI_GENERATE:
+		return NULL;
+	}
+	ast_cli(a->fd, "This is the main console.  Use 'core set verbose' instead.\n");
+	return CLI_FAILURE;
+}
+
 static char *handle_verbose(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
 	int oldval;
@@ -1668,6 +1682,8 @@ static struct ast_cli_entry cli_cli[] = {
 
 	AST_CLI_DEFINE(handle_showchan, "Display information on a specific channel"),
 
+	AST_CLI_DEFINE(handle_localverbose, "Set level of remote console verbosity"),
+
 	AST_CLI_DEFINE(handle_core_set_debug_channel, "Enable/disable debugging on a channel"),
 
 	AST_CLI_DEFINE(handle_verbose, "Set level of debug/verbose chattiness"),
diff --git a/main/dial.c b/main/dial.c
index 6faf8f5d52..420ce19953 100644
--- a/main/dial.c
+++ b/main/dial.c
@@ -432,8 +432,7 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel
 			ast_indicate(chan, AST_CONTROL_VIDUPDATE);
 			break;
 		case AST_CONTROL_SRCUPDATE:
-			if (option_verbose > 2)
-				ast_verbose (VERBOSE_PREFIX_3 "%s requested a source update, passing it to %s\n", channel->owner->name, chan->name);
+			ast_verb(3, "%s requested a source update, passing it to %s\n", channel->owner->name, chan->name);
 			ast_indicate(chan, AST_CONTROL_SRCUPDATE);
 			break;
 		case AST_CONTROL_CONNECTED_LINE:
diff --git a/main/logger.c b/main/logger.c
index 6fc36df00d..74b7dd1901 100644
--- a/main/logger.c
+++ b/main/logger.c
@@ -101,6 +101,8 @@ struct logchannel {
 	int disabled;
 	/*! syslog facility */
 	int facility;
+	/*! Verbosity level */
+	int verbosity;
 	/*! Type of log channel */
 	enum logtypes type;
 	/*! logfile logging file pointer */
@@ -209,19 +211,24 @@ AST_THREADSTORAGE(log_buf);
 
 static void logger_queue_init(void);
 
-static unsigned int make_components(const char *s, int lineno)
+static unsigned int make_components(const char *s, int lineno, int *verbosity)
 {
 	char *w;
 	unsigned int res = 0;
 	char *stringp = ast_strdupa(s);
 	unsigned int x;
 
+	*verbosity = 3;
+
 	while ((w = strsep(&stringp, ","))) {
 		w = ast_skip_blanks(w);
 
 		if (!strcmp(w, "*")) {
 			res = 0xFFFFFFFF;
 			break;
+		} else if (!strncasecmp(w, "verbose(", 8) && sscanf(w + 8, "%d)", verbosity) == 1) {
+			res |= (1 << __LOG_VERBOSE);
+			break;
 		} else for (x = 0; x < ARRAY_LEN(levels); x++) {
 			if (levels[x] && !strcasecmp(w, levels[x])) {
 				res |= (1 << x);
@@ -300,7 +307,7 @@ static struct logchannel *make_logchannel(const char *channel, const char *compo
 		}
 		chan->type = LOGTYPE_FILE;
 	}
-	chan->logmask = make_components(chan->components, lineno);
+	chan->logmask = make_components(chan->components, lineno, &chan->verbosity);
 
 	return chan;
 }
@@ -434,11 +441,6 @@ void ast_child_verbose(int level, const char *fmt, ...)
 	va_list ap, aq;
 	int size;
 
-	/* Don't bother, if the level isn't that high */
-	if (option_verbose < level) {
-		return;
-	}
-
 	va_start(ap, fmt);
 	va_copy(aq, ap);
 	if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) {
@@ -968,15 +970,23 @@ static void ast_log_vsyslog(struct logmsg *msg)
 	syslog(syslog_level, "%s", buf);
 }
 
+/* These gymnastics are due to platforms which designate char as unsigned by
+ * default. Level is the negative character -- offset by 1, because \0 is the
+ * EOS delimiter. */
+#define VERBOSE_MAGIC2LEVEL(x) (((char) -*(signed char *) (x)) - 1)
+#define VERBOSE_HASMAGIC(x)	(*(signed char *) (x) < 0)
+
 /*! \brief Print a normal log message to the channels */
 static void logger_print_normal(struct logmsg *logmsg)
 {
 	struct logchannel *chan = NULL;
 	char buf[BUFSIZ];
 	struct verb *v = NULL;
+	int level = 0;
 
 	if (logmsg->level == __LOG_VERBOSE) {
 		char *tmpmsg = ast_strdupa(logmsg->message + 1);
+		level = VERBOSE_MAGIC2LEVEL(logmsg->message);
 		/* Iterate through the list of verbosers and pass them the log message string */
 		AST_RWLIST_RDLOCK(&verbosers);
 		AST_RWLIST_TRAVERSE(&verbosers, v, list)
@@ -990,8 +1000,13 @@ static void logger_print_normal(struct logmsg *logmsg)
 	if (!AST_RWLIST_EMPTY(&logchannels)) {
 		AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
 			/* If the channel is disabled, then move on to the next one */
-			if (chan->disabled)
+			if (chan->disabled) {
+				continue;
+			}
+			if (logmsg->level == __LOG_VERBOSE && level > chan->verbosity) {
 				continue;
+			}
+
 			/* Check syslog channels */
 			if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) {
 				ast_log_vsyslog(logmsg);
@@ -1219,20 +1234,11 @@ void ast_log(int level, const char *file, int line, const char *function, const
 		}
 		return;
 	}
-	
-	/* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug
-	   are non-zero; LOG_DEBUG messages can still be displayed if option_debug
-	   is zero, if option_verbose is non-zero (this allows for 'level zero'
-	   LOG_DEBUG messages to be displayed, if the logmask on any channel
-	   allows it)
-	*/
-	if (!option_verbose && !option_debug && (level == __LOG_DEBUG))
-		return;
 
 	/* Ignore anything that never gets logged anywhere */
 	if (level != __LOG_VERBOSE && !(global_logmask & (1 << level)))
 		return;
-	
+
 	/* Build string */
 	va_start(ap, fmt);
 	res = ast_str_set_va(&buf, BUFSIZ, fmt, ap);
@@ -1492,13 +1498,31 @@ void ast_backtrace(void)
 #endif /* defined(HAVE_BKTR) */
 }
 
-void __ast_verbose_ap(const char *file, int line, const char *func, const char *fmt, va_list ap)
+void __ast_verbose_ap(const char *file, int line, const char *func, int level, const char *fmt, va_list ap)
 {
 	struct ast_str *buf = NULL;
 	int res = 0;
+	const char *prefix = level >= 4 ? VERBOSE_PREFIX_4 : level == 3 ? VERBOSE_PREFIX_3 : level == 2 ? VERBOSE_PREFIX_2 : level == 1 ? VERBOSE_PREFIX_1 : "";
+	signed char magic = level > 127 ? -128 : -level - 1; /* 0 => -1, 1 => -2, etc.  Can't pass NUL, as it is EOS-delimiter */
+
+	/* For compatibility with modules still calling ast_verbose() directly instead of using ast_verb() */
+	if (level < 0) {
+		if (!strncmp(fmt, VERBOSE_PREFIX_4, strlen(VERBOSE_PREFIX_4))) {
+			magic = -5;
+		} else if (!strncmp(fmt, VERBOSE_PREFIX_3, strlen(VERBOSE_PREFIX_3))) {
+			magic = -4;
+		} else if (!strncmp(fmt, VERBOSE_PREFIX_2, strlen(VERBOSE_PREFIX_2))) {
+			magic = -3;
+		} else if (!strncmp(fmt, VERBOSE_PREFIX_1, strlen(VERBOSE_PREFIX_1))) {
+			magic = -2;
+		} else {
+			magic = -1;
+		}
+	}
 
-	if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE)))
+	if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE))) {
 		return;
+	}
 
 	if (ast_opt_timestamp) {
 		struct timeval now;
@@ -1509,12 +1533,12 @@ void __ast_verbose_ap(const char *file, int line, const char *func, const char *
 		now = ast_tvnow();
 		ast_localtime(&now, &tm, NULL);
 		ast_strftime(date, sizeof(date), dateformat, &tm);
-		datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1);
-		sprintf(datefmt, "%c[%s] %s", 127, date, fmt);
+		datefmt = alloca(strlen(date) + 3 + strlen(prefix) + strlen(fmt) + 1);
+		sprintf(datefmt, "%c[%s] %s%s", (char) magic, date, prefix, fmt);
 		fmt = datefmt;
 	} else {
-		char *tmp = alloca(strlen(fmt) + 2);
-		sprintf(tmp, "%c%s", 127, fmt);
+		char *tmp = alloca(strlen(prefix) + strlen(fmt) + 2);
+		sprintf(tmp, "%c%s%s", (char) magic, prefix, fmt);
 		fmt = tmp;
 	}
 
@@ -1522,18 +1546,19 @@ void __ast_verbose_ap(const char *file, int line, const char *func, const char *
 	res = ast_str_set_va(&buf, 0, fmt, ap);
 
 	/* If the build failed then we can drop this allocated message */
-	if (res == AST_DYNSTR_BUILD_FAILED)
+	if (res == AST_DYNSTR_BUILD_FAILED) {
 		return;
+	}
 
 	ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf));
 }
 
-void __ast_verbose(const char *file, int line, const char *func, const char *fmt, ...)
+void __ast_verbose(const char *file, int line, const char *func, int level, const char *fmt, ...)
 {
 	va_list ap;
 
 	va_start(ap, fmt);
-	__ast_verbose_ap(file, line, func, fmt, ap);
+	__ast_verbose_ap(file, line, func, level, fmt, ap);
 	va_end(ap);
 }
 
@@ -1545,7 +1570,7 @@ void ast_verbose(const char *fmt, ...)
 	va_list ap;
 
 	va_start(ap, fmt);
-	__ast_verbose_ap("", 0, "", fmt, ap);
+	__ast_verbose_ap("", 0, "", 0, fmt, ap);
 	va_end(ap);
 }
 
@@ -1592,7 +1617,7 @@ static void update_logchannels(void)
 	global_logmask = 0;
 
 	AST_RWLIST_TRAVERSE(&logchannels, cur, list) {
-		cur->logmask = make_components(cur->components, cur->lineno);
+		cur->logmask = make_components(cur->components, cur->lineno, &cur->verbosity);
 		global_logmask |= cur->logmask;
 	}
 
diff --git a/main/say.c b/main/say.c
index e242b655d0..4c04b79570 100644
--- a/main/say.c
+++ b/main/say.c
@@ -1233,7 +1233,7 @@ static int ast_say_number_full_he(struct ast_channel *chan, int num, const char
 
 	char fn[SAY_NUM_BUF_SIZE] = "";
 
-	ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: started. num: %d, options=\"%s\"\n", num, options);
+	ast_verb(3, "ast_say_digits_full: started. num: %d, options=\"%s\"\n", num, options);
 
 	if (!num) {
 		return ast_say_digits_full(chan, 0, ints, language, audiofd, ctrlfd);
@@ -1241,7 +1241,7 @@ static int ast_say_number_full_he(struct ast_channel *chan, int num, const char
 	if (options && !strncasecmp(options, "m", 1)) {
 		mf = 1;
 	}
-	ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: num: %d, state=%d, options=\"%s\", mf=%d\n", num, state, options, mf);
+	ast_verb(3, "ast_say_digits_full: num: %d, state=%d, options=\"%s\", mf=%d\n", num, state, options, mf);
 
 	/* Do we have work to do? */
 	while (!res && (num || (state > 0))) {
@@ -1252,7 +1252,7 @@ static int ast_say_number_full_he(struct ast_channel *chan, int num, const char
 		 * state==0 is the normal mode and it means that we continue
 		 * to check if the number num has yet anything left.
 		 */
-		ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: num: %d, state=%d, options=\"%s\", mf=%d, tmpnum=%d\n", num, state, options, mf, tmpnum);
+		ast_verb(3, "ast_say_digits_full: num: %d, state=%d, options=\"%s\", mf=%d, tmpnum=%d\n", num, state, options, mf, tmpnum);
 
 		if (state == 1) {
 			state = 0;
@@ -3200,13 +3200,13 @@ static int ast_say_enumeration_full_he(struct ast_channel *chan, int num, const
 	int res = 0;
 	char fn[256] = "";
 	int mf = -1;				/* +1 = Masculin; -1 = Feminin */
-	ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: started. num: %d, options=\"%s\"\n", num, options);
+	ast_verb(3, "ast_say_digits_full: started. num: %d, options=\"%s\"\n", num, options);
 
 	if (options && !strncasecmp(options, "m", 1)) {
 		mf = -1;
 	}
 
-	ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: num: %d, options=\"%s\", mf=%d\n", num, options, mf);
+	ast_verb(3, "ast_say_digits_full: num: %d, options=\"%s\", mf=%d\n", num, options, mf);
 
 	while (!res && num) {
 		if (num < 0) {
diff --git a/res/res_clialiases.c b/res/res_clialiases.c
index d67f3ba39b..123fe5adcd 100644
--- a/res/res_clialiases.c
+++ b/res/res_clialiases.c
@@ -211,7 +211,7 @@ static void load_config(int reload)
 
 			ast_cli_register(&alias->cli_entry);
 			ao2_link(cli_aliases, alias);
-			ast_verbose(VERBOSE_PREFIX_2 "Aliased CLI command '%s' to '%s'\n", v1->name, v1->value);
+			ast_verb(2, "Aliased CLI command '%s' to '%s'\n", v1->name, v1->value);
 			ao2_ref(alias, -1);
 		}
 	}
diff --git a/res/res_fax.c b/res/res_fax.c
index 3b1abd2fb4..bb263283cf 100644
--- a/res/res_fax.c
+++ b/res/res_fax.c
@@ -3322,7 +3322,7 @@ static struct ast_frame *fax_detect_framehook(struct ast_channel *chan, struct a
 			if (ast_exists_extension(chan, target_context, "fax", 1,
 			    S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL))) {
 				ast_channel_lock(chan);
-				ast_verbose(VERBOSE_PREFIX_2 "Redirecting '%s' to fax extension due to %s detection\n",
+				ast_verb(2, "Redirecting '%s' to fax extension due to %s detection\n",
 					chan->name, (result == 'f') ? "CNG" : "T38");
 				pbx_builtin_setvar_helper(chan, "FAXEXTEN", chan->exten);
 				if (ast_async_goto(chan, target_context, "fax", 1)) {
diff --git a/res/res_jabber.c b/res/res_jabber.c
index 870508d032..f1e9c740c4 100644
--- a/res/res_jabber.c
+++ b/res/res_jabber.c
@@ -2615,9 +2615,7 @@ static void aji_handle_subscribe(struct aji_client *client, ikspak *pak)
 			ASTOBJ_UNREF(buddy, ast_aji_buddy_destroy);
 		}
 	default:
-		if (option_verbose > 4) {
-			ast_verbose(VERBOSE_PREFIX_3 "JABBER: This is a subcription of type %i\n", pak->subtype);
-		}
+		ast_verb(5, "JABBER: This is a subcription of type %i\n", pak->subtype);
 	}
 }
 
diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c
index d5f9e2c6fa..ffe051eaa1 100644
--- a/res/res_musiconhold.c
+++ b/res/res_musiconhold.c
@@ -268,9 +268,7 @@ static void moh_files_release(struct ast_channel *chan, void *data)
 		chan->stream = NULL;
 	}
 	
-	if (option_verbose > 2) {
-		ast_verbose(VERBOSE_PREFIX_3 "Stopped music on hold on %s\n", chan->name);
-	}
+	ast_verb(3, "Stopped music on hold on %s\n", chan->name);
 
 	ast_format_clear(&state->mohwfmt); /* make sure to clear this format before restoring the original format. */
 	if (state->origwfmt.id && ast_set_write_format(chan, &state->origwfmt)) {
@@ -1154,10 +1152,8 @@ static int init_files_class(struct mohclass *class)
 	}
 
 	if (!res) {
-		if (option_verbose > 2) {
-			ast_verbose(VERBOSE_PREFIX_3 "Files not found in %s for moh class:%s\n",
-					class->dir, class->name);
-		}
+		ast_verb(3, "Files not found in %s for moh class:%s\n",
+			class->dir, class->name);
 		return -1;
 	}
 
-- 
GitLab