Index: account.c
===================================================================
--- account.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ account.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -224,5 +224,5 @@
 {
 	a->ic->wants_to_die = TRUE;
-	signoff( a->ic );
+	imc_logout( a->ic );
 	a->ic = NULL;
 	if( a->reconnect )
Index: irc.c
===================================================================
--- irc.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ irc.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -232,5 +232,5 @@
 		if (account->ic) {
 			account->ic->wants_to_die = TRUE;
-			signoff(account->ic);
+			imc_logout(account->ic);
 		} else if (account->reconnect) {
 			cancel_auto_reconnect(account);
Index: protocols/jabber/io.c
===================================================================
--- protocols/jabber/io.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/jabber/io.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -117,6 +117,6 @@
 		jd->fd = -1;
 		
-		hide_login_progress_error( ic, "Short write() to server" );
-		signoff( ic );
+		imc_error( ic, "Short write() to server" );
+		imc_logout( ic );
 		return FALSE;
 	}
@@ -160,6 +160,6 @@
 		if( xt_feed( jd->xt, buf, st ) < 0 )
 		{
-			hide_login_progress_error( ic, "XML stream error" );
-			signoff( ic );
+			imc_error( ic, "XML stream error" );
+			imc_logout( ic );
 			return FALSE;
 		}
@@ -203,7 +203,7 @@
 					if( set_getbool( &ic->acc->set, "tls" ) )
 					{
-						hide_login_progress( ic, "TLS is turned on for this "
+						imc_error( ic, "TLS is turned on for this "
 						          "account, but is not supported by this server" );
-						signoff( ic );
+						imc_logout( ic );
 						return FALSE;
 					}
@@ -216,6 +216,6 @@
 			else
 			{
-				hide_login_progress( ic, "XML stream error" );
-				signoff( ic );
+				imc_error( ic, "XML stream error" );
+				imc_logout( ic );
 				return FALSE;
 			}
@@ -227,6 +227,6 @@
 		jd->fd = -1;
 		
-		hide_login_progress_error( ic, "Error while reading from server" );
-		signoff( ic );
+		imc_error( ic, "Error while reading from server" );
+		imc_logout( ic );
 		return FALSE;
 	}
@@ -242,10 +242,10 @@
 	if( source == -1 )
 	{
-		hide_login_progress( ic, "Could not connect to server" );
-		signoff( ic );
+		imc_error( ic, "Could not connect to server" );
+		imc_logout( ic );
 		return FALSE;
 	}
 	
-	set_login_progress( ic, 1, "Connected to server, logging in" );
+	imc_log( ic, "Connected to server, logging in" );
 	
 	return jabber_start_stream( ic );
@@ -263,10 +263,10 @@
 		jd->ssl = NULL;
 		
-		hide_login_progress( ic, "Could not connect to server" );
-		signoff( ic );
+		imc_error( ic, "Could not connect to server" );
+		imc_logout( ic );
 		return FALSE;
 	}
 	
-	set_login_progress( ic, 1, "Connected to server, logging in" );
+	imc_log( ic, "Connected to server, logging in" );
 	
 	return jabber_start_stream( ic );
@@ -275,5 +275,5 @@
 static xt_status jabber_end_of_stream( struct xt_node *node, gpointer data )
 {
-	signoff( data );
+	imc_logout( data );
 	return XT_ABORT;
 }
@@ -297,6 +297,6 @@
 		if( c && ( !trytls && !set_getbool( &ic->acc->set, "tls" ) ) )
 		{
-			hide_login_progress( ic, "Server requires TLS connections, but TLS is turned off for this account" );
-			signoff( ic );
+			imc_error( ic, "Server requires TLS connections, but TLS is turned off for this account" );
+			imc_logout( ic );
 			
 			return XT_ABORT;
@@ -327,6 +327,6 @@
 		if( !trytls && set_getbool( &ic->acc->set, "tls" ) )
 		{
-			hide_login_progress( ic, "TLS is turned on for this account, but is not supported by this server" );
-			signoff( ic );
+			imc_error( ic, "TLS is turned on for this account, but is not supported by this server" );
+			imc_logout( ic );
 			
 			return XT_ABORT;
@@ -417,5 +417,5 @@
 	jd->w_inpa = jd->r_inpa = 0;
 	
-	set_login_progress( ic, 1, "Converting stream to TLS" );
+	imc_log( ic, "Converting stream to TLS" );
 	
 	jd->ssl = ssl_starttls( jd->fd, jabber_connected_ssl, ic );
@@ -452,6 +452,6 @@
 	if( type == NULL )
 	{
-		hide_login_progress_error( ic, "Unknown stream error reported by server" );
-		signoff( ic );
+		imc_error( ic, "Unknown stream error reported by server" );
+		imc_logout( ic );
 		return XT_ABORT;
 	}
@@ -462,5 +462,5 @@
 	if( strcmp( type, "conflict" ) == 0 )
 	{
-		hide_login_progress( ic, "Account and resource used from a different location" );
+		imc_error( ic, "Account and resource used from a different location" );
 		ic->wants_to_die = TRUE;
 	}
@@ -468,9 +468,9 @@
 	{
 		s = g_strdup_printf( "Stream error: %s%s%s", type, text ? ": " : "", text ? text : "" );
-		hide_login_progress_error( ic, s );
+		imc_error( ic, s );
 		g_free( s );
 	}
 	
-	signoff( ic );
+	imc_logout( ic );
 	
 	return XT_ABORT;
Index: protocols/jabber/iq.c
===================================================================
--- protocols/jabber/iq.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/jabber/iq.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -39,6 +39,6 @@
 	if( !type )
 	{
-		hide_login_progress_error( ic, "Received IQ packet without type." );
-		signoff( ic );
+		imc_error( ic, "Received IQ packet without type." );
+		imc_logout( ic );
 		return XT_ABORT;
 	}
@@ -60,5 +60,5 @@
 		
 		if( entry == NULL )
-			serv_got_crap( ic, "WARNING: Received IQ-%s packet with unknown/expired ID %s!", type, s );
+			imc_log( ic, "WARNING: Received IQ-%s packet with unknown/expired ID %s!", type, s );
 		else if( entry->func )
 			return entry->func( ic, node, entry->node );
@@ -69,5 +69,5 @@
 		    !( s = xt_find_attr( c, "xmlns" ) ) )
 		{
-			serv_got_crap( ic, "WARNING: Received incomplete IQ-%s packet", type );
+			imc_log( ic, "WARNING: Received incomplete IQ-%s packet", type );
 			return XT_HANDLED;
 		}
@@ -132,5 +132,5 @@
 		    !( s = xt_find_attr( c, "xmlns" ) ) )
 		{
-			serv_got_crap( ic, "WARNING: Received incomplete IQ-%s packet", type );
+			imc_log( ic, "WARNING: Received incomplete IQ-%s packet", type );
 			return XT_HANDLED;
 		}
@@ -154,5 +154,5 @@
 			else
 			{
-				serv_got_crap( ic, "WARNING: %s tried to fake a roster push!", s ? s : "(unknown)" );
+				imc_log( ic, "WARNING: %s tried to fake a roster push!", s ? s : "(unknown)" );
 				
 				xt_free_node( reply );
@@ -219,6 +219,6 @@
 	if( !( query = xt_find_node( node->children, "query" ) ) )
 	{
-		serv_got_crap( ic, "WARNING: Received incomplete IQ packet while authenticating" );
-		signoff( ic );
+		imc_log( ic, "WARNING: Received incomplete IQ packet while authenticating" );
+		imc_logout( ic );
 		return XT_HANDLED;
 	}
@@ -258,6 +258,6 @@
 		xt_free_node( reply );
 		
-		hide_login_progress( ic, "Can't find suitable authentication method" );
-		signoff( ic );
+		imc_error( ic, "Can't find suitable authentication method" );
+		imc_logout( ic );
 		return XT_ABORT;
 	}
@@ -277,6 +277,6 @@
 	if( !( type = xt_find_attr( node, "type" ) ) )
 	{
-		serv_got_crap( ic, "WARNING: Received incomplete IQ packet while authenticating" );
-		signoff( ic );
+		imc_log( ic, "WARNING: Received incomplete IQ packet while authenticating" );
+		imc_logout( ic );
 		return XT_HANDLED;
 	}
@@ -284,6 +284,6 @@
 	if( strcmp( type, "error" ) == 0 )
 	{
-		hide_login_progress( ic, "Authentication failure" );
-		signoff( ic );
+		imc_error( ic, "Authentication failure" );
+		imc_logout( ic );
 		return XT_ABORT;
 	}
@@ -311,5 +311,5 @@
 		if( c && c->text_len && ( s = strchr( c->text, '/' ) ) &&
 		    strcmp( s + 1, set_getstr( &ic->acc->set, "resource" ) ) != 0 )
-			serv_got_crap( ic, "Server changed session resource string to `%s'", s + 1 );
+			imc_log( ic, "Server changed session resource string to `%s'", s + 1 );
 		
 		jd->flags &= ~JFLAG_WAIT_BIND;
@@ -334,5 +334,5 @@
 	int st;
 	
-	set_login_progress( ic, 1, "Authenticated, requesting buddy list" );
+	imc_log( ic, "Authenticated, requesting buddy list" );
 	
 	node = xt_new_node( "query", NULL, NULL );
@@ -353,5 +353,5 @@
 	if( !( query = xt_find_node( node->children, "query" ) ) )
 	{
-		serv_got_crap( ic, "WARNING: Received NULL roster packet" );
+		imc_log( ic, "WARNING: Received NULL roster packet" );
 		return XT_HANDLED;
 	}
@@ -397,5 +397,5 @@
 	
 	if( initial )
-		account_online( ic );
+		imc_connected( ic );
 	
 	return XT_HANDLED;
@@ -428,5 +428,5 @@
 	{
 		s = xt_find_attr( orig, "to" ); /* If this returns NULL something's wrong.. */
-		serv_got_crap( ic, "Could not retrieve vCard of %s", s ? s : "(NULL)" );
+		imc_log( ic, "Could not retrieve vCard of %s", s ? s : "(NULL)" );
 		return XT_HANDLED;
 	}
@@ -536,5 +536,5 @@
 	/* *sigh* */
 	
-	serv_got_crap( ic, reply->str );
+	imc_log( ic, reply->str );
 	g_string_free( reply, TRUE );
 	
Index: protocols/jabber/jabber.c
===================================================================
--- protocols/jabber/jabber.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/jabber/jabber.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -59,5 +59,5 @@
 static void jabber_login( account_t *acc )
 {
-	struct im_connection *ic = new_gaim_conn( acc );
+	struct im_connection *ic = imc_new( acc );
 	struct jabber_data *jd = g_new0( struct jabber_data, 1 );
 	struct ns_srv_reply *srv = NULL;
@@ -72,6 +72,6 @@
 	if( jd->server == NULL )
 	{
-		hide_login_progress( ic, "Incomplete account name (format it like <username@jabberserver.name>)" );
-		signoff( ic );
+		imc_error( ic, "Incomplete account name (format it like <username@jabberserver.name>)" );
+		imc_logout( ic );
 		return;
 	}
@@ -159,12 +159,12 @@
 		connect_to = jd->server;
 	
-	set_login_progress( ic, 0, "Connecting" );
+	imc_log( ic, "Connecting" );
 	
 	if( set_getint( &acc->set, "port" ) < JABBER_PORT_MIN ||
 	    set_getint( &acc->set, "port" ) > JABBER_PORT_MAX )
 	{
-		serv_got_crap( ic, "Incorrect port number, must be in the %d-%d range",
+		imc_log( ic, "Incorrect port number, must be in the %d-%d range",
 		               JABBER_PORT_MIN, JABBER_PORT_MAX );
-		signoff( ic );
+		imc_logout( ic );
 		return;
 	}
@@ -186,6 +186,6 @@
 	if( jd->fd == -1 )
 	{
-		hide_login_progress( ic, "Could not connect to server" );
-		signoff( ic );
+		imc_error( ic, "Could not connect to server" );
+		imc_logout( ic );
 	}
 }
@@ -285,5 +285,5 @@
 	while( bud )
 	{
-		serv_got_crap( ic, "Buddy %s (%d) information:\nAway state: %s\nAway message: %s",
+		imc_log( ic, "Buddy %s (%d) information:\nAway state: %s\nAway message: %s",
 		                   bud->full_jid, bud->priority,
 		                   bud->away_state ? bud->away_state->full_name : "(none)",
Index: protocols/jabber/presence.c
===================================================================
--- protocols/jabber/presence.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/jabber/presence.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -41,5 +41,5 @@
 		{
 			if( set_getbool( &ic->irc->set, "debug" ) )
-				serv_got_crap( ic, "WARNING: Could not handle presence information from JID: %s", from );
+				imc_log( ic, "WARNING: Could not handle presence information from JID: %s", from );
 			return XT_HANDLED;
 		}
@@ -74,5 +74,5 @@
 		{
 			if( set_getbool( &ic->irc->set, "debug" ) )
-				serv_got_crap( ic, "WARNING: Received presence information from unknown JID: %s", from );
+				imc_log( ic, "WARNING: Received presence information from unknown JID: %s", from );
 			return XT_HANDLED;
 		}
@@ -103,5 +103,5 @@
 	{
 		/* Not sure about this one, actually... */
-		serv_got_crap( ic, "%s just accepted your authorization request", from );
+		imc_log( ic, "%s just accepted your authorization request", from );
 	}
 	else if( strcmp( type, "unsubscribe" ) == 0 || strcmp( type, "unsubscribed" ) == 0 )
Index: protocols/jabber/sasl.c
===================================================================
--- protocols/jabber/sasl.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/jabber/sasl.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -38,5 +38,5 @@
 		   IQ authentication. Strange things happen when you try
 		   to do both... */
-		serv_got_crap( ic, "XMPP 1.0 non-compliant server seems to support SASL, please report this as a BitlBee bug!" );
+		imc_log( ic, "XMPP 1.0 non-compliant server seems to support SASL, please report this as a BitlBee bug!" );
 		return XT_HANDLED;
 	}
@@ -45,5 +45,5 @@
 	if( !s || strcmp( s, XMLNS_SASL ) != 0 )
 	{
-		signoff( ic );
+		imc_logout( ic );
 		return XT_ABORT;
 	}
@@ -62,6 +62,6 @@
 	if( !sup_plain && !sup_digest )
 	{
-		hide_login_progress( ic, "No known SASL authentication schemes supported" );
-		signoff( ic );
+		imc_error( ic, "No known SASL authentication schemes supported" );
+		imc_logout( ic );
 		return XT_ABORT;
 	}
@@ -279,6 +279,6 @@
 
 error:
-	hide_login_progress( ic, "Incorrect SASL challenge received" );
-	signoff( ic );
+	imc_error( ic, "Incorrect SASL challenge received" );
+	imc_logout( ic );
 
 silent_error:
@@ -303,5 +303,5 @@
 	if( !s || strcmp( s, XMLNS_SASL ) != 0 )
 	{
-		signoff( ic );
+		imc_logout( ic );
 		return XT_ABORT;
 	}
@@ -309,11 +309,11 @@
 	if( strcmp( node->name, "success" ) == 0 )
 	{
-		set_login_progress( ic, 1, "Authentication finished" );
+		imc_log( ic, "Authentication finished" );
 		jd->flags |= JFLAG_AUTHENTICATED | JFLAG_STREAM_RESTART;
 	}
 	else if( strcmp( node->name, "failure" ) == 0 )
 	{
-		hide_login_progress( ic, "Authentication failure" );
-		signoff( ic );
+		imc_error( ic, "Authentication failure" );
+		imc_logout( ic );
 		return XT_ABORT;
 	}
Index: protocols/msn/msn.c
===================================================================
--- protocols/msn/msn.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/msn/msn.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -39,5 +39,5 @@
 static void msn_login( account_t *acc )
 {
-	struct im_connection *ic = new_gaim_conn( acc );
+	struct im_connection *ic = imc_new( acc );
 	struct msn_data *md = g_new0( struct msn_data, 1 );
 	
@@ -47,16 +47,16 @@
 	if( strchr( acc->user, '@' ) == NULL )
 	{
-		hide_login_progress( ic, "Invalid account name" );
-		signoff( ic );
+		imc_error( ic, "Invalid account name" );
+		imc_logout( ic );
 		return;
 	}
 	
-	set_login_progress( ic, 1, "Connecting" );
+	imc_log( ic, "Connecting" );
 	
 	md->fd = proxy_connect( "messenger.hotmail.com", 1863, msn_ns_connected, ic );
 	if( md->fd < 0 )
 	{
-		hide_login_progress( ic, "Could not connect to server" );
-		signoff( ic );
+		imc_error( ic, "Could not connect to server" );
+		imc_logout( ic );
 		return;
 	}
@@ -96,5 +96,5 @@
 				m = l->data;
 			
-				serv_got_crap( ic, "Warning: Closing down MSN connection with unsent message to %s, you'll have to resend it.", m->who );
+				imc_log( ic, "Warning: Closing down MSN connection with unsent message to %s, you'll have to resend it.", m->who );
 				g_free( m->who );
 				g_free( m->text );
@@ -228,5 +228,5 @@
 {
 	/* Just make an URL and let the user fetch the info */
-	serv_got_crap( ic, "%s\n%s: %s%s", _("User Info"), _("For now, fetch yourself"), PROFILE_URL, who );
+	imc_log( ic, "%s\n%s: %s%s", _("User Info"), _("For now, fetch yourself"), PROFILE_URL, who );
 }
 
@@ -373,5 +373,5 @@
 	if( strlen( value ) > 129 )
 	{
-		serv_got_crap( ic, "Maximum name length exceeded" );
+		imc_log( ic, "Maximum name length exceeded" );
 		return NULL;
 	}
Index: protocols/msn/msn_util.c
===================================================================
--- protocols/msn/msn_util.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/msn/msn_util.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -36,6 +36,6 @@
 	if( st != len )
 	{
-		hide_login_progress_error( ic, "Short write() to main server" );
-		signoff( ic );
+		imc_error( ic, "Short write() to main server" );
+		imc_logout( ic );
 		return( 0 );
 	}
@@ -46,5 +46,5 @@
 int msn_logged_in( struct im_connection *ic )
 {
-	account_online( ic );
+	imc_connected( ic );
 	
 	return( 0 );
Index: protocols/msn/ns.c
===================================================================
--- protocols/msn/ns.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/msn/ns.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -47,6 +47,6 @@
 	if( source == -1 )
 	{
-		hide_login_progress( ic, "Could not connect to server" );
-		signoff( ic );
+		imc_error( ic, "Could not connect to server" );
+		imc_logout( ic );
 		return FALSE;
 	}
@@ -76,5 +76,5 @@
 	{
 		ic->inpa = b_input_add( md->fd, GAIM_INPUT_READ, msn_ns_callback, ic );
-		set_login_progress( ic, 1, "Connected to server, waiting for reply" );
+		imc_log( ic, "Connected to server, waiting for reply" );
 	}
 	
@@ -89,6 +89,6 @@
 	if( msn_handler( md->handler ) == -1 ) /* Don't do this on ret == 0, it's already done then. */
 	{
-		hide_login_progress( ic, "Error while reading from server" );
-		signoff( ic );
+		imc_error( ic, "Error while reading from server" );
+		imc_logout( ic );
 		
 		return FALSE;
@@ -114,6 +114,6 @@
 		if( cmd[2] && strncmp( cmd[2], "MSNP8", 5 ) != 0 )
 		{
-			hide_login_progress( ic, "Unsupported protocol" );
-			signoff( ic );
+			imc_error( ic, "Unsupported protocol" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -143,6 +143,6 @@
 			if( !server )
 			{
-				hide_login_progress_error( ic, "Syntax error" );
-				signoff( ic );
+				imc_error( ic, "Syntax error" );
+				imc_logout( ic );
 				return( 0 );
 			}
@@ -151,5 +151,5 @@
 			server = cmd[3];
 			
-			set_login_progress( ic, 1, "Transferring to other server" );
+			imc_log( ic, "Transferring to other server" );
 			
 			md->fd = proxy_connect( server, port, msn_ns_connected, ic );
@@ -162,6 +162,6 @@
 			if( !server )
 			{
-				hide_login_progress_error( ic, "Syntax error" );
-				signoff( ic );
+				imc_error( ic, "Syntax error" );
+				imc_logout( ic );
 				return( 0 );
 			}
@@ -172,6 +172,6 @@
 			if( strcmp( cmd[4], "CKI" ) != 0 )
 			{
-				hide_login_progress_error( ic, "Unknown authentication method for switchboard" );
-				signoff( ic );
+				imc_error( ic, "Unknown authentication method for switchboard" );
+				imc_logout( ic );
 				return( 0 );
 			}
@@ -204,6 +204,6 @@
 		else
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -216,6 +216,6 @@
 			if( !passport_get_id( msn_auth_got_passport_id, ic, ic->username, ic->password, cmd[4] ) )
 			{
-				hide_login_progress_error( ic, "Error while contacting Passport server" );
-				signoff( ic );
+				imc_error( ic, "Error while contacting Passport server" );
+				imc_logout( ic );
 				return( 0 );
 			}
@@ -236,5 +236,5 @@
 			}
 			
-			set_login_progress( ic, 1, "Authenticated, getting buddy list" );
+			imc_log( ic, "Authenticated, getting buddy list" );
 			
 			g_snprintf( buf, sizeof( buf ), "SYN %d 0\r\n", ++md->trId );
@@ -243,6 +243,6 @@
 		else
 		{
-			hide_login_progress( ic, "Unknown authentication type" );
-			signoff( ic );
+			imc_error( ic, "Unknown authentication type" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -252,6 +252,6 @@
 		if( num_parts != 4 )
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -261,6 +261,6 @@
 		if( md->handler->msglen <= 0 )
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -292,6 +292,6 @@
 		if( num_parts != 4 && num_parts != 5 )
 		{
-			hide_login_progress( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -328,5 +328,5 @@
 			if( ic->flags & OPT_LOGGED_IN )
 			{
-				serv_got_crap( ic, "Successfully transferred to different server" );
+				imc_log( ic, "Successfully transferred to different server" );
 				g_snprintf( buf, sizeof( buf ), "CHG %d %s %d\r\n", ++md->trId, md->away_state->code, 0 );
 				return( msn_write( ic, buf, strlen( buf ) ) );
@@ -344,6 +344,6 @@
 		if( num_parts != 4 )
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -363,6 +363,6 @@
 		if( num_parts != 3 )
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -385,6 +385,6 @@
 		if( num_parts != 6 )
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -413,6 +413,6 @@
 		if( num_parts != 5 )
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -438,6 +438,6 @@
 		if( num_parts != 7 )
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -448,6 +448,6 @@
 		if( !server )
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -458,6 +458,6 @@
 		if( strcmp( cmd[3], "CKI" ) != 0 )
 		{
-			hide_login_progress_error( ic, "Unknown authentication method for switchboard" );
-			signoff( ic );
+			imc_error( ic, "Unknown authentication method for switchboard" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -478,6 +478,6 @@
 			if( strchr( cmd[4], '@' ) == NULL )
 			{
-				hide_login_progress_error( ic, "Syntax error" );
-				signoff( ic );
+				imc_error( ic, "Syntax error" );
+				imc_logout( ic );
 				return( 0 );
 			}
@@ -499,17 +499,17 @@
 		if( cmd[1] && strcmp( cmd[1], "OTH" ) == 0 )
 		{
-			hide_login_progress_error( ic, "Someone else logged in with your account" );
+			imc_error( ic, "Someone else logged in with your account" );
 			ic->wants_to_die = 1;
 		}
 		else if( cmd[1] && strcmp( cmd[1], "SSD" ) == 0 )
 		{
-			hide_login_progress_error( ic, "Terminating session because of server shutdown" );
+			imc_error( ic, "Terminating session because of server shutdown" );
 		}
 		else
 		{
-			hide_login_progress_error( ic, "Session terminated by remote server (reason unknown)" );
-		}
-		
-		signoff( ic );
+			imc_error( ic, "Session terminated by remote server (reason unknown)" );
+		}
+		
+		imc_logout( ic );
 		return( 0 );
 	}
@@ -518,6 +518,6 @@
 		if( num_parts != 5 )
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -546,5 +546,5 @@
 	else if( strcmp( cmd[0], "IPG" ) == 0 )
 	{
-		do_error_dialog( ic, "Received IPG command, we don't handle them yet.", "MSN" );
+		imc_error( ic, "Received IPG command, we don't handle them yet." );
 		
 		md->handler->msglen = atoi( cmd[1] );
@@ -552,6 +552,6 @@
 		if( md->handler->msglen <= 0 )
 		{
-			hide_login_progress_error( ic, "Syntax error" );
-			signoff( ic );
+			imc_error( ic, "Syntax error" );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -562,10 +562,9 @@
 		const struct msn_status_code *err = msn_status_by_number( num );
 		
-		g_snprintf( buf, sizeof( buf ), "Error reported by MSN server: %s", err->text );
-		do_error_dialog( ic, buf, "MSN" );
+		imc_error( ic, "Error reported by MSN server: %s", err->text );
 		
 		if( err->flags & STATUS_FATAL )
 		{
-			signoff( ic );
+			imc_logout( ic );
 			return( 0 );
 		}
@@ -617,5 +616,5 @@
 				{
 					if( arg1 )
-						serv_got_crap( ic, "The server is going down for maintenance in %s minutes.", arg1 );
+						imc_log( ic, "The server is going down for maintenance in %s minutes.", arg1 );
 				}
 				
@@ -634,5 +633,5 @@
 				if( inbox && folders )
 				{
-					serv_got_crap( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders );
+					imc_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders );
 				}
 			}
@@ -644,5 +643,5 @@
 				if( from && fromname )
 				{
-					serv_got_crap( ic, "Received an e-mail message from %s <%s>.", fromname, from );
+					imc_log( ic, "Received an e-mail message from %s <%s>.", fromname, from );
 				}
 			}
@@ -677,6 +676,6 @@
 		                       rep->error_string ? rep->error_string : "Unknown error" );
 		
-		hide_login_progress( ic, err );
-		signoff( ic );
+		imc_error( ic, err );
+		imc_logout( ic );
 		
 		g_free( err );
Index: protocols/msn/sb.c
===================================================================
--- protocols/msn/sb.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/msn/sb.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -222,5 +222,5 @@
 		g_slist_free( sb->msgq );
 		
-		serv_got_crap( ic, "Warning: Closing down MSN switchboard connection with "
+		imc_log( ic, "Warning: Closing down MSN switchboard connection with "
 		                   "unsent message to %s, you'll have to resend it.",
 		                   sb->who ? sb->who : "(unknown)" );
@@ -321,6 +321,6 @@
 	if( strcmp( cmd[0], "XFR" ) == 0 )
 	{
-		hide_login_progress_error( ic, "Received an XFR from a switchboard server, unable to comply! This is likely to be a bug, please report it!" );
-		signoff( ic );
+		imc_error( ic, "Received an XFR from a switchboard server, unable to comply! This is likely to be a bug, please report it!" );
+		imc_logout( ic );
 		return( 0 );
 	}
@@ -528,6 +528,5 @@
 		const struct msn_status_code *err = msn_status_by_number( num );
 		
-		g_snprintf( buf, sizeof( buf ), "Error reported by switchboard server: %s", err->text );
-		do_error_dialog( ic, buf, "MSN" );
+		imc_error( ic, "Error reported by switchboard server: %s", err->text );
 		
 		if( err->flags & STATUS_SB_FATAL )
@@ -538,5 +537,5 @@
 		else if( err->flags & STATUS_FATAL )
 		{
-			signoff( ic );
+			imc_logout( ic );
 			return 0;
 		}
Index: protocols/nogaim.c
===================================================================
--- protocols/nogaim.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/nogaim.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -145,5 +145,5 @@
 /* multi.c */
 
-struct im_connection *new_gaim_conn( account_t *acc )
+struct im_connection *imc_new( account_t *acc )
 {
 	struct im_connection *ic;
@@ -164,5 +164,5 @@
 }
 
-void destroy_gaim_conn( struct im_connection *ic )
+void imc_free( struct im_connection *ic )
 {
 	account_t *a;
@@ -180,22 +180,5 @@
 }
 
-void set_login_progress( struct im_connection *ic, int step, char *msg )
-{
-	serv_got_crap( ic, "Logging in: %s", msg );
-}
-
-/* Errors *while* logging in */
-void hide_login_progress( struct im_connection *ic, char *msg )
-{
-	serv_got_crap( ic, "Login error: %s", msg );
-}
-
-/* Errors *after* logging in */
-void hide_login_progress_error( struct im_connection *ic, char *msg )
-{
-	serv_got_crap( ic, "Logged out: %s", msg );
-}
-
-void serv_got_crap( struct im_connection *ic, char *format, ... )
+static void serv_got_crap( struct im_connection *ic, char *format, ... )
 {
 	va_list params;
@@ -225,4 +208,38 @@
 }
 
+void imc_log( struct im_connection *ic, char *format, ... )
+{
+	va_list params;
+	char *text;
+	
+	va_start( params, format );
+	text = g_strdup_vprintf( format, params );
+	va_end( params );
+	
+	if( ic->flags & OPT_LOGGED_IN )
+		serv_got_crap( ic, "%s", text );
+	else
+		serv_got_crap( ic, "Logging in: %s", text );
+	
+	g_free( text );
+}
+
+void imc_error( struct im_connection *ic, char *format, ... )
+{
+	va_list params;
+	char *text;
+	
+	va_start( params, format );
+	text = g_strdup_vprintf( format, params );
+	va_end( params );
+	
+	if( ic->flags & OPT_LOGGED_IN )
+		serv_got_crap( ic, "Error: %s", text );
+	else
+		serv_got_crap( ic, "Couldn't log in: %s", text );
+	
+	g_free( text );
+}
+
 static gboolean send_keepalive( gpointer d, gint fd, b_input_condition cond )
 {
@@ -235,5 +252,5 @@
 }
 
-void account_online( struct im_connection *ic )
+void imc_connected( struct im_connection *ic )
 {
 	user_t *u;
@@ -247,5 +264,5 @@
 	u = user_find( ic->irc, ic->irc->nick );
 	
-	serv_got_crap( ic, "Logged in" );
+	imc_log( ic, "Logged in" );
 	
 	ic->keepalive = b_timeout_add( 60000, send_keepalive, ic );
@@ -274,5 +291,5 @@
 }
 
-void signoff( struct im_connection *ic )
+void imc_logout( struct im_connection *ic )
 {
 	irc_t *irc = ic->irc;
@@ -287,5 +304,5 @@
 		ic->flags |= OPT_LOGGING_OUT;
 	
-	serv_got_crap( ic, "Signing off.." );
+	imc_log( ic, "Signing off.." );
 	
 	b_event_remove( ic->keepalive );
@@ -321,25 +338,13 @@
 		int delay = set_getint( &irc->set, "auto_reconnect_delay" );
 		
-		serv_got_crap( ic, "Reconnecting in %d seconds..", delay );
+		imc_log( ic, "Reconnecting in %d seconds..", delay );
 		a->reconnect = b_timeout_add( delay * 1000, auto_reconnect, a );
 	}
 	
-	destroy_gaim_conn( ic );
+	imc_free( ic );
 }
 
 
 /* dialogs.c */
-
-void do_error_dialog( struct im_connection *ic, char *msg, char *title )
-{
-	if( msg && title )
-		serv_got_crap( ic, "Error: %s: %s", title, msg );
-	else if( msg )
-		serv_got_crap( ic, "Error: %s", msg );
-	else if( title )
-		serv_got_crap( ic, "Error: %s", title );
-	else
-		serv_got_crap( ic, "Error" );
-}
 
 void do_ask_dialog( struct im_connection *ic, char *msg, void *data, void *doit, void *dont )
@@ -359,10 +364,10 @@
 	
 	if( set_getbool( &irc->set, "debug" ) && 0 ) /* This message is too useless */
-		serv_got_crap( ic, "Receiving user add from handle: %s", handle );
+		imc_log( ic, "Receiving user add from handle: %s", handle );
 	
 	if( user_findhandle( ic, handle ) )
 	{
 		if( set_getbool( &irc->set, "debug" ) )
-			serv_got_crap( ic, "User already exists, ignoring add request: %s", handle );
+			imc_log( ic, "User already exists, ignoring add request: %s", handle );
 		
 		return;
@@ -452,5 +457,5 @@
 		
 		if( ( ic->flags & OPT_LOGGED_IN ) && set_getbool( &ic->irc->set, "display_namechanges" ) )
-			serv_got_crap( ic, "User `%s' changed name to `%s'", u->nick, u->realname );
+			imc_log( ic, "User `%s' changed name to `%s'", u->nick, u->realname );
 	}
 }
@@ -516,6 +521,6 @@
 			if( set_getbool( &ic->irc->set, "debug" ) || g_strcasecmp( set_getstr( &ic->irc->set, "handle_unknown" ), "ignore" ) != 0 )
 			{
-				serv_got_crap( ic, "serv_got_update() for handle %s:", handle );
-				serv_got_crap( ic, "loggedin = %d, type = %d", loggedin, type );
+				imc_log( ic, "serv_got_update() for handle %s:", handle );
+				imc_log( ic, "loggedin = %d, type = %d", loggedin, type );
 			}
 			
@@ -597,5 +602,5 @@
 		{
 			if( set_getbool( &irc->set, "debug" ) )
-				serv_got_crap( ic, "Ignoring message from unknown handle %s", handle );
+				imc_log( ic, "Ignoring message from unknown handle %s", handle );
 			
 			return;
@@ -619,5 +624,5 @@
 		else
 		{
-			serv_got_crap( ic, "Message from unknown handle %s:", handle );
+			imc_log( ic, "Message from unknown handle %s:", handle );
 			u = user_find( irc, irc->mynick );
 		}
@@ -689,5 +694,5 @@
 	
 	if( set_getbool( &ic->irc->set, "debug" ) )
-		serv_got_crap( ic, "You were removed from conversation 0x%x", (int) c );
+		imc_log( ic, "You were removed from conversation 0x%x", (int) c );
 	
 	if( c )
@@ -737,5 +742,5 @@
 		irc_privmsg( ic->irc, u, "PRIVMSG", c->channel, "", msg );
 	else
-		serv_got_crap( ic, "Message from/to conversation %s@0x%x (unknown conv/user): %s", who, (int) c, msg );
+		imc_log( ic, "Message from/to conversation %s@0x%x (unknown conv/user): %s", who, (int) c, msg );
 }
 
@@ -759,5 +764,5 @@
 	
 	if( set_getbool( &ic->irc->set, "debug" ) )
-		serv_got_crap( ic, "Creating new conversation: (id=0x%x,handle=%s)", (int) c, handle );
+		imc_log( ic, "Creating new conversation: (id=0x%x,handle=%s)", (int) c, handle );
 	
 	return c;
@@ -773,5 +778,5 @@
 	
 	if( set_getbool( &b->ic->irc->set, "debug" ) )
-		serv_got_crap( b->ic, "User %s added to conversation 0x%x", handle, (int) b );
+		imc_log( b->ic, "User %s added to conversation 0x%x", handle, (int) b );
 	
 	/* It might be yourself! */
@@ -807,5 +812,5 @@
 	
 	if( set_getbool( &b->ic->irc->set, "debug" ) )
-		serv_got_crap( b->ic, "User %s removed from conversation 0x%x (%s)", handle, (int) b, reason ? reason : "" );
+		imc_log( b->ic, "User %s removed from conversation 0x%x (%s)", handle, (int) b, reason ? reason : "" );
 	
 	/* It might be yourself! */
@@ -1005,5 +1010,5 @@
 			ic->acc->prpl->set_away( ic, s, away );
 			if( set_getbool( &ic->irc->set, "debug" ) )
-				serv_got_crap( ic, "Setting away state to %s", s );
+				imc_log( ic, "Setting away state to %s", s );
 		}
 		else
Index: protocols/nogaim.h
===================================================================
--- protocols/nogaim.h	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/nogaim.h	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -206,15 +206,12 @@
 
 /* multi.c */
-G_MODULE_EXPORT struct im_connection *new_gaim_conn( account_t *acc );
-G_MODULE_EXPORT void destroy_gaim_conn( struct im_connection *ic );
-G_MODULE_EXPORT void set_login_progress( struct im_connection *ic, int step, char *msg );
-G_MODULE_EXPORT void hide_login_progress( struct im_connection *ic, char *msg );
-G_MODULE_EXPORT void hide_login_progress_error( struct im_connection *ic, char *msg );
-G_MODULE_EXPORT void serv_got_crap( struct im_connection *ic, char *format, ... ) G_GNUC_PRINTF( 2, 3 );
-G_MODULE_EXPORT void account_online( struct im_connection *ic );
-G_MODULE_EXPORT void signoff( struct im_connection *ic );
+G_MODULE_EXPORT struct im_connection *imc_new( account_t *acc );
+G_MODULE_EXPORT void imc_free( struct im_connection *ic );
+G_MODULE_EXPORT void imc_log( struct im_connection *ic, char *format, ... );
+G_MODULE_EXPORT void imc_error( struct im_connection *ic, char *format, ... );
+G_MODULE_EXPORT void imc_connected( struct im_connection *ic );
+G_MODULE_EXPORT void imc_logout( struct im_connection *ic );
 
 /* dialogs.c */
-G_MODULE_EXPORT void do_error_dialog( struct im_connection *ic, char *msg, char *title );
 G_MODULE_EXPORT void do_ask_dialog( struct im_connection *ic, char *msg, void *data, void *doit, void *dont );
 
Index: protocols/oscar/chat.c
===================================================================
--- protocols/oscar/chat.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/oscar/chat.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -54,5 +54,5 @@
 			continue;
 		if (!cur->priv) {
-			do_error_dialog(sess->aux_data, "chat connection with no name!", "Gaim");
+			imc_error(sess->aux_data, "chat connection with no name!");
 			continue;
 		}
@@ -397,5 +397,5 @@
 
 	if (detaillevel != 0x02) {
-		do_error_dialog(sess->aux_data, "Only detaillevel 0x2 is support at the moment", "Gaim");
+		imc_error(sess->aux_data, "Only detaillevel 0x2 is support at the moment");
 		return 1;
 	}
@@ -615,5 +615,5 @@
 
 	if (channel != 0x0003) {
-		do_error_dialog(sess->aux_data, "unknown channel!", "Gaim");
+		imc_error(sess->aux_data, "unknown channel!");
 		return 0;
 	}
Index: protocols/oscar/chatnav.c
===================================================================
--- protocols/oscar/chatnav.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/oscar/chatnav.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -286,5 +286,5 @@
 
 	if (!(bigblock = aim_gettlv(tlvlist, 0x0004, 1))) {
-		do_error_dialog(sess->aux_data, "no bigblock in top tlv in create room response", "Gaim");
+		imc_error(sess->aux_data, "no bigblock in top tlv in create room response");
 	
 		aim_freetlvchain(&tlvlist);
@@ -301,5 +301,5 @@
 
 	if (detaillevel != 0x02) {
-		do_error_dialog(sess->aux_data, "unknown detaillevel in create room response", "Gaim");
+		imc_error(sess->aux_data, "unknown detaillevel in create room response");
 		aim_freetlvchain(&tlvlist);
 		g_free(ck);
@@ -367,10 +367,10 @@
 
 	if (!(snac2 = aim_remsnac(sess, snac->id))) {
-		do_error_dialog(sess->aux_data, "received response to unknown request!", "Gaim");
+		imc_error(sess->aux_data, "received response to unknown request!");
 		return 0;
 	}
 
 	if (snac2->family != 0x000d) {
-		do_error_dialog(sess->aux_data, "recieved response that maps to corrupt request!", "Gaim");
+		imc_error(sess->aux_data, "recieved response that maps to corrupt request!");
 		return 0;
 	}
@@ -389,5 +389,5 @@
 		ret = parseinfo_create(sess, mod, rx, snac, bs, snac2);
 	else
-		do_error_dialog(sess->aux_data, "unknown request subtype", "Gaim");
+		imc_error(sess->aux_data, "unknown request subtype");
 
 	if (snac2)
Index: protocols/oscar/icq.c
===================================================================
--- protocols/oscar/icq.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/oscar/icq.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -240,5 +240,5 @@
 	if (!(tl = aim_readtlvchain(bs)) || !(datatlv = aim_gettlv(tl, 0x0001, 1))) {
 		aim_freetlvchain(&tl);
-		do_error_dialog(sess->aux_data, "corrupt ICQ response\n", "Gaim");
+		imc_error(sess->aux_data, "corrupt ICQ response\n");
 		return 0;
 	}
Index: protocols/oscar/im.c
===================================================================
--- protocols/oscar/im.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/oscar/im.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -937,5 +937,5 @@
 
 	if (channel != 0x01) {
-		do_error_dialog(sess->aux_data, "icbm: ICBM recieved on unsupported channel.  Ignoring.", "Gaim");
+		imc_error(sess->aux_data, "icbm: ICBM recieved on unsupported channel.  Ignoring.");
 		return 0;
 	}
@@ -1345,5 +1345,5 @@
 
 		} else {
-			// do_error_dialog(sess->aux_data, "Unknown TLV encountered", "Gaim");
+			// imc_error(sess->aux_data, "Unknown TLV encountered");
 		}
 
@@ -1517,5 +1517,5 @@
 	cookie2 = aimbs_getraw(&bbs, 8);
 	if (memcmp(cookie, cookie2, 8) != 0) 
-		do_error_dialog(sess->aux_data, "rend: warning cookies don't match!", "Gaim");
+		imc_error(sess->aux_data, "rend: warning cookies don't match!");
 	memcpy(args.cookie, cookie2, 8);
 	g_free(cookie2);
@@ -1783,5 +1783,5 @@
 	} else {
 
-		do_error_dialog(sess->aux_data, "ICBM received on an unsupported channel.  Ignoring.", "Gaim");
+		imc_error(sess->aux_data, "ICBM received on an unsupported channel.  Ignoring.");
 
 		return 0;
Index: protocols/oscar/info.c
===================================================================
--- protocols/oscar/info.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/oscar/info.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -474,5 +474,5 @@
 			 */
 #ifdef DEBUG
-			// do_error_dialog(sess->aux_data, G_STRLOC, "Unknown TLV encountered");
+			// imc_error(sess->aux_data, G_STRLOC);
 #endif
 
@@ -635,5 +635,5 @@
 
 	if (!origsnac || !origsnac->data) {
-		do_error_dialog(sess->aux_data, "major problem: no snac stored!", "Gaim");
+		imc_error(sess->aux_data, "major problem: no snac stored!");
 		return 0;
 	}
@@ -644,5 +644,5 @@
 			(inforeq->infotype != AIM_GETINFO_AWAYMESSAGE) &&
 			(inforeq->infotype != AIM_GETINFO_CAPABILITIES)) {
-		do_error_dialog(sess->aux_data, "unknown infotype in request!", "Gaim");
+		imc_error(sess->aux_data, "unknown infotype in request!");
 		return 0;
 	}
Index: protocols/oscar/oscar.c
===================================================================
--- protocols/oscar/oscar.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/oscar/oscar.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -263,13 +263,12 @@
 			aim_rxdispatch(odata->sess);
                                if (odata->killme)
-                                       signoff(ic);
+                                       imc_logout(ic);
 		} else {
 			if ((conn->type == AIM_CONN_TYPE_BOS) ||
 				   !(aim_getconn_type(odata->sess, AIM_CONN_TYPE_BOS))) {
-				hide_login_progress_error(ic, _("Disconnected."));
-				signoff(ic);
+				imc_error(ic, _("Disconnected."));
+				imc_logout(ic);
 			} else if (conn->type == AIM_CONN_TYPE_CHAT) {
 				struct chat_connection *c = find_oscar_chat_by_conn(ic, conn);
-				char buf[BUF_LONG];
 				c->conn = NULL;
 				if (c->inpa > 0)
@@ -278,6 +277,5 @@
 				c->fd = -1;
 				aim_conn_kill(odata->sess, &conn);
-				sprintf(buf, _("You have been disconnected from chat room %s."), c->name);
-				do_error_dialog(sess->aux_data, buf, _("Chat Error!"));
+				imc_error(sess->aux_data, _("You have been disconnected from chat room %s."), c->name);
 			} else if (conn->type == AIM_CONN_TYPE_CHATNAV) {
 				if (odata->cnpa > 0)
@@ -290,6 +288,5 @@
 						g_slist_remove(odata->create_rooms, cr);
 					g_free(cr);
-					do_error_dialog(sess->aux_data, _("Chat is currently unavailable"),
-							_("Gaim - Chat"));
+					imc_error(sess->aux_data, _("Chat is currently unavailable"));
 				}
 				aim_conn_kill(odata->sess, &conn);
@@ -328,6 +325,6 @@
 
 	if (source < 0) {
-		hide_login_progress(ic, _("Couldn't connect to host"));
-		signoff(ic);
+		imc_error(ic, _("Couldn't connect to host"));
+		imc_logout(ic);
 		return FALSE;
 	}
@@ -356,6 +353,5 @@
 	aim_session_t *sess;
 	aim_conn_t *conn;
-	char buf[256];
-	struct im_connection *ic = new_gaim_conn(acc);
+	struct im_connection *ic = imc_new(acc);
 	struct oscar_data *odata = ic->proto_data = g_new0(struct oscar_data, 1);
 
@@ -382,12 +378,12 @@
 	conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL);
 	if (conn == NULL) {
-		hide_login_progress(ic, _("Unable to login to AIM"));
-		signoff(ic);
+		imc_error(ic, _("Unable to login to AIM"));
+		imc_logout(ic);
 		return;
 	}
 	
 	if (acc->server == NULL) {
-		hide_login_progress(ic, "No servername specified");
-		signoff(ic);
+		imc_error(ic, "No servername specified");
+		imc_logout(ic);
 		return;
 	}
@@ -395,9 +391,8 @@
 	if (g_strcasecmp(acc->server, "login.icq.com") != 0 &&
 	    g_strcasecmp(acc->server, "login.oscar.aol.com") != 0) {
-		serv_got_crap(ic, "Warning: Unknown OSCAR server: `%s'. Please review your configuration if the connection fails.",acc->server);
-	}
-	
-	g_snprintf(buf, sizeof(buf), _("Signon: %s"), ic->username);
-	set_login_progress(ic, 2, buf);
+		imc_log(ic, "Warning: Unknown OSCAR server: `%s'. Please review your configuration if the connection fails.",acc->server);
+	}
+	
+	imc_log(ic, _("Signon: %s"), ic->username);
 
 	aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0);
@@ -407,6 +402,6 @@
 	conn->fd = proxy_connect(acc->server, AIM_LOGIN_PORT, oscar_login_connect, ic);
 	if (conn->fd < 0) {
-		hide_login_progress(ic, _("Couldn't connect to host"));
-		signoff(ic);
+		imc_error(ic, _("Couldn't connect to host"));
+		imc_logout(ic);
 		return;
 	}
@@ -467,6 +462,6 @@
 
 	if (source < 0) {
-		hide_login_progress(ic, _("Could Not Connect"));
-		signoff(ic);
+		imc_error(ic, _("Could Not Connect"));
+		imc_logout(ic);
 		return FALSE;
 	}
@@ -475,5 +470,5 @@
 	ic->inpa = b_input_add(bosconn->fd, GAIM_INPUT_READ,
 			oscar_callback, bosconn);
-	set_login_progress(ic, 4, _("Connection established, cookie sent"));
+	imc_log(ic, _("Connection established, cookie sent"));
 	
 	return FALSE;
@@ -498,21 +493,21 @@
 		case 0x05:
 			/* Incorrect nick/password */
-			hide_login_progress(ic, _("Incorrect nickname or password."));
+			imc_error(ic, _("Incorrect nickname or password."));
 //			plugin_event(event_error, (void *)980, 0, 0, 0);
 			break;
 		case 0x11:
 			/* Suspended account */
-			hide_login_progress(ic, _("Your account is currently suspended."));
+			imc_error(ic, _("Your account is currently suspended."));
 			break;
 		case 0x18:
 			/* connecting too frequently */
-			hide_login_progress(ic, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer."));
+			imc_error(ic, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer."));
 			break;
 		case 0x1c:
 			/* client too old */
-			hide_login_progress(ic, _("The client version you are using is too old. Please upgrade at " WEBSITE));
+			imc_error(ic, _("The client version you are using is too old. Please upgrade at " WEBSITE));
 			break;
 		default:
-			hide_login_progress(ic, _("Authentication Failed"));
+			imc_error(ic, _("Authentication Failed"));
 			break;
 		}
@@ -526,5 +521,5 @@
 	bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, NULL);
 	if (bosconn == NULL) {
-		hide_login_progress(ic, _("Internal Error"));
+		imc_error(ic, _("Internal Error"));
 		od->killme = TRUE;
 		return 0;
@@ -572,5 +567,5 @@
 	g_free(host);
 	if (bosconn->fd < 0) {
-		hide_login_progress(ic, _("Could Not Connect"));
+		imc_error(ic, _("Could Not Connect"));
 		od->killme = TRUE;
 		return 0;
@@ -610,6 +605,6 @@
 	}
 	if (in != '\n') {
-		do_error_dialog(pos->ic, "Gaim was unable to get a valid hash for logging into AIM."
-				" You may be disconnected shortly.", "Login Error");
+		imc_error(pos->ic, "Gaim was unable to get a valid hash for logging into AIM."
+				" You may be disconnected shortly.");
 		b_event_remove(pos->inpa);
 		closesocket(pos->fd);
@@ -633,6 +628,6 @@
 
 	if (source < 0) {
-		do_error_dialog(pos->ic, "Gaim was unable to get a valid hash for logging into AIM."
-				" You may be disconnected shortly.", "Login Error");
+		imc_error(pos->ic, "Gaim was unable to get a valid hash for logging into AIM."
+				" You may be disconnected shortly.");
 		if (pos->modname)
 			g_free(pos->modname);
@@ -711,6 +706,6 @@
 			g_free(pos->modname);
 		g_free(pos);
-		do_error_dialog(sess->aux_data, "Gaim was unable to get a valid hash for logging into AIM."
-				" You may be disconnected shortly.", "Login Error");
+		imc_error(sess->aux_data, "Gaim was unable to get a valid hash for logging into AIM."
+				" You may be disconnected shortly.");
 	}
 	pos->fd = fd;
@@ -1210,9 +1205,9 @@
 
 		case 0x0007: { /* Someone has denied you authorization */
-			serv_got_crap(sess->aux_data, "The user %u has denied your request to add them to your contact list for the following reason:\n%s", args->uin, args->msg ? args->msg : _("No reason given.") );
+			imc_log(sess->aux_data, "The user %u has denied your request to add them to your contact list for the following reason:\n%s", args->uin, args->msg ? args->msg : _("No reason given.") );
 		} break;
 
 		case 0x0008: { /* Someone has granted you authorization */
-			serv_got_crap(sess->aux_data, "The user %u has granted your request to add them to your contact list for the following reason:\n%s", args->uin, args->msg ? args->msg : _("No reason given.") );
+			imc_log(sess->aux_data, "The user %u has granted your request to add them to your contact list for the following reason:\n%s", args->uin, args->msg ? args->msg : _("No reason given.") );
 		} break;
 
@@ -1339,5 +1334,5 @@
 			break;
 	}
-	do_error_dialog(sess->aux_data, buf, _("Gaim - Error"));
+	imc_error(sess->aux_data, buf);
 
 	return 1;
@@ -1347,5 +1342,4 @@
 	va_list ap;
 	guint16 reason;
-	char *m;
 
 	va_start(ap, fr);
@@ -1353,8 +1347,6 @@
 	va_end(ap);
 
-	m = g_strdup_printf(_("SNAC threw error: %s\n"),
-			reason < msgerrreasonlen ? msgerrreason[reason] : "Unknown error");
-	do_error_dialog(sess->aux_data, m, _("Gaim - Oscar SNAC Error"));
-	g_free(m);
+	imc_error(sess->aux_data, _("SNAC threw error: %s"),
+	          reason < msgerrreasonlen ? msgerrreason[reason] : "Unknown error");
 
 	return 1;
@@ -1365,5 +1357,4 @@
 	char *destn;
 	guint16 reason;
-	char buf[1024];
 
 	va_start(ap, fr);
@@ -1372,7 +1363,6 @@
 	va_end(ap);
 
-	sprintf(buf, _("Your message to %s did not get sent: %s"), destn,
+	imc_error(sess->aux_data, _("Your message to %s did not get sent: %s"), destn,
 			(reason < msgerrreasonlen) ? msgerrreason[reason] : _("Reason unknown"));
-	do_error_dialog(sess->aux_data, buf, _("Gaim - Error"));
 
 	return 1;
@@ -1383,5 +1373,4 @@
 	char *destn;
 	guint16 reason;
-	char buf[1024];
 
 	va_start(ap, fr);
@@ -1390,8 +1379,6 @@
 	va_end(ap);
 
-	sprintf(buf, _("User information for %s unavailable: %s"), destn,
+	imc_error(sess->aux_data, _("User information for %s unavailable: %s"), destn,
 			(reason < msgerrreasonlen) ? msgerrreason[reason] : _("Reason unknown"));
-	do_error_dialog(sess->aux_data, buf, _("Gaim - Error"));
-
 
 	return 1;
@@ -1409,6 +1396,5 @@
 
 	if (id < 4)
-		do_error_dialog(sess->aux_data, _("Your connection may be lost."),
-				_("AOL error"));
+		imc_error(sess->aux_data, _("Your connection may be lost."));
 
 	return 1;
@@ -1604,6 +1590,6 @@
 		aim_conn_setlatency(fr->conn, windowsize/4);
 	} else if (code == AIM_RATE_CODE_LIMIT) {
-		do_error_dialog(sess->aux_data, _("The last message was not sent because you are over the rate limit. "
-				  "Please wait 10 seconds and try again."), _("Gaim - Error"));
+		imc_error(sess->aux_data, _("The last message was not sent because you are over the rate limit. "
+			  "Please wait 10 seconds and try again."));
 		aim_conn_setlatency(fr->conn, windowsize/2);
 	} else if (code == AIM_RATE_CODE_CLEARLIMIT) {
@@ -1809,9 +1795,9 @@
 
 		case 0x0007: { /* Someone has denied you authorization */
-			serv_got_crap(sess->aux_data, "The user %u has denied your request to add them to your contact list for the following reason:\n%s", msg->sender, msg->msg ? msg->msg : _("No reason given.") );
+			imc_log(sess->aux_data, "The user %u has denied your request to add them to your contact list for the following reason:\n%s", msg->sender, msg->msg ? msg->msg : _("No reason given.") );
 		} break;
 
 		case 0x0008: { /* Someone has granted you authorization */
-			serv_got_crap(sess->aux_data, "The user %u has granted your request to add them to your contact list for the following reason:\n%s", msg->sender, msg->msg ? msg->msg : _("No reason given.") );
+			imc_log(sess->aux_data, "The user %u has granted your request to add them to your contact list for the following reason:\n%s", msg->sender, msg->msg ? msg->msg : _("No reason given.") );
 		} break;
 
@@ -1926,5 +1912,5 @@
 
 	if (od->rights.maxawaymsglen == 0)
-		do_error_dialog(ic, "oscar_set_away_aim called before locate rights received", "Protocol Error");
+		imc_error(ic, "oscar_set_away_aim called before locate rights received");
 
 	aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL);
@@ -1944,5 +1930,5 @@
 		errstr = g_strdup_printf("Maximum away message length of %d bytes exceeded, truncating", od->rights.maxawaymsglen);
 
-		do_error_dialog(ic, errstr, "Away Message Too Long");
+		imc_error(ic, errstr);
 
 		g_free(errstr);
@@ -2110,5 +2096,5 @@
 	
 	/* Now that we have a buddy list, we can tell BitlBee that we're online. */
-	account_online(ic);
+	imc_connected(ic);
 	
 	return 1;
@@ -2132,5 +2118,5 @@
 		{
 			/* Hmm, the length should be even... */
-			do_error_dialog( sess->aux_data, "Received SSI ACK package with non-even length", "Gaim - Error" );
+			imc_error( sess->aux_data, "Received SSI ACK package with non-even length");
 			return( 0 );
 		}
@@ -2143,5 +2129,5 @@
 			if( st == 0x0E )
 			{
-				serv_got_crap( sess->aux_data, "Buddy %s can't be added without authorization, requesting authorization", list );
+				imc_log( sess->aux_data, "Buddy %s can't be added without authorization, requesting authorization", list );
 				
 				aim_ssi_auth_request( sess, fr->conn, list, "" );
@@ -2330,5 +2316,5 @@
         }
 
-		serv_got_crap(ic, "%s\n%s", _("User Info"), str->str);
+		imc_log(ic, "%s\n%s", _("User Info"), str->str);
         g_string_free(str, TRUE);
 
@@ -2424,16 +2410,16 @@
 			idletime.tm_sec = 0;
 			strftime(buff, 256, _("%d days %H hours %M minutes"), &idletime);
-			serv_got_crap(ic, "%s: %s", _("Idle Time"), buff);
+			imc_log(ic, "%s: %s", _("Idle Time"), buff);
 		}
 		
 		if(text) {
 			utf8 = oscar_encoding_to_utf8(extracted_encoding, text, text_length);
-			serv_got_crap(ic, "%s\n%s", _("User Info"), utf8);
+			imc_log(ic, "%s\n%s", _("User Info"), utf8);
 		} else {
-			serv_got_crap(ic, _("No user info available."));
+			imc_log(ic, _("No user info available."));
 		}
 	} else if(infotype == AIM_GETINFO_AWAYMESSAGE && userinfo->flags & AIM_FLAG_AWAY) {
 		utf8 = oscar_encoding_to_utf8(extracted_encoding, text, text_length);
-		serv_got_crap(ic, "%s\n%s", _("Away Message"), utf8);
+		imc_log(ic, "%s\n%s", _("Away Message"), utf8);
 	}
 
Index: protocols/oscar/rxqueue.c
===================================================================
--- protocols/oscar/rxqueue.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/oscar/rxqueue.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -392,5 +392,5 @@
 		aim_bstream_rewind(&flaphdr);
 		start = aimbs_get8(&flaphdr);
-		do_error_dialog(sess->aux_data, "FLAP framing disrupted", "Gaim");
+		imc_error(sess->aux_data, "FLAP framing disrupted");
 		aim_conn_close(conn);
 		return -1;
Index: protocols/oscar/search.c
===================================================================
--- protocols/oscar/search.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/oscar/search.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -39,5 +39,5 @@
 	/* XXX the modules interface should have already retrieved this for us */
 	if (!(snac2 = aim_remsnac(sess, snac->id))) {
-		do_error_dialog(sess->aux_data, "couldn't get snac", "Gaim");
+		imc_error(sess->aux_data, "couldn't get snac");
 		return 0;
 	}
Index: protocols/oscar/service.c
===================================================================
--- protocols/oscar/service.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/oscar/service.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -567,5 +567,5 @@
 		group = aimbs_get16(bs);
 
-		do_error_dialog(sess->aux_data, "bifurcated migration unsupported", "Gaim");
+		imc_error(sess->aux_data, "bifurcated migration unsupported");
 	}
 
@@ -894,5 +894,5 @@
 */
 		} else
-			do_error_dialog(sess->aux_data, "WARNING: unknown hash request", "Gaim");
+			imc_error(sess->aux_data, "WARNING: unknown hash request");
 
 	}
Index: protocols/oscar/txqueue.c
===================================================================
--- protocols/oscar/txqueue.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/oscar/txqueue.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -30,5 +30,5 @@
 
 	if (!conn) {
-		do_error_dialog(sess->aux_data, "no connection specified", "Gaim");
+		imc_error(sess->aux_data, "no connection specified");
 		return NULL;
 	}
@@ -46,5 +46,5 @@
 
 	} else 
-		do_error_dialog(sess->aux_data, "unknown framing", "Gaim");
+		imc_error(sess->aux_data, "unknown framing");
 
 	if (datalen > 0) {
@@ -80,5 +80,5 @@
 
 	if (!fr->conn) {
-		do_error_dialog(sess->aux_data, "WARNING: enqueueing packet with no connection", "Gaim");
+		imc_error(sess->aux_data, "WARNING: enqueueing packet with no connection");
 		fr->conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
 	}
@@ -120,5 +120,5 @@
 
 	if (!fr->conn) {
-		do_error_dialog(sess->aux_data, "packet has no connection", "Gaim");
+		imc_error(sess->aux_data, "packet has no connection");
 		aim_frame_destroy(fr);
 		return 0;
Index: protocols/yahoo/yahoo.c
===================================================================
--- protocols/yahoo/yahoo.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ protocols/yahoo/yahoo.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -123,5 +123,5 @@
 static void byahoo_login( account_t *acc )
 {
-	struct im_connection *ic = new_gaim_conn( acc );
+	struct im_connection *ic = imc_new( acc );
 	struct byahoo_data *yd = ic->proto_data = g_new0( struct byahoo_data, 1 );
 	
@@ -129,5 +129,5 @@
 	yd->current_status = YAHOO_STATUS_AVAILABLE;
 	
-	set_login_progress( ic, 1, "Connecting" );
+	imc_log( ic, "Connecting" );
 	yd->y2_id = yahoo_init( acc->user, acc->pass );
 	yahoo_login( yd->y2_id, yd->current_status );
@@ -163,5 +163,5 @@
 {
 	/* Just make an URL and let the user fetch the info */
-	serv_got_crap(ic, "%s\n%s: %s%s", _("User Info"), 
+	imc_log(ic, "%s\n%s: %s%s", _("User Info"), 
 			_("For now, fetch yourself"), yahoo_get_profile_url(),
 			who);
@@ -511,5 +511,5 @@
 	if( succ == YAHOO_LOGIN_OK )
 	{
-		account_online( ic );
+		imc_connected( ic );
 		
 		yd->logged_in = TRUE;
@@ -550,11 +550,11 @@
 		
 		if( yd->logged_in )
-			hide_login_progress_error( ic, s );
+			imc_error( ic, s );
 		else
-			hide_login_progress( ic, s );
+			imc_error( ic, s );
 		
 		g_free( s );
 		
-		signoff( ic );
+		imc_logout( ic );
 	}
 }
@@ -619,5 +619,5 @@
 	struct im_connection *ic = byahoo_get_ic_by_id( id );
 	
-	serv_got_crap( ic, "Got a file transfer (file = %s) from %s. Ignoring for now due to lack of support.", fname, who );
+	imc_log( ic, "Got a file transfer (file = %s) from %s. Ignoring for now due to lack of support.", fname, who );
 }
 
@@ -639,5 +639,5 @@
 	struct im_connection *ic = byahoo_get_ic_by_id( id );
 	
-	serv_got_crap( ic, "Yahoo! system message: %s", msg );
+	imc_log( ic, "Yahoo! system message: %s", msg );
 }
 
@@ -646,5 +646,5 @@
 	struct im_connection *ic = byahoo_get_ic_by_id( id );
 	
-	serv_got_crap( ic, "Got a webcam invitation from %s. IRC+webcams is a no-no though...", from );
+	imc_log( ic, "Got a webcam invitation from %s. IRC+webcams is a no-no though...", from );
 }
 
@@ -653,13 +653,8 @@
 	struct im_connection *ic = byahoo_get_ic_by_id( id );
 	
+	imc_error( ic, "%s", err );
+	
 	if( fatal )
-	{
-		hide_login_progress_error( ic, err );
-		signoff( ic );
-	}
-	else
-	{
-		do_error_dialog( ic, err, "Yahoo! error" );
-	}
+		imc_logout( ic );
 }
 
@@ -829,5 +824,5 @@
 	struct im_connection *ic = byahoo_get_ic_by_id( id );
 	
-	serv_got_crap( ic, "Invite to chatroom %s rejected by %s: %s", room, who, msg );
+	imc_log( ic, "Invite to chatroom %s rejected by %s: %s", room, who, msg );
 }
 
@@ -912,7 +907,7 @@
 	
 	if( from && subj )
-		serv_got_crap( ic, "Received e-mail message from %s with subject `%s'", from, subj );
+		imc_log( ic, "Received e-mail message from %s with subject `%s'", from, subj );
 	else if( cnt > 0 )
-		serv_got_crap( ic, "Received %d new e-mails", cnt );
+		imc_log( ic, "Received %d new e-mails", cnt );
 }
 
Index: query.c
===================================================================
--- query.c	(revision 0da65d5fb37691ed4d31f7ab4058732f1440db6b)
+++ query.c	(revision aef4828a1dc51de10a43bb7dd5d023de9971295b)
@@ -122,5 +122,5 @@
 	
 	if( count > 0 )
-		serv_got_crap( ic, "Flushed %d unanswered question(s) for this connection.", count );
+		imc_log( ic, "Flushed %d unanswered question(s) for this connection.", count );
 	
 	q = query_default( irc );
@@ -140,10 +140,10 @@
 	if( ans )
 	{
-		serv_got_crap( q->ic, "Accepted: %s", q->question );
+		imc_log( q->ic, "Accepted: %s", q->question );
 		q->yes( NULL, q->data );
 	}
 	else
 	{
-		serv_got_crap( q->ic, "Rejected: %s", q->question );
+		imc_log( q->ic, "Rejected: %s", q->question );
 		q->no( NULL, q->data );
 	}
@@ -160,5 +160,5 @@
 	if( q->ic )
 	{
-		serv_got_crap( q->ic, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question );
+		imc_log( q->ic, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question );
 	}
 	else
