Index: ipc.c
===================================================================
--- ipc.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ ipc.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -356,5 +356,5 @@
 			irc_switch_fd( irc, ipc_child_recv_fd );
 			irc_sync( irc );
-			irc_usermsg( irc, "You've successfully taken over your old session" );
+			irc_rootmsg( irc, "You've successfully taken over your old session" );
 			ipc_child_recv_fd = -1;
 			
@@ -374,5 +374,5 @@
 	{
 		/* Master->New connection */
-		irc_usermsg( irc, "Could not take over old session" );
+		irc_rootmsg( irc, "Could not take over old session" );
 	}
 }
@@ -412,5 +412,5 @@
 	/* Drop credentials, we'll shut down soon and shouldn't overwrite
 	   any settings. */
-	irc_usermsg( irc, "Trying to take over existing session" );
+	irc_rootmsg( irc, "Trying to take over existing session" );
 	
 	irc_desync( irc );
Index: irc.c
===================================================================
--- irc.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ irc.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -363,5 +363,5 @@
 					if( irc->status & USTATUS_LOGGED_IN )
 					{
-						irc_usermsg( irc, "Error: Charset mismatch detected. The charset "
+						irc_rootmsg( irc, "Error: Charset mismatch detected. The charset "
 						                  "setting is currently set to %s, so please make "
 						                  "sure your IRC client will send and accept text in "
@@ -767,5 +767,5 @@
 			irc->root->last_channel = irc->default_channel;
 			
-			irc_usermsg( irc,
+			irc_rootmsg( irc,
 			             "Welcome to the BitlBee gateway!\n\n"
 			             "If you've never used BitlBee before, please do read the help "
@@ -910,5 +910,5 @@
 		g_free( test );
 		g_iconv_close( oc );
-		irc_usermsg( irc, "Unsupported character set: The IRC protocol "
+		irc_rootmsg( irc, "Unsupported character set: The IRC protocol "
 		                  "only supports 8-bit character sets." );
 		return NULL;
@@ -941,5 +941,5 @@
 	GSList *l;
 	
-	irc_usermsg( irc, "Setting `%s' is obsolete, use the `show_users' "
+	irc_rootmsg( irc, "Setting `%s' is obsolete, use the `show_users' "
 	             "channel setting instead.", set->key );
 	
Index: irc.h
===================================================================
--- irc.h	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ irc.h	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -317,5 +317,8 @@
 void irc_send_login( irc_t *irc );
 void irc_send_motd( irc_t *irc );
-void irc_usermsg( irc_t *irc, char *format, ... );
+const char *irc_user_msgdest( irc_user_t *iu );
+void irc_rootmsg( irc_t *irc, char *format, ... );
+void irc_usermsg( irc_user_t *iu, char *format, ... );
+void irc_usernotice( irc_user_t *iu, char *format, ... );
 void irc_send_join( irc_channel_t *ic, irc_user_t *iu );
 void irc_send_part( irc_channel_t *ic, irc_user_t *iu, const char *reason );
@@ -350,5 +353,4 @@
 void bee_irc_channel_update( irc_t *irc, irc_channel_t *ic, irc_user_t *iu );
 void bee_irc_user_nick_reset( irc_user_t *iu );
-void bee_irc_msg_from_user( irc_user_t *iu, const char *msg, time_t sent_at );
 
 #endif
Index: irc_commands.c
===================================================================
--- irc_commands.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ irc_commands.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -92,5 +92,5 @@
 			irc->status &= ~USTATUS_IDENTIFIED;
 			irc_umode_set( irc, "-R", 1 );
-			irc_usermsg( irc, "Changing nicks resets your identify status. "
+			irc_rootmsg( irc, "Changing nicks resets your identify status. "
 			             "Re-identify or register a new account if you want "
 			             "your configuration to be saved. See \x02help "
@@ -433,5 +433,5 @@
 			{
 				set_setstr( &a->set, "password", password );
-				irc_usermsg( irc, "Password added to IM account "
+				irc_rootmsg( irc, "Password added to IM account "
 				             "%s(%s)", a->prpl->name, a->user );
 				/* The IRC client may expect this. 491 suggests the OPER
Index: irc_im.c
===================================================================
--- irc_im.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ irc_im.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -193,10 +193,10 @@
 }
 
-void bee_irc_msg_from_user( irc_user_t *iu, const char *msg, time_t sent_at )
-{
-    irc_t *irc = iu->irc;
+static void bee_irc_msg_from_user( irc_user_t *iu, const char *msg, time_t sent_at )
+{
+	irc_t *irc = iu->irc;
 	bee_t *bee = irc->b;
-	irc_channel_t *ic = NULL;
-	char *dst, *prefix = NULL;
+	const char *dst;
+	char *prefix = NULL;
 	char *wrapped, *ts = NULL;
 
@@ -204,25 +204,13 @@
 		ts = irc_format_timestamp( irc, sent_at );
 	
-	/* Too similar to irc_usermsg()... */
-	if( iu->last_channel )
-	{
-		if( iu->last_channel->flags & IRC_CHANNEL_JOINED )
-			ic = iu->last_channel;
-		else
-			ic = irc_channel_with_user( irc, iu );
-	}
-	
-	if( ic )
-	{
-		dst = ic->name;
+	dst = irc_user_msgdest(iu);
+	if(dst != irc->user->nick) {
+		/* if not messaging directly, call user by name */
 		prefix = g_strdup_printf( "%s%s%s", irc->user->nick, set_getstr( &bee->set, "to_char" ), ts ? : "" );
-	}
-	else
-	{
-		dst = irc->user->nick;
+	} else {
 		prefix = ts;
-		ts = NULL;
-	}
-	
+		ts = NULL;      /* don't doulbe-free */
+	}
+
 	wrapped = word_wrap( msg, 425 );
 	irc_send_msg( iu, "PRIVMSG", dst, wrapped, prefix );
@@ -1000,5 +988,5 @@
 	else if( !acc->prpl->chat_join )
 	{
-		irc_usermsg( ic->irc, "Named chatrooms not supported on that account." );
+		irc_rootmsg( ic->irc, "Named chatrooms not supported on that account." );
 		return SET_INVALID;
 	}
Index: irc_send.c
===================================================================
--- irc_send.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ irc_send.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -110,17 +110,9 @@
 }
 
-void irc_usermsg( irc_t *irc, char *format, ... )
-{
+const char *irc_user_msgdest( irc_user_t *iu )
+{
+	irc_t *irc = iu->irc;
 	irc_channel_t *ic = NULL;
-	irc_user_t *iu = irc->root;
-	char text[2048];
-	va_list params;
-	char *dst;
-	
-	va_start( params, format );
-	g_vsnprintf( text, sizeof( text ), format, params );
-	va_end( params );
-	
-	/* Too similar to bee_irc_user_msg()... */
+
 	if( iu->last_channel )
 	{
@@ -128,13 +120,47 @@
 			ic = iu->last_channel;
 		else
-			ic = irc_channel_with_user( irc, irc->root );
+			ic = irc_channel_with_user( irc, iu );
 	}
 	
 	if( ic )
-		dst = ic->name;
+		return ic->name;
 	else
-		dst = irc->user->nick;
-	
-	irc_send_msg( irc->root, "PRIVMSG", dst, text, NULL );
+		return irc->user->nick;
+}
+
+/* cmd = "PRIVMSG" or "NOTICE" */
+static void irc_usermsg_( const char *cmd, irc_user_t *iu, const char *format, va_list params )
+{
+	char text[2048];
+	const char *dst;
+	
+	g_vsnprintf( text, sizeof( text ), format, params );
+	
+	dst = irc_user_msgdest( iu );
+	irc_send_msg( iu, cmd, dst, text, NULL );
+}
+
+void irc_usermsg(irc_user_t *iu, char *format, ... )
+{
+	va_list params;
+	va_start( params, format );
+	irc_usermsg_( "PRIVMSG", iu, format, params );
+	va_end( params );
+}
+
+void irc_usernotice(irc_user_t *iu, char *format, ... )
+{
+	va_list params;
+	va_start( params, format );
+	irc_usermsg_( "NOTICE", iu, format, params );
+	va_end( params );
+}
+
+void irc_rootmsg( irc_t *irc, char *format, ... )
+{
+	va_list params;
+	va_start( params, format );
+	irc_usermsg_( "PRIVMSG", irc->root, format, params );
+	va_end( params );
 }
 
Index: nick.c
===================================================================
--- nick.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ nick.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -243,5 +243,5 @@
 			int i;
 			
-			irc_usermsg( irc, "Warning: Almost had an infinite loop in nick_get()! "
+			irc_rootmsg( irc, "Warning: Almost had an infinite loop in nick_get()! "
 			                  "This used to be a fatal BitlBee bug, but we tried to fix it. "
 			                  "This message should *never* appear anymore. "
@@ -249,9 +249,9 @@
 			                  "Please send all the following lines in your report:" );
 			
-			irc_usermsg( irc, "Trying to get a sane nick for handle %s", bu->handle );
+			irc_rootmsg( irc, "Trying to get a sane nick for handle %s", bu->handle );
 			for( i = 0; i < MAX_NICK_LENGTH; i ++ )
-				irc_usermsg( irc, "Char %d: %c/%d", i, nick[i], nick[i] );
-			
-			irc_usermsg( irc, "FAILED. Returning an insane nick now. Things might break. "
+				irc_rootmsg( irc, "Char %d: %c/%d", i, nick[i], nick[i] );
+			
+			irc_rootmsg( irc, "FAILED. Returning an insane nick now. Things might break. "
 			                  "Good luck, and please don't forget to paste the lines up here "
 			                  "in #bitlbee on OFTC or in a mail to wilmer@gaast.net" );
Index: otr.c
===================================================================
--- otr.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ otr.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -278,10 +278,10 @@
 	e = otrl_privkey_read(irc->otr->us, s);
 	if(e && e!=enoent) {
-		irc_usermsg(irc, "otr load: %s: %s", s, gcry_strerror(e));
+		irc_rootmsg(irc, "otr load: %s: %s", s, gcry_strerror(e));
 	}
 	g_snprintf(s, 511, "%s%s.otr_fprints", global.conf->configdir, irc->user->nick);
 	e = otrl_privkey_read_fingerprints(irc->otr->us, s, NULL, NULL);
 	if(e && e!=enoent) {
-		irc_usermsg(irc, "otr load: %s: %s", s, gcry_strerror(e));
+		irc_rootmsg(irc, "otr load: %s: %s", s, gcry_strerror(e));
 	}
 	
@@ -291,5 +291,5 @@
 	}
 	if(kg) {
-		irc_usermsg(irc, "Notice: "
+		irc_rootmsg(irc, "Notice: "
 			"The accounts above do not have OTR encryption keys associated with them, yet. "
 			"These keys are now being generated in the background. "
@@ -309,5 +309,5 @@
 	e = otrl_privkey_write_fingerprints(irc->otr->us, s);
 	if(e) {
-		irc_usermsg(irc, "otr save: %s: %s", s, gcry_strerror(e));
+		irc_rootmsg(irc, "otr save: %s: %s", s, gcry_strerror(e));
 	}
 	chmod(s, 0600);
@@ -348,11 +348,11 @@
 	k = otrl_privkey_find(irc->otr->us, a->user, a->prpl->name);
 	if(k) {
-		irc_usermsg(irc, "otr: %s/%s ready", a->user, a->prpl->name);
+		irc_rootmsg(irc, "otr: %s/%s ready", a->user, a->prpl->name);
 		return 0;
 	} if(keygen_in_progress(irc, a->user, a->prpl->name)) {
-		irc_usermsg(irc, "otr: keygen for %s/%s already in progress", a->user, a->prpl->name);
+		irc_rootmsg(irc, "otr: keygen for %s/%s already in progress", a->user, a->prpl->name);
 		return 0;
 	} else {
-		irc_usermsg(irc, "otr: starting background keygen for %s/%s", a->user, a->prpl->name);
+		irc_rootmsg(irc, "otr: starting background keygen for %s/%s", a->user, a->prpl->name);
 		otr_keygen(irc, a->user, a->prpl->name);
 		return 1;
@@ -521,5 +521,5 @@
 	
 	if(!cmd->command) {
-		irc_usermsg(irc, "%s: unknown subcommand \"%s\", see \x02help otr\x02",
+		irc_rootmsg(irc, "%s: unknown subcommand \"%s\", see \x02help otr\x02",
 			args[0], args[1]);
 		return;
@@ -527,5 +527,5 @@
 	
 	if(!args[cmd->required_parameters+1]) {
-		irc_usermsg(irc, "%s %s: not enough arguments (%d req.)",
+		irc_rootmsg(irc, "%s %s: not enough arguments (%d req.)",
 			args[0], args[1], cmd->required_parameters);
 		return;
@@ -599,5 +599,5 @@
 	if (strcmp(accountname, recipient) == 0) {
 		/* huh? injecting messages to myself? */
-		irc_usermsg(irc, "note to self: %s", message);
+		irc_rootmsg(irc, "note to self: %s", message);
 	} else {
 		/* need to drop some consts here :-( */
@@ -618,8 +618,8 @@
 	strip_html(msg);
 	if(u) {
-		/* display message like it came from this particular user */
-		bee_irc_msg_from_user(u, msg, 0 /* sent_at */);
+		/* display as a notice from this particular user */
+		irc_usernotice(u, "%s", msg);
 	} else {
-		irc_usermsg(irc, "otr: %s", msg);
+		irc_rootmsg(irc, "[otr] %s", msg);
 	}
 
@@ -637,5 +637,5 @@
 	
 	otrl_privkey_hash_to_human(hunam, fingerprint);
-	irc_usermsg(irc, "new fingerprint for %s: %s",
+	irc_rootmsg(irc, "new fingerprint for %s: %s",
 		peernick(irc, username, protocol), hunam);
 }
@@ -667,5 +667,5 @@
 	if(!otr_update_modeflags(irc, u)) {
 		char *trust = u->flags & IRC_USER_OTR_TRUSTED ? "trusted" : "untrusted!";
-		irc_usermsg(irc, "conversation with %s is now off the record (%s)", u->nick, trust);
+		irc_rootmsg(irc, "conversation with %s is now off the record (%s)", u->nick, trust);
 	}
 }
@@ -687,5 +687,5 @@
 	otr_update_uflags(context, u);
 	if(!otr_update_modeflags(irc, u))
-		irc_usermsg(irc, "conversation with %s is now in the clear", u->nick);
+		irc_rootmsg(irc, "conversation with %s is now in the clear", u->nick);
 }
 
@@ -708,5 +708,5 @@
 	if(!otr_update_modeflags(irc, u)) {
 		char *trust = u->flags & IRC_USER_OTR_TRUSTED ? "trusted" : "untrusted!";
-		irc_usermsg(irc, "otr connection with %s has been refreshed (%s)", u->nick, trust);
+		irc_rootmsg(irc, "otr connection with %s has been refreshed (%s)", u->nick, trust);
 	}
 }
@@ -752,5 +752,5 @@
 	u = irc_user_by_name(irc, args[1]);
 	if(!u || !u->bu || !u->bu->ic) {
-		irc_usermsg(irc, "%s: unknown user", args[1]);
+		irc_rootmsg(irc, "%s: unknown user", args[1]);
 		return;
 	}
@@ -777,9 +777,9 @@
 	u = irc_user_by_name(irc, args[1]);
 	if(!u || !u->bu || !u->bu->ic) {
-		irc_usermsg(irc, "%s: unknown user", args[1]);
+		irc_rootmsg(irc, "%s: unknown user", args[1]);
 		return;
 	}
 	if(!(u->bu->flags & BEE_USER_ONLINE)) {
-		irc_usermsg(irc, "%s is offline", args[1]);
+		irc_rootmsg(irc, "%s is offline", args[1]);
 		return;
 	}
@@ -808,5 +808,5 @@
 	u = irc_user_by_name(irc, args[1]);
 	if(!u || !u->bu || !u->bu->ic) {
-		irc_usermsg(irc, "%s: unknown user", args[1]);
+		irc_rootmsg(irc, "%s: unknown user", args[1]);
 		return;
 	}
@@ -815,5 +815,5 @@
 		u->bu->ic->acc->user, u->bu->ic->acc->prpl->name, 0, NULL, NULL, NULL);
 	if(!ctx) {
-		irc_usermsg(irc, "%s: no otr context with user", args[1]);
+		irc_rootmsg(irc, "%s: no otr context with user", args[1]);
 		return;
 	}
@@ -827,5 +827,5 @@
 			
 			if(!*p || !*q) {
-				irc_usermsg(irc, "failed: truncated fingerprint block %d", i+1);
+				irc_rootmsg(irc, "failed: truncated fingerprint block %d", i+1);
 				return;
 			}
@@ -834,9 +834,9 @@
 			y = hexval(*q);
 			if(x<0) {
-				irc_usermsg(irc, "failed: %d. hex digit of block %d out of range", 2*j+1, i+1);
+				irc_rootmsg(irc, "failed: %d. hex digit of block %d out of range", 2*j+1, i+1);
 				return;
 			}
 			if(y<0) {
-				irc_usermsg(irc, "failed: %d. hex digit of block %d out of range", 2*j+2, i+1);
+				irc_rootmsg(irc, "failed: %d. hex digit of block %d out of range", 2*j+2, i+1);
 				return;
 			}
@@ -847,9 +847,9 @@
 	fp = otrl_context_find_fingerprint(ctx, raw, 0, NULL);
 	if(!fp) {
-		irc_usermsg(irc, "failed: no such fingerprint for %s", args[1]);
+		irc_rootmsg(irc, "failed: no such fingerprint for %s", args[1]);
 	} else {
 		char *trust = args[7] ? args[7] : "affirmed";
 		otrl_context_set_trust(fp, trust);
-		irc_usermsg(irc, "fingerprint match, trust set to \"%s\"", trust);
+		irc_rootmsg(irc, "fingerprint match, trust set to \"%s\"", trust);
 		if(u->flags & IRC_USER_OTR_ENCRYPTED)
 			u->flags |= IRC_USER_OTR_TRUSTED;
@@ -879,5 +879,5 @@
 			ctx = otrl_context_find(irc->otr->us, handle, myhandle, protocol, 0, NULL, NULL, NULL);
 			if(!ctx) {
-				irc_usermsg(irc, "no such context");
+				irc_rootmsg(irc, "no such context");
 				g_free(arg);
 				return;
@@ -886,5 +886,5 @@
 			irc_user_t *u = irc_user_by_name(irc, args[1]);
 			if(!u || !u->bu || !u->bu->ic) {
-				irc_usermsg(irc, "%s: unknown user", args[1]);
+				irc_rootmsg(irc, "%s: unknown user", args[1]);
 				g_free(arg);
 				return;
@@ -893,5 +893,5 @@
 				u->bu->ic->acc->prpl->name, 0, NULL, NULL, NULL);
 			if(!ctx) {
-				irc_usermsg(irc, "no otr context with %s", args[1]);
+				irc_rootmsg(irc, "no otr context with %s", args[1]);
 				g_free(arg);
 				return;
@@ -901,5 +901,5 @@
 		/* show how we resolved the (nick) argument, if we did */
 		if(handle!=arg) {
-			irc_usermsg(irc, "%s is %s/%s; we are %s/%s to them", args[1],
+			irc_rootmsg(irc, "%s is %s/%s; we are %s/%s to them", args[1],
 				ctx->username, ctx->protocol, ctx->accountname, ctx->protocol);
 		}
@@ -916,5 +916,5 @@
 	n = atoi(args[1]);
 	if(n<0 || (!n && strcmp(args[1], "0"))) {
-		irc_usermsg(irc, "%s: invalid account number", args[1]);
+		irc_rootmsg(irc, "%s: invalid account number", args[1]);
 		return;
 	}
@@ -923,10 +923,10 @@
 	for(i=0; i<n && a; i++, a=a->next);
 	if(!a) {
-		irc_usermsg(irc, "%s: no such account", args[1]);
+		irc_rootmsg(irc, "%s: no such account", args[1]);
 		return;
 	}
 	
 	if(keygen_in_progress(irc, a->user, a->prpl->name)) {
-		irc_usermsg(irc, "keygen for account %d already in progress", n);
+		irc_rootmsg(irc, "keygen for account %d already in progress", n);
 		return;
 	}
@@ -950,5 +950,5 @@
 	
 	if(fp == fp->context->active_fingerprint) {
-		irc_usermsg(irc, "that fingerprint is active, terminate otr connection first");
+		irc_rootmsg(irc, "that fingerprint is active, terminate otr connection first");
 		return;
 	}
@@ -966,5 +966,5 @@
 	
 	if(ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED) {
-		irc_usermsg(irc, "active otr connection with %s, terminate it first",
+		irc_rootmsg(irc, "active otr connection with %s, terminate it first",
 			peernick(irc, ctx->username, ctx->protocol));
 		return;
@@ -998,5 +998,5 @@
 		
 		if(!args[3]) {
-			irc_usermsg(irc, "otr %s %s: not enough arguments (2 req.)", args[0], args[1]);
+			irc_rootmsg(irc, "otr %s %s: not enough arguments (2 req.)", args[0], args[1]);
 			return;
 		}
@@ -1005,5 +1005,5 @@
 		u = irc_user_by_name(irc, args[2]);
 		if(!u || !u->bu || !u->bu->ic) {
-			irc_usermsg(irc, "%s: unknown user", args[2]);
+			irc_rootmsg(irc, "%s: unknown user", args[2]);
 			return;
 		}
@@ -1012,5 +1012,5 @@
 			u->bu->ic->acc->prpl->name, 0, NULL, NULL, NULL);
 		if(!ctx) {
-			irc_usermsg(irc, "no otr context with %s", args[2]);
+			irc_rootmsg(irc, "no otr context with %s", args[2]);
 			return;
 		}
@@ -1023,5 +1023,5 @@
 		
 		if(fp == ctx->active_fingerprint) {
-			irc_usermsg(irc, "that fingerprint is active, terminate otr connection first");
+			irc_rootmsg(irc, "that fingerprint is active, terminate otr connection first");
 			return;
 		}
@@ -1048,5 +1048,5 @@
 		u = irc_user_by_name(irc, args[2]);
 		if(!u || !u->bu || !u->bu->ic) {
-			irc_usermsg(irc, "%s: unknown user", args[2]);
+			irc_rootmsg(irc, "%s: unknown user", args[2]);
 			return;
 		}
@@ -1055,10 +1055,10 @@
 			u->bu->ic->acc->prpl->name, 0, NULL, NULL, NULL);
 		if(!ctx) {
-			irc_usermsg(irc, "no otr context with %s", args[2]);
+			irc_rootmsg(irc, "no otr context with %s", args[2]);
 			return;
 		}
 		
 		if(ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED) {
-			irc_usermsg(irc, "active otr connection with %s, terminate it first", args[2]);
+			irc_rootmsg(irc, "active otr connection with %s, terminate it first", args[2]);
 			return;
 		}
@@ -1093,5 +1093,5 @@
 	else
 	{
-		irc_usermsg(irc, "otr %s: unknown subcommand \"%s\", see \x02help otr forget\x02",
+		irc_rootmsg(irc, "otr %s: unknown subcommand \"%s\", see \x02help otr forget\x02",
 			args[0], args[1]);
 	}
@@ -1119,5 +1119,5 @@
 	if(!context) {
 		/* huh? out of memory or what? */
-		irc_usermsg(irc, "smp: failed to get otr context for %s", u->nick);
+		irc_rootmsg(irc, "smp: failed to get otr context for %s", u->nick);
 		otrl_message_abort_smp(us, ops, u->bu->ic, context);
 		otrl_sm_state_free(context->smstate);
@@ -1127,5 +1127,5 @@
 
 	if (context->smstate->sm_prog_state == OTRL_SMP_PROG_CHEATED) {
-		irc_usermsg(irc, "smp %s: opponent violated protocol, aborting",
+		irc_rootmsg(irc, "smp %s: opponent violated protocol, aborting",
 			u->nick);
 		otrl_message_abort_smp(us, ops, u->bu->ic, context);
@@ -1137,12 +1137,12 @@
 	if (tlv) {
 		if (nextMsg != OTRL_SMP_EXPECT1) {
-			irc_usermsg(irc, "smp %s: spurious SMP1Q received, aborting", u->nick);
+			irc_rootmsg(irc, "smp %s: spurious SMP1Q received, aborting", u->nick);
 			otrl_message_abort_smp(us, ops, u->bu->ic, context);
 			otrl_sm_state_free(context->smstate);
 		} else {
 			char *question = g_strndup((char *)tlv->data, tlv->len);
-			irc_usermsg(irc, "smp: initiated by %s with question: \x02\"%s\"\x02", u->nick,
+			irc_rootmsg(irc, "smp: initiated by %s with question: \x02\"%s\"\x02", u->nick,
 				question);
-			irc_usermsg(irc, "smp: respond with \x02otr smp %s <answer>\x02",
+			irc_rootmsg(irc, "smp: respond with \x02otr smp %s <answer>\x02",
 				u->nick);
 			g_free(question);
@@ -1153,9 +1153,9 @@
 	if (tlv) {
 		if (nextMsg != OTRL_SMP_EXPECT1) {
-			irc_usermsg(irc, "smp %s: spurious SMP1 received, aborting", u->nick);
+			irc_rootmsg(irc, "smp %s: spurious SMP1 received, aborting", u->nick);
 			otrl_message_abort_smp(us, ops, u->bu->ic, context);
 			otrl_sm_state_free(context->smstate);
 		} else {
-			irc_usermsg(irc, "smp: initiated by %s"
+			irc_rootmsg(irc, "smp: initiated by %s"
 				" - respond with \x02otr smp %s <secret>\x02",
 				u->nick, u->nick);
@@ -1166,5 +1166,5 @@
 	if (tlv) {
 		if (nextMsg != OTRL_SMP_EXPECT2) {
-			irc_usermsg(irc, "smp %s: spurious SMP2 received, aborting", u->nick);
+			irc_rootmsg(irc, "smp %s: spurious SMP2 received, aborting", u->nick);
 			otrl_message_abort_smp(us, ops, u->bu->ic, context);
 			otrl_sm_state_free(context->smstate);
@@ -1177,5 +1177,5 @@
 	if (tlv) {
 		if (nextMsg != OTRL_SMP_EXPECT3) {
-			irc_usermsg(irc, "smp %s: spurious SMP3 received, aborting", u->nick);
+			irc_rootmsg(irc, "smp %s: spurious SMP3 received, aborting", u->nick);
 			otrl_message_abort_smp(us, ops, u->bu->ic, context);
 			otrl_sm_state_free(context->smstate);
@@ -1184,16 +1184,16 @@
 			if(context->smstate->sm_prog_state == OTRL_SMP_PROG_SUCCEEDED) {
 				if(context->smstate->received_question) {
-					irc_usermsg(irc, "smp %s: correct answer, you are trusted",
+					irc_rootmsg(irc, "smp %s: correct answer, you are trusted",
 						u->nick);
 				} else {
-					irc_usermsg(irc, "smp %s: secrets proved equal, fingerprint trusted",
+					irc_rootmsg(irc, "smp %s: secrets proved equal, fingerprint trusted",
 						u->nick);
 				}
 			} else {
 				if(context->smstate->received_question) {
-					irc_usermsg(irc, "smp %s: wrong answer, you are not trusted",
+					irc_rootmsg(irc, "smp %s: wrong answer, you are not trusted",
 						u->nick);
 				} else {
-					irc_usermsg(irc, "smp %s: secrets did not match, fingerprint not trusted",
+					irc_rootmsg(irc, "smp %s: secrets did not match, fingerprint not trusted",
 						u->nick);
 				}
@@ -1206,5 +1206,5 @@
 	if (tlv) {
 		if (nextMsg != OTRL_SMP_EXPECT4) {
-			irc_usermsg(irc, "smp %s: spurious SMP4 received, aborting", u->nick);
+			irc_rootmsg(irc, "smp %s: spurious SMP4 received, aborting", u->nick);
 			otrl_message_abort_smp(us, ops, u->bu->ic, context);
 			otrl_sm_state_free(context->smstate);
@@ -1212,8 +1212,8 @@
 			/* SMP4 received, otrl_message_receiving will have set fp trust */
 			if(context->smstate->sm_prog_state == OTRL_SMP_PROG_SUCCEEDED) {
-				irc_usermsg(irc, "smp %s: secrets proved equal, fingerprint trusted",
+				irc_rootmsg(irc, "smp %s: secrets proved equal, fingerprint trusted",
 					u->nick);
 			} else {
-				irc_usermsg(irc, "smp %s: secrets did not match, fingerprint not trusted",
+				irc_rootmsg(irc, "smp %s: secrets did not match, fingerprint not trusted",
 					u->nick);
 			}
@@ -1224,5 +1224,5 @@
 	tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP_ABORT);
 	if (tlv) {
-	 	irc_usermsg(irc, "smp: received abort from %s", u->nick);
+	 	irc_rootmsg(irc, "smp: received abort from %s", u->nick);
 		otrl_sm_state_free(context->smstate);
 		/* smp is in back in EXPECT1 */
@@ -1239,9 +1239,9 @@
 	u = irc_user_by_name(irc, nick);
 	if(!u || !u->bu || !u->bu->ic) {
-		irc_usermsg(irc, "%s: unknown user", nick);
+		irc_rootmsg(irc, "%s: unknown user", nick);
 		return;
 	}
 	if(!(u->bu->flags & BEE_USER_ONLINE)) {
-		irc_usermsg(irc, "%s is offline", nick);
+		irc_rootmsg(irc, "%s is offline", nick);
 		return;
 	}
@@ -1250,5 +1250,5 @@
 		u->bu->ic->acc->user, u->bu->ic->acc->prpl->name, 0, NULL, NULL, NULL);
 	if(!ctx || ctx->msgstate != OTRL_MSGSTATE_ENCRYPTED) {
-		irc_usermsg(irc, "smp: otr inactive with %s, try \x02otr connect"
+		irc_rootmsg(irc, "smp: otr inactive with %s, try \x02otr connect"
 				" %s\x02", nick, nick);
 		return;
@@ -1265,5 +1265,5 @@
 	if(question) {
 		/* this was 'otr smpq', just initiate */
-		irc_usermsg(irc, "smp: initiating with %s...", u->nick);
+		irc_rootmsg(irc, "smp: initiating with %s...", u->nick);
 		otrl_message_initiate_smp_q(irc->otr->us, &otr_ops, u->bu->ic, ctx,
 			question, (unsigned char *)secret, strlen(secret));
@@ -1274,5 +1274,5 @@
 		   is completed or aborted! */ 
 		if(ctx->smstate->secret == NULL) {
-			irc_usermsg(irc, "smp: initiating with %s...", u->nick);
+			irc_rootmsg(irc, "smp: initiating with %s...", u->nick);
 			otrl_message_initiate_smp(irc->otr->us, &otr_ops,
 				u->bu->ic, ctx, (unsigned char *)secret, strlen(secret));
@@ -1281,5 +1281,5 @@
 			/* if we're still in EXPECT1 but smstate is initialized, we must have
 			   received the SMP1, so let's issue a response */
-			irc_usermsg(irc, "smp: responding to %s...", u->nick);
+			irc_rootmsg(irc, "smp: responding to %s...", u->nick);
 			otrl_message_respond_smp(irc->otr->us, &otr_ops,
 				u->bu->ic, ctx, (unsigned char *)secret, strlen(secret));
@@ -1396,11 +1396,11 @@
 		}
 		if(fp == ctx->active_fingerprint) {
-			irc_usermsg(irc, "    \x02%s (%s)\x02", human, trust);
+			irc_rootmsg(irc, "    \x02%s (%s)\x02", human, trust);
 		} else {
-			irc_usermsg(irc, "    %s (%s)", human, trust);
+			irc_rootmsg(irc, "    %s (%s)", human, trust);
 		}
 	}
 	if(count==0)
-		irc_usermsg(irc, "    (none)");
+		irc_rootmsg(irc, "    (none)");
 }
 
@@ -1421,5 +1421,5 @@
 			
 			if(n>=40) {
-				irc_usermsg(irc, "too many fingerprint digits given, expected at most 40");
+				irc_rootmsg(irc, "too many fingerprint digits given, expected at most 40");
 				return NULL;
 			}
@@ -1428,5 +1428,5 @@
 				*(p++) = c;
 			} else {
-				irc_usermsg(irc, "invalid hex digit '%c' in block %d", args[i][j], i+1);
+				irc_rootmsg(irc, "invalid hex digit '%c' in block %d", args[i][j], i+1);
 				return NULL;
 			}
@@ -1449,5 +1449,5 @@
 	}
 	if(!fp) {
-		irc_usermsg(irc, "%s: no match", prefix);
+		irc_rootmsg(irc, "%s: no match", prefix);
 		return NULL;
 	}
@@ -1462,5 +1462,5 @@
 	}
 	if(fp2) {
-		irc_usermsg(irc, "%s: multiple matches", prefix);
+		irc_rootmsg(irc, "%s: multiple matches", prefix);
 		return NULL;
 	}
@@ -1485,5 +1485,5 @@
 			
 			if(n>=40) {
-				irc_usermsg(irc, "too many fingerprint digits given, expected at most 40");
+				irc_rootmsg(irc, "too many fingerprint digits given, expected at most 40");
 				return NULL;
 			}
@@ -1492,5 +1492,5 @@
 				*(p++) = c;
 			} else {
-				irc_usermsg(irc, "invalid hex digit '%c' in block %d", args[i][j], i+1);
+				irc_rootmsg(irc, "invalid hex digit '%c' in block %d", args[i][j], i+1);
 				return NULL;
 			}
@@ -1513,5 +1513,5 @@
 	}
 	if(!k) {
-		irc_usermsg(irc, "%s: no match", prefix);
+		irc_rootmsg(irc, "%s: no match", prefix);
 		return NULL;
 	}
@@ -1526,5 +1526,5 @@
 	}
 	if(k2) {
-		irc_usermsg(irc, "%s: multiple matches", prefix);
+		irc_rootmsg(irc, "%s: multiple matches", prefix);
 		return NULL;
 	}
@@ -1541,5 +1541,5 @@
 
 	/* list all privkeys (including ones being generated) */
-	irc_usermsg(irc, "\x1fprivate keys:\x1f");
+	irc_rootmsg(irc, "\x1fprivate keys:\x1f");
 	for(key=irc->otr->us->privkey_root; key; key=key->next) {
 		const char *hash;
@@ -1547,8 +1547,8 @@
 		switch(key->pubkey_type) {
 		case OTRL_PUBKEY_TYPE_DSA:
-			irc_usermsg(irc, "  %s/%s - DSA", key->accountname, key->protocol);
+			irc_rootmsg(irc, "  %s/%s - DSA", key->accountname, key->protocol);
 			break;
 		default:
-			irc_usermsg(irc, "  %s/%s - type %d", key->accountname, key->protocol,
+			irc_rootmsg(irc, "  %s/%s - type %d", key->accountname, key->protocol,
 				key->pubkey_type);
 		}
@@ -1559,23 +1559,23 @@
 		hash = otrl_privkey_fingerprint(irc->otr->us, human, key->accountname, key->protocol);
 		if(hash) /* should always succeed */
-			irc_usermsg(irc, "    %s", human);
+			irc_rootmsg(irc, "    %s", human);
 	}
 	if(irc->otr->sent_accountname) {
-		irc_usermsg(irc, "  %s/%s - DSA", irc->otr->sent_accountname,
+		irc_rootmsg(irc, "  %s/%s - DSA", irc->otr->sent_accountname,
 			irc->otr->sent_protocol);
-		irc_usermsg(irc, "    (being generated)");
+		irc_rootmsg(irc, "    (being generated)");
 	}
 	for(kg=irc->otr->todo; kg; kg=kg->next) {
-		irc_usermsg(irc, "  %s/%s - DSA", kg->accountname, kg->protocol);
-		irc_usermsg(irc, "    (queued)");
+		irc_rootmsg(irc, "  %s/%s - DSA", kg->accountname, kg->protocol);
+		irc_rootmsg(irc, "    (queued)");
 	}
 	if(key == irc->otr->us->privkey_root &&
 	   !irc->otr->sent_accountname &&
 	   kg == irc->otr->todo)
-		irc_usermsg(irc, "  (none)");
+		irc_rootmsg(irc, "  (none)");
 
 	/* list all contexts */
-	irc_usermsg(irc, "%s", "");
-	irc_usermsg(irc, "\x1f" "connection contexts:\x1f (bold=currently encrypted)");
+	irc_rootmsg(irc, "%s", "");
+	irc_rootmsg(irc, "\x1f" "connection contexts:\x1f (bold=currently encrypted)");
 	for(ctx=irc->otr->us->context_root; ctx; ctx=ctx->next) {\
 		irc_user_t *u;
@@ -1591,7 +1591,7 @@
 		
 		if(ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED) {
-			irc_usermsg(irc, "  \x02%s\x02", userstring);
+			irc_rootmsg(irc, "  \x02%s\x02", userstring);
 		} else {
-			irc_usermsg(irc, "  %s", userstring);
+			irc_rootmsg(irc, "  %s", userstring);
 		}
 		
@@ -1599,5 +1599,5 @@
 	}
 	if(ctx == irc->otr->us->context_root)
-		irc_usermsg(irc, "  (none)");
+		irc_rootmsg(irc, "  (none)");
 }
 
@@ -1606,34 +1606,34 @@
 	switch(ctx->otr_offer) {
 	case OFFER_NOT:
-		irc_usermsg(irc, "  otr offer status: none sent");
+		irc_rootmsg(irc, "  otr offer status: none sent");
 		break;
 	case OFFER_SENT:
-		irc_usermsg(irc, "  otr offer status: awaiting reply");
+		irc_rootmsg(irc, "  otr offer status: awaiting reply");
 		break;
 	case OFFER_ACCEPTED:
-		irc_usermsg(irc, "  otr offer status: accepted our offer");
+		irc_rootmsg(irc, "  otr offer status: accepted our offer");
 		break;
 	case OFFER_REJECTED:
-		irc_usermsg(irc, "  otr offer status: ignored our offer");
+		irc_rootmsg(irc, "  otr offer status: ignored our offer");
 		break;
 	default:
-		irc_usermsg(irc, "  otr offer status: %d", ctx->otr_offer);
+		irc_rootmsg(irc, "  otr offer status: %d", ctx->otr_offer);
 	}
 
 	switch(ctx->msgstate) {
 	case OTRL_MSGSTATE_PLAINTEXT:
-		irc_usermsg(irc, "  connection state: cleartext");
+		irc_rootmsg(irc, "  connection state: cleartext");
 		break;
 	case OTRL_MSGSTATE_ENCRYPTED:
-		irc_usermsg(irc, "  connection state: encrypted (v%d)", ctx->protocol_version);
+		irc_rootmsg(irc, "  connection state: encrypted (v%d)", ctx->protocol_version);
 		break;
 	case OTRL_MSGSTATE_FINISHED:
-		irc_usermsg(irc, "  connection state: shut down");
+		irc_rootmsg(irc, "  connection state: shut down");
 		break;
 	default:
-		irc_usermsg(irc, "  connection state: %d", ctx->msgstate);
-	}
-
-	irc_usermsg(irc, "  fingerprints: (bold=active)");	
+		irc_rootmsg(irc, "  connection state: %d", ctx->msgstate);
+	}
+
+	irc_rootmsg(irc, "  fingerprints: (bold=active)");	
 	show_fingerprints(irc, ctx);
 }
@@ -1675,5 +1675,5 @@
 		
 		if(pipe(to) < 0 || pipe(from) < 0) {
-			irc_usermsg(irc, "otr keygen: couldn't create pipe: %s", strerror(errno));
+			irc_rootmsg(irc, "otr keygen: couldn't create pipe: %s", strerror(errno));
 			return;
 		}
@@ -1682,5 +1682,5 @@
 		fromf = fdopen(from[0], "r");
 		if(!tof || !fromf) {
-			irc_usermsg(irc, "otr keygen: couldn't streamify pipe: %s", strerror(errno));
+			irc_rootmsg(irc, "otr keygen: couldn't streamify pipe: %s", strerror(errno));
 			return;
 		}
@@ -1688,5 +1688,5 @@
 		p = fork();
 		if(p<0) {
-			irc_usermsg(irc, "otr keygen: couldn't fork: %s", strerror(errno));
+			irc_rootmsg(irc, "otr keygen: couldn't fork: %s", strerror(errno));
 			return;
 		}
@@ -1768,5 +1768,5 @@
 	myfgets(msg, 512, irc->otr->from);
 	
-	irc_usermsg(irc, "%s", msg);
+	irc_rootmsg(irc, "%s", msg);
 	if(filename[0]) {
 		char *kf = g_strdup_printf("%s%s.otr_keys", global.conf->configdir, irc->user->nick);
@@ -1842,13 +1842,13 @@
 	
 	if(keygen_in_progress(irc, acc->user, acc->prpl->name)) {
-		irc_usermsg(irc, "keygen for %s/%s already in progress",
+		irc_rootmsg(irc, "keygen for %s/%s already in progress",
 			acc->user, acc->prpl->name);
 	} else {
-		irc_usermsg(irc, "starting background keygen for %s/%s",
+		irc_rootmsg(irc, "starting background keygen for %s/%s",
 			acc->user, acc->prpl->name);
-		irc_usermsg(irc, "you will be notified when it completes");
+		irc_rootmsg(irc, "you will be notified when it completes");
 		otr_keygen(irc, acc->user, acc->prpl->name);
 	}
 }
 
-/* vim: noet ts=4 sw=4 */
+/* vim: set noet ts=4 sw=4: */
Index: protocols/nogaim.c
===================================================================
--- protocols/nogaim.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ protocols/nogaim.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -216,7 +216,7 @@
 	if( a )
 		/* FIXME(wilmer): ui_log callback or so */
-		irc_usermsg( ic->bee->ui_data, "%s(%s) - %s", ic->acc->prpl->name, ic->acc->user, text );
+		irc_rootmsg( ic->bee->ui_data, "%s(%s) - %s", ic->acc->prpl->name, ic->acc->user, text );
 	else
-		irc_usermsg( ic->bee->ui_data, "%s - %s", ic->acc->prpl->name, text );
+		irc_rootmsg( ic->bee->ui_data, "%s - %s", ic->acc->prpl->name, text );
 	
 	g_free( text );
Index: protocols/purple/purple.c
===================================================================
--- protocols/purple/purple.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ protocols/purple/purple.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -181,5 +181,5 @@
 			/** No way to talk to the user right now, invent one when
 			this becomes important.
-			irc_usermsg( acc->irc, "Setting with unknown type: %s (%d) Expect stuff to break..\n",
+			irc_rootmsg( acc->irc, "Setting with unknown type: %s (%d) Expect stuff to break..\n",
 			             name, purple_account_option_get_type( o ) );
 			*/
Index: query.c
===================================================================
--- query.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ query.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -150,5 +150,5 @@
 			imcb_log( q->ic, "Accepted: %s", q->question );
 		else
-			irc_usermsg( irc, "Accepted: %s", q->question );
+			irc_rootmsg( irc, "Accepted: %s", q->question );
 		if( q->yes )
 			q->yes( q->data );
@@ -159,5 +159,5 @@
 			imcb_log( q->ic, "Rejected: %s", q->question );
 		else
-			irc_usermsg( irc, "Rejected: %s", q->question );
+			irc_rootmsg( irc, "Rejected: %s", q->question );
 		if( q->no )
 			q->no( q->data );
@@ -179,5 +179,5 @@
 	else
 	{
-		irc_usermsg( irc, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question );
+		irc_rootmsg( irc, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question );
 	}
 }
Index: root_commands.c
===================================================================
--- root_commands.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ root_commands.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -42,5 +42,5 @@
 			if( cmd[blaat] == NULL )                               \
 			{                                                      \
-				irc_usermsg( irc, "Not enough parameters given (need %d).", x ); \
+				irc_rootmsg( irc, "Not enough parameters given (need %d).", x ); \
 				return y;                                      \
 			}                                                      \
@@ -69,5 +69,5 @@
 		}
 	
-	irc_usermsg( irc, "Unknown command: %s. Please use \x02help commands\x02 to get a list of available commands.", cmd[0] );
+	irc_rootmsg( irc, "Unknown command: %s. Please use \x02help commands\x02 to get a list of available commands.", cmd[0] );
 }
 
@@ -90,10 +90,10 @@
 	if( s )
 	{
-		irc_usermsg( irc, "%s", s );
+		irc_rootmsg( irc, "%s", s );
 		g_free( s );
 	}
 	else
 	{
-		irc_usermsg( irc, "Error opening helpfile." );
+		irc_rootmsg( irc, "Error opening helpfile." );
 	}
 }
@@ -110,5 +110,5 @@
 	if( irc->status & USTATUS_IDENTIFIED )
 	{
-		irc_usermsg( irc, "You're already logged in." );
+		irc_rootmsg( irc, "You're already logged in." );
 		return;
 	}
@@ -128,5 +128,5 @@
 	else if( irc->b->accounts != NULL )
 	{
-		irc_usermsg( irc,
+		irc_rootmsg( irc,
 		             "You're trying to identify yourself, but already have "
 		             "at least one IM account set up. "
@@ -138,5 +138,5 @@
 	if( password == NULL )
 	{
-		irc_usermsg( irc, "About to identify, use /OPER to enter the password" );
+		irc_rootmsg( irc, "About to identify, use /OPER to enter the password" );
 		irc->status |= OPER_HACK_IDENTIFY;
 		return;
@@ -150,11 +150,11 @@
 	switch (status) {
 	case STORAGE_INVALID_PASSWORD:
-		irc_usermsg( irc, "Incorrect password" );
+		irc_rootmsg( irc, "Incorrect password" );
 		break;
 	case STORAGE_NO_SUCH_USER:
-		irc_usermsg( irc, "The nick is (probably) not registered" );
+		irc_rootmsg( irc, "The nick is (probably) not registered" );
 		break;
 	case STORAGE_OK:
-		irc_usermsg( irc, "Password accepted%s",
+		irc_rootmsg( irc, "Password accepted%s",
 		             load ? ", settings and accounts loaded" : "" );
 		irc_setpass( irc, password );
@@ -192,5 +192,5 @@
 	case STORAGE_OTHER_ERROR:
 	default:
-		irc_usermsg( irc, "Unknown error while loading configuration" );
+		irc_rootmsg( irc, "Unknown error while loading configuration" );
 		break;
 	}
@@ -215,5 +215,5 @@
 	if( global.conf->authmode == AUTHMODE_REGISTERED )
 	{
-		irc_usermsg( irc, "This server does not allow registering new accounts" );
+		irc_rootmsg( irc, "This server does not allow registering new accounts" );
 		return;
 	}
@@ -221,5 +221,5 @@
 	if( cmd[1] == NULL )
 	{
-		irc_usermsg( irc, "About to register, use /OPER to enter the password" );
+		irc_rootmsg( irc, "About to register, use /OPER to enter the password" );
 		irc->status |= OPER_HACK_REGISTER;
 		return;
@@ -228,9 +228,9 @@
 	switch( storage_save( irc, cmd[1], FALSE ) ) {
 		case STORAGE_ALREADY_EXISTS:
-			irc_usermsg( irc, "Nick is already registered" );
+			irc_rootmsg( irc, "Nick is already registered" );
 			break;
 			
 		case STORAGE_OK:
-			irc_usermsg( irc, "Account successfully created" );
+			irc_rootmsg( irc, "Account successfully created" );
 			irc_setpass( irc, cmd[1] );
 			irc->status |= USTATUS_IDENTIFIED;
@@ -245,5 +245,5 @@
 
 		default:
-			irc_usermsg( irc, "Error registering" );
+			irc_rootmsg( irc, "Error registering" );
 			break;
 	}
@@ -257,8 +257,8 @@
 	switch (status) {
 	case STORAGE_NO_SUCH_USER:
-		irc_usermsg( irc, "That account does not exist" );
+		irc_rootmsg( irc, "That account does not exist" );
 		break;
 	case STORAGE_INVALID_PASSWORD:
-		irc_usermsg( irc, "Password invalid" );
+		irc_rootmsg( irc, "Password invalid" );
 		break;
 	case STORAGE_OK:
@@ -266,8 +266,8 @@
 		irc->status &= ~USTATUS_IDENTIFIED;
 		irc_umode_set( irc, "-R", 1 );
-		irc_usermsg( irc, "Account `%s' removed", irc->user->nick );
+		irc_rootmsg( irc, "Account `%s' removed", irc->user->nick );
 		break;
 	default:
-		irc_usermsg( irc, "Error: `%d'", status );
+		irc_rootmsg( irc, "Error: `%d'", status );
 		break;
 	}
@@ -277,9 +277,9 @@
 {
 	if( ( irc->status & USTATUS_IDENTIFIED ) == 0 )
-		irc_usermsg( irc, "Please create an account first" );
+		irc_rootmsg( irc, "Please create an account first" );
 	else if( storage_save( irc, NULL, TRUE ) == STORAGE_OK )
-		irc_usermsg( irc, "Configuration saved" );
-	else
-		irc_usermsg( irc, "Configuration could not be saved!" );
+		irc_rootmsg( irc, "Configuration saved" );
+	else
+		irc_rootmsg( irc, "Configuration could not be saved!" );
 }
 
@@ -290,16 +290,16 @@
 	
 	if( ( val = set_getstr( head, key ) ) )
-		irc_usermsg( irc, "%s = `%s'", key, val );
+		irc_rootmsg( irc, "%s = `%s'", key, val );
 	else if( !( set = set_find( head, key ) ) )
 	{
-		irc_usermsg( irc, "Setting `%s' does not exist.", key );
+		irc_rootmsg( irc, "Setting `%s' does not exist.", key );
 		if( *head == irc->b->set )
-			irc_usermsg( irc, "It might be an account or channel setting. "
+			irc_rootmsg( irc, "It might be an account or channel setting. "
 			             "See \x02help account set\x02 and \x02help channel set\x02." );
 	}
 	else if( set->flags & SET_PASSWORD )
-		irc_usermsg( irc, "%s = `********' (hidden)", key );
-	else
-		irc_usermsg( irc, "%s is empty", key );
+		irc_rootmsg( irc, "%s = `********' (hidden)", key );
+	else
+		irc_rootmsg( irc, "%s is empty", key );
 }
 
@@ -344,7 +344,7 @@
 			   feedback. */
 			if( st )
-				irc_usermsg( irc, "Setting changed successfully" );
+				irc_rootmsg( irc, "Setting changed successfully" );
 			else
-				irc_usermsg( irc, "Failed to change setting" );
+				irc_rootmsg( irc, "Failed to change setting" );
 		}
 		else
@@ -377,10 +377,10 @@
 	if( a->ic && s && s->flags & ACC_SET_OFFLINE_ONLY )
 	{
-		irc_usermsg( irc, "This setting can only be changed when the account is %s-line", "off" );
+		irc_rootmsg( irc, "This setting can only be changed when the account is %s-line", "off" );
 		return 0;
 	}
 	else if( !a->ic && s && s->flags & ACC_SET_ONLINE_ONLY )
 	{
-		irc_usermsg( irc, "This setting can only be changed when the account is %s-line", "on" );
+		irc_rootmsg( irc, "This setting can only be changed when the account is %s-line", "on" );
 		return 0;
 	}
@@ -396,5 +396,5 @@
 	if( global.conf->authmode == AUTHMODE_REGISTERED && !( irc->status & USTATUS_IDENTIFIED ) )
 	{
-		irc_usermsg( irc, "This server only accepts registered users" );
+		irc_rootmsg( irc, "This server only accepts registered users" );
 		return;
 	}
@@ -413,5 +413,5 @@
 				if( strcmp( a->pass, PASSWORD_PENDING ) == 0 )
 				{
-					irc_usermsg( irc, "Enter password for account %s(%s) "
+					irc_rootmsg( irc, "Enter password for account %s(%s) "
 					             "first (use /OPER)", a->prpl->name, a->user );
 					return;
@@ -425,5 +425,5 @@
 		if( prpl == NULL )
 		{
-			irc_usermsg( irc, "Unknown protocol" );
+			irc_rootmsg( irc, "Unknown protocol" );
 			return;
 		}
@@ -431,5 +431,5 @@
 		for( a = irc->b->accounts; a; a = a->next )
 			if( a->prpl == prpl && prpl->handle_cmp( a->user, cmd[3] ) == 0 )
-				irc_usermsg( irc, "Warning: You already have an account with "
+				irc_rootmsg( irc, "Warning: You already have an account with "
 				             "protocol `%s' and username `%s'. Are you accidentally "
 				             "trying to add it twice?", prpl->name, cmd[3] );
@@ -438,10 +438,10 @@
 		if( cmd[5] )
 		{
-			irc_usermsg( irc, "Warning: Passing a servername/other flags to `account add' "
+			irc_rootmsg( irc, "Warning: Passing a servername/other flags to `account add' "
 			                  "is now deprecated. Use `account set' instead." );
 			set_setstr( &a->set, "server", cmd[5] );
 		}
 		
-		irc_usermsg( irc, "Account successfully added%s", cmd[4] ? "" :
+		irc_rootmsg( irc, "Account successfully added%s", cmd[4] ? "" :
 		             ", now use /OPER to enter the password" );
 		
@@ -453,5 +453,5 @@
 		
 		if( strchr( irc->umode, 'b' ) )
-			irc_usermsg( irc, "Account list:" );
+			irc_rootmsg( irc, "Account list:" );
 		
 		for( a = irc->b->accounts; a; a = a->next )
@@ -468,9 +468,9 @@
 				con = "";
 			
-			irc_usermsg( irc, "%2d (%s): %s, %s%s", i, a->tag, a->prpl->name, a->user, con );
+			irc_rootmsg( irc, "%2d (%s): %s, %s%s", i, a->tag, a->prpl->name, a->user, con );
 			
 			i ++;
 		}
-		irc_usermsg( irc, "End of account list" );
+		irc_rootmsg( irc, "End of account list" );
 		
 		return;
@@ -484,5 +484,5 @@
 		if ( irc->b->accounts )
 		{
-			irc_usermsg( irc, "Trying to get all accounts connected..." );
+			irc_rootmsg( irc, "Trying to get all accounts connected..." );
 		
 			for( a = irc->b->accounts; a; a = a->next )
@@ -490,5 +490,5 @@
 				{
 					if( strcmp( a->pass, PASSWORD_PENDING ) == 0 )
-						irc_usermsg( irc, "Enter password for account %s(%s) "
+						irc_rootmsg( irc, "Enter password for account %s(%s) "
 						             "first (use /OPER)", a->prpl->name, a->user );
 					else
@@ -498,5 +498,5 @@
 		else
 		{
-			irc_usermsg( irc, "No accounts known. Use `account add' to add one." );
+			irc_rootmsg( irc, "No accounts known. Use `account add' to add one." );
 		}
 		
@@ -505,5 +505,5 @@
 	else if( len >= 2 && g_strncasecmp( cmd[1], "off", len ) == 0 )
 	{
-		irc_usermsg( irc, "Deactivating all active (re)connections..." );
+		irc_rootmsg( irc, "Deactivating all active (re)connections..." );
 		
 		for( a = irc->b->accounts; a; a = a->next )
@@ -530,5 +530,5 @@
 	    ( a = account_get( irc->b, cmd[1] ) ) == NULL )
 	{
-		irc_usermsg( irc, "Could not find account `%s'. Note that the syntax "
+		irc_rootmsg( irc, "Could not find account `%s'. Note that the syntax "
 		             "of the account command changed, see \x02help account\x02.", cmd[1] );
 		
@@ -540,10 +540,10 @@
 		if( a->ic )
 		{
-			irc_usermsg( irc, "Account is still logged in, can't delete" );
+			irc_rootmsg( irc, "Account is still logged in, can't delete" );
 		}
 		else
 		{
 			account_del( irc->b, a );
-			irc_usermsg( irc, "Account deleted" );
+			irc_rootmsg( irc, "Account deleted" );
 		}
 	}
@@ -551,7 +551,7 @@
 	{
 		if( a->ic )
-			irc_usermsg( irc, "Account already online" );
+			irc_rootmsg( irc, "Account already online" );
 		else if( strcmp( a->pass, PASSWORD_PENDING ) == 0 )
-			irc_usermsg( irc, "Enter password for account %s(%s) "
+			irc_rootmsg( irc, "Enter password for account %s(%s) "
 			             "first (use /OPER)", a->prpl->name, a->user );
 		else
@@ -567,9 +567,9 @@
 		{
 			cancel_auto_reconnect( a );
-			irc_usermsg( irc, "Reconnect cancelled" );
-		}
-		else
-		{
-			irc_usermsg( irc, "Account already offline" );
+			irc_rootmsg( irc, "Reconnect cancelled" );
+		}
+		else
+		{
+			irc_rootmsg( irc, "Account already offline" );
 		}
 	}
@@ -580,5 +580,5 @@
 	else
 	{
-		irc_usermsg( irc, "Unknown command: %s [...] %s. Please use \x02help commands\x02 to get a list of available commands.", "account", cmd[2] );
+		irc_rootmsg( irc, "Unknown command: %s [...] %s. Please use \x02help commands\x02 to get a list of available commands.", "account", cmd[2] );
 	}
 }
@@ -597,5 +597,5 @@
 		
 		if( strchr( irc->umode, 'b' ) )
-			irc_usermsg( irc, "Channel list:" );
+			irc_rootmsg( irc, "Channel list:" );
 		
 		for( l = irc->channels; l; l = l->next )
@@ -603,5 +603,5 @@
 			irc_channel_t *ic = l->data;
 			
-			irc_usermsg( irc, "%2d. %s, %s channel%s", i, ic->name,
+			irc_rootmsg( irc, "%2d. %s, %s channel%s", i, ic->name,
 			             set_getstr( &ic->set, "type" ),
 			             ic->flags & IRC_CHANNEL_JOINED ? " (joined)" : "" );
@@ -609,5 +609,5 @@
 			i ++;
 		}
-		irc_usermsg( irc, "End of channel list" );
+		irc_rootmsg( irc, "End of channel list" );
 		
 		return;
@@ -623,5 +623,5 @@
 			cmd_set_real( irc, cmd + 1, &ic->set, NULL );
 		else
-			irc_usermsg( irc, "Could not find channel `%s'", cmd[1] );
+			irc_rootmsg( irc, "Could not find channel `%s'", cmd[1] );
 		
 		return;
@@ -640,9 +640,9 @@
 		    ic != ic->irc->default_channel )
 		{
-			irc_usermsg( irc, "Channel %s deleted.", ic->name );
+			irc_rootmsg( irc, "Channel %s deleted.", ic->name );
 			irc_channel_free( ic );
 		}
 		else
-			irc_usermsg( irc, "Couldn't remove channel (main channel %s or "
+			irc_rootmsg( irc, "Couldn't remove channel (main channel %s or "
 			                  "channels you're still in cannot be deleted).",
 			                  irc->default_channel->name );
@@ -650,5 +650,5 @@
 	else
 	{
-		irc_usermsg( irc, "Unknown command: %s [...] %s. Please use \x02help commands\x02 to get a list of available commands.", "channel", cmd[1] );
+		irc_rootmsg( irc, "Unknown command: %s [...] %s. Please use \x02help commands\x02 to get a list of available commands.", "channel", cmd[1] );
 	}
 }
@@ -668,10 +668,10 @@
 	if( !( a = account_get( irc->b, cmd[1] ) ) )
 	{
-		irc_usermsg( irc, "Invalid account" );
+		irc_rootmsg( irc, "Invalid account" );
 		return;
 	}
 	else if( !( a->ic && ( a->ic->flags & OPT_LOGGED_IN ) ) )
 	{
-		irc_usermsg( irc, "That account is not on-line" );
+		irc_rootmsg( irc, "That account is not on-line" );
 		return;
 	}
@@ -681,10 +681,10 @@
 		if( !nick_ok( cmd[3] ) )
 		{
-			irc_usermsg( irc, "The requested nick `%s' is invalid", cmd[3] );
+			irc_rootmsg( irc, "The requested nick `%s' is invalid", cmd[3] );
 			return;
 		}
 		else if( irc_user_by_name( irc, cmd[3] ) )
 		{
-			irc_usermsg( irc, "The requested nick `%s' already exists", cmd[3] );
+			irc_rootmsg( irc, "The requested nick `%s' already exists", cmd[3] );
 			return;
 		}
@@ -704,8 +704,8 @@
 		    strcmp( s, "group" ) == 0 &&
 		    ( group = set_getstr( &ic->set, "group" ) ) )
-			irc_usermsg( irc, "Adding `%s' to contact list (group %s)",
+			irc_rootmsg( irc, "Adding `%s' to contact list (group %s)",
 			             cmd[2], group );
 		else
-			irc_usermsg( irc, "Adding `%s' to contact list", cmd[2] );
+			irc_rootmsg( irc, "Adding `%s' to contact list", cmd[2] );
 		
 		a->prpl->add_buddy( a->ic, cmd[2], group );
@@ -720,5 +720,5 @@
 		if( ( bu = bee_user_new( irc->b, a->ic, cmd[2], BEE_USER_LOCAL ) ) &&
 		    ( iu = bu->ui_data ) )
-			irc_usermsg( irc, "Temporarily assigned nickname `%s' "
+			irc_rootmsg( irc, "Temporarily assigned nickname `%s' "
 			             "to contact `%s'", iu->nick, cmd[2] );
 	}
@@ -734,5 +734,5 @@
 	if( !( iu = irc_user_by_name( irc, cmd[1] ) ) || !( bu = iu->bu ) )
 	{
-		irc_usermsg( irc, "Buddy `%s' not found", cmd[1] );
+		irc_rootmsg( irc, "Buddy `%s' not found", cmd[1] );
 		return;
 	}
@@ -744,5 +744,5 @@
 		bee_user_free( irc->b, bu );
 	
-	irc_usermsg( irc, "Buddy `%s' (nick %s) removed from contact list", s, cmd[1] );
+	irc_rootmsg( irc, "Buddy `%s' (nick %s) removed from contact list", s, cmd[1] );
 	g_free( s );
 	
@@ -760,5 +760,5 @@
 		if( !iu || !iu->bu )
 		{
-			irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] );
+			irc_rootmsg( irc, "Nick `%s' does not exist", cmd[1] );
 			return;
 		}
@@ -768,10 +768,10 @@
 	else if( !( a = account_get( irc->b, cmd[1] ) ) )
 	{
-		irc_usermsg( irc, "Invalid account" );
+		irc_rootmsg( irc, "Invalid account" );
 		return;
 	}
 	else if( !( ( ic = a->ic ) && ( a->ic->flags & OPT_LOGGED_IN ) ) )
 	{
-		irc_usermsg( irc, "That account is not on-line" );
+		irc_rootmsg( irc, "That account is not on-line" );
 		return;
 	}
@@ -779,5 +779,5 @@
 	if( !ic->acc->prpl->get_info )
 	{
-		irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
+		irc_rootmsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
 	}
 	else
@@ -796,5 +796,5 @@
 	if( iu == NULL )
 	{
-		irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] );
+		irc_rootmsg( irc, "Nick `%s' does not exist", cmd[1] );
 	}
 	else if( del )
@@ -802,17 +802,17 @@
 		if( iu->bu )
 			bee_irc_user_nick_reset( iu );
-		irc_usermsg( irc, "Nickname reset to `%s'", iu->nick );
+		irc_rootmsg( irc, "Nickname reset to `%s'", iu->nick );
 	}
 	else if( iu == irc->user )
 	{
-		irc_usermsg( irc, "Use /nick to change your own nickname" );
+		irc_rootmsg( irc, "Use /nick to change your own nickname" );
 	}
 	else if( !nick_ok( cmd[2] ) )
 	{
-		irc_usermsg( irc, "Nick `%s' is invalid", cmd[2] );
+		irc_rootmsg( irc, "Nick `%s' is invalid", cmd[2] );
 	}
 	else if( ( old = irc_user_by_name( irc, cmd[2] ) ) && old != iu )
 	{
-		irc_usermsg( irc, "Nick `%s' already exists", cmd[2] );
+		irc_rootmsg( irc, "Nick `%s' already exists", cmd[2] );
 	}
 	else
@@ -820,5 +820,5 @@
 		if( !irc_user_set_nick( iu, cmd[2] ) )
 		{
-			irc_usermsg( irc, "Error while changing nick" );
+			irc_rootmsg( irc, "Error while changing nick" );
 			return;
 		}
@@ -836,5 +836,5 @@
 		}
 		
-		irc_usermsg( irc, "Nick successfully changed" );
+		irc_rootmsg( irc, "Nick successfully changed" );
 	}
 }
@@ -869,12 +869,12 @@
 			format = "%-32.32s  %-16.16s";
 		
-		irc_usermsg( irc, format, "Handle", "Nickname" );
+		irc_rootmsg( irc, format, "Handle", "Nickname" );
 		for( l = a->ic->deny; l; l = l->next )
 		{
 			bee_user_t *bu = bee_user_by_handle( irc->b, a->ic, l->data );
 			irc_user_t *iu = bu ? bu->ui_data : NULL;
-			irc_usermsg( irc, format, l->data, iu ? iu->nick : "(none)" );
-		}
-		irc_usermsg( irc, "End of list." );
+			irc_rootmsg( irc, format, l->data, iu ? iu->nick : "(none)" );
+		}
+		irc_rootmsg( irc, "End of list." );
 		
 		return;
@@ -885,5 +885,5 @@
 		if( !iu || !iu->bu )
 		{
-			irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] );
+			irc_rootmsg( irc, "Nick `%s' does not exist", cmd[1] );
 			return;
 		}
@@ -893,10 +893,10 @@
 	else if( !( a = account_get( irc->b, cmd[1] ) ) )
 	{
-		irc_usermsg( irc, "Invalid account" );
+		irc_rootmsg( irc, "Invalid account" );
 		return;
 	}
 	else if( !( ( ic = a->ic ) && ( a->ic->flags & OPT_LOGGED_IN ) ) )
 	{
-		irc_usermsg( irc, "That account is not on-line" );
+		irc_rootmsg( irc, "That account is not on-line" );
 		return;
 	}
@@ -904,5 +904,5 @@
 	if( !ic->acc->prpl->add_deny || !ic->acc->prpl->rem_permit )
 	{
-		irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
+		irc_rootmsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
 	}
 	else
@@ -910,5 +910,5 @@
 		imc_rem_allow( ic, cmd[2] );
 		imc_add_block( ic, cmd[2] );
-		irc_usermsg( irc, "Buddy `%s' moved from allow- to block-list", cmd[2] );
+		irc_rootmsg( irc, "Buddy `%s' moved from allow- to block-list", cmd[2] );
 	}
 }
@@ -929,12 +929,12 @@
 			format = "%-32.32s  %-16.16s";
 		
-		irc_usermsg( irc, format, "Handle", "Nickname" );
+		irc_rootmsg( irc, format, "Handle", "Nickname" );
 		for( l = a->ic->permit; l; l = l->next )
 		{
 			bee_user_t *bu = bee_user_by_handle( irc->b, a->ic, l->data );
 			irc_user_t *iu = bu ? bu->ui_data : NULL;
-			irc_usermsg( irc, format, l->data, iu ? iu->nick : "(none)" );
-		}
-		irc_usermsg( irc, "End of list." );
+			irc_rootmsg( irc, format, l->data, iu ? iu->nick : "(none)" );
+		}
+		irc_rootmsg( irc, "End of list." );
 		
 		return;
@@ -945,5 +945,5 @@
 		if( !iu || !iu->bu )
 		{
-			irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] );
+			irc_rootmsg( irc, "Nick `%s' does not exist", cmd[1] );
 			return;
 		}
@@ -953,10 +953,10 @@
 	else if( !( a = account_get( irc->b, cmd[1] ) ) )
 	{
-		irc_usermsg( irc, "Invalid account" );
+		irc_rootmsg( irc, "Invalid account" );
 		return;
 	}
 	else if( !( ( ic = a->ic ) && ( a->ic->flags & OPT_LOGGED_IN ) ) )
 	{
-		irc_usermsg( irc, "That account is not on-line" );
+		irc_rootmsg( irc, "That account is not on-line" );
 		return;
 	}
@@ -964,5 +964,5 @@
 	if( !ic->acc->prpl->rem_deny || !ic->acc->prpl->add_permit )
 	{
-		irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
+		irc_rootmsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
 	}
 	else
@@ -971,5 +971,5 @@
 		imc_add_allow( ic, cmd[2] );
 		
-		irc_usermsg( irc, "Buddy `%s' moved from block- to allow-list", cmd[2] );
+		irc_rootmsg( irc, "Buddy `%s' moved from block- to allow-list", cmd[2] );
 	}
 }
@@ -998,5 +998,5 @@
 			if( ( ++times >= 3 ) )
 			{
-				irc_usermsg( irc, "%s", msg[rand()%(sizeof(msg)/sizeof(char*))] );
+				irc_rootmsg( irc, "%s", msg[rand()%(sizeof(msg)/sizeof(char*))] );
 				last_irc = NULL;
 				times = 0;
@@ -1011,5 +1011,5 @@
 		}
 		
-		irc_usermsg( irc, "Did I ask you something?" );
+		irc_rootmsg( irc, "Did I ask you something?" );
 		return;
 	}
@@ -1021,5 +1021,5 @@
 		if( sscanf( cmd[1], "%d", &numq ) != 1 )
 		{
-			irc_usermsg( irc, "Invalid query number" );
+			irc_rootmsg( irc, "Invalid query number" );
 			return;
 		}
@@ -1031,5 +1031,5 @@
 		if( !q )
 		{
-			irc_usermsg( irc, "Uhm, I never asked you something like that..." );
+			irc_rootmsg( irc, "Uhm, I never asked you something like that..." );
 			return;
 		}
@@ -1071,5 +1071,5 @@
 		format = "%-16.16s  %-40.40s  %s";
 	
-	irc_usermsg( irc, format, "Nick", "Handle/Account", "Status" );
+	irc_rootmsg( irc, format, "Nick", "Handle/Account", "Status" );
 	
 	if( irc->root->last_channel &&
@@ -1094,5 +1094,5 @@
 			
 			g_snprintf( s, sizeof( s ) - 1, "%s %s(%s)", bu->handle, bu->ic->acc->prpl->name, bu->ic->acc->user );
-			irc_usermsg( irc, format, iu->nick, s, st );
+			irc_rootmsg( irc, format, iu->nick, s, st );
 		}
 		
@@ -1112,5 +1112,5 @@
 		{
 			g_snprintf( s, sizeof( s ) - 1, "%s %s(%s)", bu->handle, bu->ic->acc->prpl->name, bu->ic->acc->user );
-			irc_usermsg( irc, format, iu->nick, s, irc_user_get_away( iu ) );
+			irc_rootmsg( irc, format, iu->nick, s, irc_user_get_away( iu ) );
 		}
 		n_away ++;
@@ -1129,10 +1129,10 @@
 		{
 			g_snprintf( s, sizeof( s ) - 1, "%s %s(%s)", bu->handle, bu->ic->acc->prpl->name, bu->ic->acc->user );
-			irc_usermsg( irc, format, iu->nick, s, "Offline" );
+			irc_rootmsg( irc, format, iu->nick, s, "Offline" );
 		}
 		n_offline ++;
 	}
 	
-	irc_usermsg( irc, "%d buddies (%d available, %d away, %d offline)", n_online + n_away + n_offline, n_online, n_away, n_offline );
+	irc_rootmsg( irc, "%d buddies (%d available, %d away, %d offline)", n_online + n_away + n_offline, n_online, n_away, n_offline );
 }
 
@@ -1144,15 +1144,15 @@
 	if( !q )
 	{
-		irc_usermsg( irc, "There are no pending questions." );
-		return;
-	}
-	
-	irc_usermsg( irc, "Pending queries:" );
+		irc_rootmsg( irc, "There are no pending questions." );
+		return;
+	}
+	
+	irc_rootmsg( irc, "Pending queries:" );
 	
 	for( num = 0; q; q = q->next, num ++ )
 		if( q->ic ) /* Not necessary yet, but it might come later */
-			irc_usermsg( irc, "%d, %s(%s): %s", num, q->ic->acc->prpl->name, q->ic->acc->user, q->question );
-		else
-			irc_usermsg( irc, "%d, BitlBee: %s", num, q->question );
+			irc_rootmsg( irc, "%d, %s(%s): %s", num, q->ic->acc->prpl->name, q->ic->acc->user, q->question );
+		else
+			irc_rootmsg( irc, "%d, BitlBee: %s", num, q->question );
 }
 
@@ -1170,10 +1170,10 @@
 		if( !( acc = account_get( irc->b, cmd[2] ) ) )
 		{
-			irc_usermsg( irc, "Invalid account" );
+			irc_rootmsg( irc, "Invalid account" );
 			return;
 		}
 		else if( !acc->prpl->chat_join )
 		{
-			irc_usermsg( irc, "Named chatrooms not supported on that account." );
+			irc_rootmsg( irc, "Named chatrooms not supported on that account." );
 			return;
 		}
@@ -1205,5 +1205,5 @@
 		    set_setstr( &ic->set, "room", cmd[3] ) )
 		{
-			irc_usermsg( irc, "Chatroom successfully added." );
+			irc_rootmsg( irc, "Chatroom successfully added." );
 		}
 		else
@@ -1212,5 +1212,5 @@
 				irc_channel_free( ic );
 			
-			irc_usermsg( irc, "Could not add chatroom." );
+			irc_rootmsg( irc, "Could not add chatroom." );
 		}
 		g_free( channel );
@@ -1227,5 +1227,5 @@
 			if( !iu->bu->ic->acc->prpl->chat_with( iu->bu->ic, iu->bu->handle ) )
 			{
-				irc_usermsg( irc, "(Possible) failure while trying to open "
+				irc_rootmsg( irc, "(Possible) failure while trying to open "
 				                  "a groupchat with %s.", iu->nick );
 			}
@@ -1233,5 +1233,5 @@
 		else
 		{
-			irc_usermsg( irc, "Can't open a groupchat with %s.", cmd[2] );
+			irc_rootmsg( irc, "Can't open a groupchat with %s.", cmd[2] );
 		}
 	}
@@ -1240,10 +1240,10 @@
 	         g_strcasecmp( cmd[1], "del" ) == 0 )
 	{
-		irc_usermsg( irc, "Warning: The \002chat\002 command was mostly replaced with the \002channel\002 command." );
+		irc_rootmsg( irc, "Warning: The \002chat\002 command was mostly replaced with the \002channel\002 command." );
 		cmd_channel( irc, cmd );
 	}
 	else
 	{
-		irc_usermsg( irc, "Unknown command: %s %s. Please use \x02help commands\x02 to get a list of available commands.", "chat", cmd[1] );
+		irc_rootmsg( irc, "Unknown command: %s %s. Please use \x02help commands\x02 to get a list of available commands.", "chat", cmd[1] );
 	}
 }
@@ -1260,16 +1260,16 @@
 		
 		if( strchr( irc->umode, 'b' ) )
-			irc_usermsg( irc, "Group list:" );
+			irc_rootmsg( irc, "Group list:" );
 		
 		for( l = irc->b->groups; l; l = l->next )
 		{
 			bee_group_t *bg = l->data;
-			irc_usermsg( irc, "%d. %s", n ++, bg->name );
-		}
-		irc_usermsg( irc, "End of group list" );
-	}
-	else
-	{
-		irc_usermsg( irc, "Unknown command: %s %s. Please use \x02help commands\x02 to get a list of available commands.", "group", cmd[1] );
+			irc_rootmsg( irc, "%d. %s", n ++, bg->name );
+		}
+		irc_rootmsg( irc, "End of group list" );
+	}
+	else
+	{
+		irc_rootmsg( irc, "Unknown command: %s %s. Please use \x02help commands\x02 to get a list of available commands.", "group", cmd[1] );
 	}
 }
@@ -1284,5 +1284,5 @@
 	if( !files )
 	{
-		irc_usermsg( irc, "No pending transfers" );
+		irc_rootmsg( irc, "No pending transfers" );
 		return;
 	}
@@ -1305,5 +1305,5 @@
 		case LIST:
 			if ( file->status == FT_STATUS_LISTENING )
-				irc_usermsg( irc, 
+				irc_rootmsg( irc, 
 					"Pending file(id %d): %s (Listening...)", file->local_id, file->file_name);
 			else 
@@ -1314,5 +1314,5 @@
 					kb_per_s = file->bytes_transferred / 1024 / diff;
 					
-				irc_usermsg( irc, 
+				irc_rootmsg( irc, 
 					"Pending file(id %d): %s (%10zd/%zd kb, %d kb/s)", file->local_id, file->file_name, 
 					file->bytes_transferred/1024, file->file_size/1024, kb_per_s);
@@ -1322,5 +1322,5 @@
 			if( file->status == FT_STATUS_LISTENING )
 			{
-				irc_usermsg( irc, "Rejecting file transfer for %s", file->file_name );
+				irc_rootmsg( irc, "Rejecting file transfer for %s", file->file_name );
 				imcb_file_canceled( file->ic, file, "Denied by user" );
 			}
@@ -1329,5 +1329,5 @@
 			if( file->local_id == fid )
 			{
-				irc_usermsg( irc, "Canceling file transfer for %s", file->file_name );
+				irc_rootmsg( irc, "Canceling file transfer for %s", file->file_name );
 				imcb_file_canceled( file->ic, file, "Canceled by user" );
 			}
@@ -1339,5 +1339,5 @@
 static void cmd_nick( irc_t *irc, char **cmd )
 {
-	irc_usermsg( irc, "This command is deprecated. Try: account %s set display_name", cmd[1] );
+	irc_rootmsg( irc, "This command is deprecated. Try: account %s set display_name", cmd[1] );
 }
 
@@ -1354,5 +1354,5 @@
 	
 	if( msg )
-		irc_usermsg( irc, "%s: This seems to be your first time using this "
+		irc_rootmsg( irc, "%s: This seems to be your first time using this "
 		                  "this version of BitlBee. Here's a list of new "
 		                  "features you may like to know about:\n\n%s\n",
Index: storage_xml.c
===================================================================
--- storage_xml.c	(revision 3231485f983ea5bffe425205abfb059ee62b0168)
+++ storage_xml.c	(revision e67e513a16f3e545fd71eb176aac83d41a1dc271)
@@ -269,5 +269,5 @@
 	{
 		xd->unknown_tag ++;
-		irc_usermsg( irc, "Warning: Unknown XML tag found in configuration file (%s). "
+		irc_rootmsg( irc, "Warning: Unknown XML tag found in configuration file (%s). "
 		                  "This may happen when downgrading BitlBee versions. "
 		                  "This tag will be skipped and the information will be lost "
@@ -397,5 +397,5 @@
 			{
 				if( gerr && irc )
-					irc_usermsg( irc, "Error from XML-parser: %s", gerr->message );
+					irc_rootmsg( irc, "Error from XML-parser: %s", gerr->message );
 				
 				g_clear_error( &gerr );
@@ -473,5 +473,5 @@
 	if( ( fd = mkstemp( path ) ) < 0 )
 	{
-		irc_usermsg( irc, "Error while opening configuration file." );
+		irc_rootmsg( irc, "Error while opening configuration file." );
 		return STORAGE_OTHER_ERROR;
 	}
@@ -570,5 +570,5 @@
 	if( rename( path, path2 ) != 0 )
 	{
-		irc_usermsg( irc, "Error while renaming temporary configuration file." );
+		irc_rootmsg( irc, "Error while renaming temporary configuration file." );
 		
 		g_free( path2 );
@@ -585,5 +585,5 @@
 	g_free( pass_buf );
 	
-	irc_usermsg( irc, "Write error. Disk full?" );
+	irc_rootmsg( irc, "Write error. Disk full?" );
 	close( fd );
 	
