Index: Makefile
===================================================================
--- Makefile	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ Makefile	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -11,5 +11,5 @@
 # Program variables
 #objects = bitlbee.o chat.o dcc.o help.o ipc.o irc.o irc_commands.o nick.o query.o root_commands.o set.o storage.o $(STORAGE_OBJS)
-objects = bitlbee.o help.o ipc.o irc.o irc_im.o irc_channel.o irc_commands.o irc_send.o irc_user.o nick.o root_commands.o set.o storage.o $(STORAGE_OBJS)
+objects = bitlbee.o dcc.o help.o ipc.o irc.o irc_im.o irc_channel.o irc_commands.o irc_send.o irc_user.o nick.o root_commands.o set.o storage.o $(STORAGE_OBJS)
 headers = account.h bitlbee.h commands.h conf.h config.h help.h ipc.h irc.h log.h nick.h query.h set.h sock.h storage.h user.h lib/events.h lib/ftutil.h lib/http_client.h lib/ini.h lib/md5.h lib/misc.h lib/proxy.h lib/sha1.h lib/ssl_client.h lib/url.h protocols/ft.h protocols/nogaim.h
 subdirs = lib protocols
Index: dcc.c
===================================================================
--- dcc.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ dcc.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -61,9 +61,8 @@
 unsigned int receivedchunks=0, receiveddata=0;
 
-static void dcc_finish( file_transfer_t *file );
-static void dcc_close( file_transfer_t *file );
+void dcc_finish( file_transfer_t *file );
+void dcc_close( file_transfer_t *file );
 gboolean dccs_send_proto( gpointer data, gint fd, b_input_condition cond );
-int dccs_send_request( struct dcc_file_transfer *df, char *user_nick, struct sockaddr_storage *saddr );
-gboolean dccs_recv_start( file_transfer_t *ft );
+int dccs_send_request( struct dcc_file_transfer *df, irc_user_t *iu, struct sockaddr_storage *saddr );
 gboolean dccs_recv_proto( gpointer data, gint fd, b_input_condition cond);
 gboolean dccs_recv_write_request( file_transfer_t *ft );
@@ -71,43 +70,5 @@
 gboolean dcc_abort( dcc_file_transfer_t *df, char *reason, ... );
 
-/* As defined in ft.h */
-file_transfer_t *imcb_file_send_start( struct im_connection *ic, char *handle, char *file_name, size_t file_size )
-{
-	user_t *u = user_findhandle( ic, handle );
-	/* one could handle this more intelligent like imcb_buddy_msg.
-	 * can't call it directly though cause it does some wrapping.
-	 * Maybe give imcb_buddy_msg a parameter NO_WRAPPING? */
-	if (!u) return NULL;
-
-	return dccs_send_start( ic, u->nick, file_name, file_size );
-};
-
-/* As defined in ft.h */
-void imcb_file_canceled( file_transfer_t *file, char *reason )
-{
-	if( file->canceled )
-		file->canceled( file, reason );
-
-	dcc_close( file );
-}
-
-/* As defined in ft.h */
-gboolean imcb_file_recv_start( file_transfer_t *ft )
-{
-	return dccs_recv_start( ft );
-}
-
-/* As defined in ft.h */
-void imcb_file_finished( file_transfer_t *file )
-{
-	dcc_file_transfer_t *df = file->priv;
-
-	if( file->bytes_transferred >= file->file_size )
-		dcc_finish( file );
-	else
-		df->proto_finished = TRUE;
-}
-
-dcc_file_transfer_t *dcc_alloc_transfer( char *file_name, size_t file_size, struct im_connection *ic )
+dcc_file_transfer_t *dcc_alloc_transfer( const char *file_name, size_t file_size, struct im_connection *ic )
 {
 	file_transfer_t *file = g_new0( file_transfer_t, 1 );
@@ -124,8 +85,9 @@
 
 /* This is where the sending magic starts... */
-file_transfer_t *dccs_send_start( struct im_connection *ic, char *user_nick, char *file_name, size_t file_size )
+file_transfer_t *dccs_send_start( struct im_connection *ic, irc_user_t *iu, const char *file_name, size_t file_size )
 {
 	file_transfer_t *file;
 	dcc_file_transfer_t *df;
+	irc_t *irc = (irc_t *) ic->bee->ui_data;
 	struct sockaddr_storage saddr;
 	char *errmsg;
@@ -150,5 +112,5 @@
 	file->status = FT_STATUS_LISTENING;
 
-	if( !dccs_send_request( df, user_nick, &saddr ) )
+	if( !dccs_send_request( df, iu, &saddr ) )
 		return NULL;
 
@@ -156,5 +118,5 @@
 	df->watch_in = b_input_add( df->fd, GAIM_INPUT_READ, dccs_send_proto, df );
 
-	df->ic->irc->file_transfers = g_slist_prepend( df->ic->irc->file_transfers, file );
+	irc->file_transfers = g_slist_prepend( irc->file_transfers, file );
 
 	df->progress_timeout = b_timeout_add( DCC_MAX_STALL * 1000, dcc_progress, df );
@@ -163,5 +125,5 @@
 	              "Accept the file transfer if you'd like the file. If you don't, "
 	              "issue the 'transfers reject' command.",
-	              user_nick, file_name, file_size / 1024 );
+	              iu->nick, file_name, file_size / 1024 );
 
 	return file;
@@ -216,5 +178,5 @@
 
 /* Creates the "DCC SEND" line and sends it to the server */
-int dccs_send_request( struct dcc_file_transfer *df, char *user_nick, struct sockaddr_storage *saddr )
+int dccs_send_request( struct dcc_file_transfer *df, irc_user_t *iu, struct sockaddr_storage *saddr )
 {
 	char ipaddr[INET6_ADDRSTRLEN]; 
@@ -250,6 +212,5 @@
 				df->ft->file_name, ipaddr, port, df->ft->file_size );
 	
-	if ( !irc_msgfrom( df->ic->irc, user_nick, cmd ) )
-		return dcc_abort( df, "Couldn't send `DCC SEND' message to %s.", user_nick );
+	irc_send_msg_raw( iu, "PRIVMSG", iu->irc->user->nick, cmd );
 
 	g_free( cmd );
@@ -496,7 +457,8 @@
  * Cleans up after a transfer.
  */
-static void dcc_close( file_transfer_t *file )
+void dcc_close( file_transfer_t *file )
 {
 	dcc_file_transfer_t *df = file->priv;
+	irc_t *irc = (irc_t *) df->ic->bee->ui_data;
 
 	if( file->free )
@@ -514,5 +476,5 @@
 		b_event_remove( df->progress_timeout );
 	
-	df->ic->irc->file_transfers = g_slist_remove( df->ic->irc->file_transfers, file );
+	irc->file_transfers = g_slist_remove( irc->file_transfers, file );
 	
 	g_free( df );
@@ -544,4 +506,5 @@
 file_transfer_t *dcc_request( struct im_connection *ic, char *line )
 {
+	irc_t *irc = (irc_t *) ic->bee->ui_data;
 	char *pattern = "SEND"
 		" (([^\"][^ ]*)|\"(([^\"]|\\\")*)\")"
@@ -627,5 +590,5 @@
 		g_free( input );
 
-		df->ic->irc->file_transfers = g_slist_prepend( df->ic->irc->file_transfers, ft );
+		irc->file_transfers = g_slist_prepend( irc->file_transfers, ft );
 
 		return ft;
Index: dcc.h
===================================================================
--- dcc.h	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ dcc.h	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -95,10 +95,11 @@
 } dcc_file_transfer_t;
 
-file_transfer_t *dccs_send_start( struct im_connection *ic, char *user_nick, char *file_name, size_t file_size );
+file_transfer_t *dccs_send_start( struct im_connection *ic, irc_user_t *iu, const char *file_name, size_t file_size );
+void dcc_canceled( file_transfer_t *file, char *reason );
+gboolean dccs_send_write( file_transfer_t *file, char *data, unsigned int data_size );
+file_transfer_t *dcc_request( struct im_connection *ic, char *line );
+void dcc_finish( file_transfer_t *file );
+void dcc_close( file_transfer_t *file );
+gboolean dccs_recv_start( file_transfer_t *ft );
 
-void dcc_canceled( file_transfer_t *file, char *reason );
-
-gboolean dccs_send_write( file_transfer_t *file, char *data, unsigned int data_size );
-
-file_transfer_t *dcc_request( struct im_connection *ic, char *line );
 #endif
Index: irc_im.c
===================================================================
--- irc_im.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ irc_im.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -25,5 +25,5 @@
 
 #include "bitlbee.h"
-
+#include "dcc.h"
 
 /* IM->IRC callbacks */
@@ -161,4 +161,30 @@
 }
 
+/* File transfers */
+static file_transfer_t *bee_irc_ft_in_start( bee_t *bee, bee_user_t *bu, const char *file_name, size_t file_size )
+{
+	return dccs_send_start( bu->ic, (irc_user_t *) bu->ui_data, file_name, file_size );
+}
+
+gboolean bee_irc_ft_out_start( struct im_connection *ic, file_transfer_t *ft )
+{
+	return dccs_recv_start( ft );
+}
+
+void bee_irc_ft_close( struct im_connection *ic, file_transfer_t *ft )
+{
+	return dcc_close( ft );
+}
+
+void bee_irc_ft_finished( struct im_connection *ic, file_transfer_t *file )
+{
+	dcc_file_transfer_t *df = file->priv;
+
+	if( file->bytes_transferred >= file->file_size )
+		dcc_finish( file );
+	else
+		df->proto_finished = TRUE;
+}
+
 const struct bee_ui_funcs irc_ui_funcs = {
 	bee_irc_user_new,
@@ -167,4 +193,9 @@
 	bee_irc_user_status,
 	bee_irc_user_msg,
+	
+	bee_irc_ft_in_start,
+	bee_irc_ft_out_start,
+	bee_irc_ft_close,
+	bee_irc_ft_finished,
 };
 
Index: protocols/Makefile
===================================================================
--- protocols/Makefile	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/Makefile	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -10,5 +10,5 @@
 
 # [SH] Program variables
-objects = account.o bee.o bee_user.o nogaim.o
+objects = account.o bee.o bee_ft.o bee_user.o nogaim.o
 
 
Index: protocols/bee.h
===================================================================
--- protocols/bee.h	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/bee.h	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -71,4 +71,9 @@
 	gboolean (*user_status)( bee_t *bee, struct bee_user *bu, struct bee_user *old );
 	gboolean (*user_msg)( bee_t *bee, bee_user_t *bu, const char *msg, time_t sent_at );
+	
+	struct file_transfer* (*ft_in_start)( bee_t *bee, bee_user_t *bu, const char *file_name, size_t file_size );
+	gboolean (*ft_out_start)( struct im_connection *ic, struct file_transfer *ft );
+	void (*ft_close)( struct im_connection *ic, struct file_transfer *ft );
+	void (*ft_finished)( struct im_connection *ic, struct file_transfer *ft );
 } bee_ui_funcs_t;
 
Index: protocols/bee_ft.c
===================================================================
--- protocols/bee_ft.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
+++ protocols/bee_ft.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -0,0 +1,66 @@
+/********************************************************************\
+* BitlBee -- An IRC to other IM-networks gateway                     *
+*                                                                    *
+* Copyright 2010 Wilmer van der Gaast <wilmer@gaast.net>             *
+\********************************************************************/
+
+/*
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License with
+  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
+  if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+  Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#define BITLBEE_CORE
+#include "bitlbee.h"
+#include "ft.h"
+
+file_transfer_t *imcb_file_send_start( struct im_connection *ic, char *handle, char *file_name, size_t file_size )
+{
+	bee_t *bee = ic->bee; 
+	bee_user_t *bu = bee_user_by_handle( bee, ic, handle );
+	
+	if( bee->ui->ft_in_start )
+		return bee->ui->ft_in_start( bee, bu, file_name, file_size );
+	else
+		return NULL;
+}
+
+gboolean imcb_file_recv_start( struct im_connection *ic, file_transfer_t *ft )
+{
+	bee_t *bee = ic->bee;
+	
+	if( bee->ui->ft_out_start )
+		return bee->ui->ft_out_start( ic, ft );
+	else
+		return FALSE;
+}
+
+void imcb_file_canceled( struct im_connection *ic, file_transfer_t *file, char *reason )
+{
+	bee_t *bee = ic->bee;
+	
+	if( file->canceled )
+		file->canceled( file, reason );
+	
+	if( bee->ui->ft_close )
+		bee->ui->ft_close( ic, file );
+}
+
+void imcb_file_finished( struct im_connection *ic, file_transfer_t *file )
+{
+	bee_t *bee = ic->bee;
+	
+	if( bee->ui->ft_finished )
+		bee->ui->ft_finished( ic, file );
+}
Index: protocols/ft.h
===================================================================
--- protocols/ft.h	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/ft.h	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -168,8 +168,8 @@
  * the canceled() and free() callbacks given in file will be called by this function.
  */
-void imcb_file_canceled( file_transfer_t *file, char *reason );
+void imcb_file_canceled( struct im_connection *ic, file_transfer_t *file, char *reason );
 
-gboolean imcb_file_recv_start( file_transfer_t *ft );
+gboolean imcb_file_recv_start( struct im_connection *ic, file_transfer_t *ft );
 
-void imcb_file_finished( file_transfer_t *file );
+void imcb_file_finished( struct im_connection *ic, file_transfer_t *file );
 #endif
Index: protocols/jabber/iq.c
===================================================================
--- protocols/jabber/iq.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/jabber/iq.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -392,5 +392,5 @@
 			if( ( strcmp( sub, "both" ) == 0 || strcmp( sub, "to" ) == 0 ) )
 			{
-				if( initial || imcb_find_buddy( ic, jid ) == NULL )
+				if( initial || bee_user_by_handle( ic->bee, ic, jid ) == NULL )
 					imcb_add_buddy( ic, jid, ( group && group->text_len ) ?
 					                           group->text : NULL );
@@ -590,5 +590,5 @@
 	    strcmp( s, "result" ) == 0 )
 	{
-		if( imcb_find_buddy( ic, jid ) == NULL )
+		if( bee_user_by_handle( ic->bee, ic, jid ) == NULL )
 			imcb_add_buddy( ic, jid, NULL );
 	}
Index: protocols/jabber/jabber.c
===================================================================
--- protocols/jabber/jabber.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/jabber/jabber.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -267,5 +267,5 @@
 	
 	while( jd->filetransfers )
-		imcb_file_canceled( ( ( struct jabber_transfer *) jd->filetransfers->data )->ft, "Logging out" );
+		imcb_file_canceled( ic, ( ( struct jabber_transfer *) jd->filetransfers->data )->ft, "Logging out" );
 
 	while( jd->streamhosts )
Index: protocols/jabber/jabber_util.c
===================================================================
--- protocols/jabber/jabber_util.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/jabber/jabber_util.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -279,6 +279,5 @@
 	presence_send_request( bla->ic, bla->handle, "subscribed" );
 	
-	if( imcb_find_buddy( bla->ic, bla->handle ) == NULL )
-		imcb_ask_add( bla->ic, bla->handle, NULL );
+	imcb_ask_add( bla->ic, bla->handle, NULL );
 	
 	g_free( bla->handle );
@@ -462,5 +461,5 @@
 		
 		if( bud == NULL && ( flags & GET_BUDDY_CREAT ) &&
-		    ( bare_exists || imcb_find_buddy( ic, jid ) ) )
+		    ( bare_exists || bee_user_by_handle( ic->bee, ic, jid ) ) )
 		{
 			*s = '/';
@@ -483,5 +482,6 @@
 		if( bud == NULL )
 			/* No match. Create it now? */
-			return ( ( flags & GET_BUDDY_CREAT ) && imcb_find_buddy( ic, jid_ ) ) ?
+			return ( ( flags & GET_BUDDY_CREAT ) &&
+			         bee_user_by_handle( ic->bee, ic, jid_ ) ) ?
 			           jabber_buddy_add( ic, jid_ ) : NULL;
 		else if( bud->resource && ( flags & GET_BUDDY_EXACT ) )
Index: protocols/jabber/s5bytestream.c
===================================================================
--- protocols/jabber/s5bytestream.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/jabber/s5bytestream.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -566,5 +566,5 @@
 	xt_free_node( reply );
 
-	imcb_file_canceled( tf->ft, "couldn't connect to any streamhosts" );
+	imcb_file_canceled( tf->ic, tf->ft, "couldn't connect to any streamhosts" );
 
 	bt->tf->watch_in = 0;
@@ -603,5 +603,5 @@
 		
 	if( !jabber_write_packet( tf->ic, reply ) )
-		imcb_file_canceled( tf->ft, "Error transmitting bytestream response" );
+		imcb_file_canceled( tf->ic, tf->ft, "Error transmitting bytestream response" );
 	xt_free_node( reply );
 }
@@ -643,5 +643,5 @@
 
 	if( tf->bytesread >= tf->ft->file_size )
-		imcb_file_finished( tf->ft );
+		imcb_file_finished( tf->ic, tf->ft );
 
 	tf->ft->write( tf->ft, tf->ft->buffer, ret );	
@@ -659,5 +659,5 @@
 	if( tf->watch_in )
 	{
-		imcb_file_canceled( ft, "BUG in jabber file transfer: write_request called when already watching for input" );
+		imcb_file_canceled( tf->ic, ft, "BUG in jabber file transfer: write_request called when already watching for input" );
 		return FALSE;
 	}
@@ -705,5 +705,5 @@
 
 	if( tf->byteswritten >= ft->file_size )
-		imcb_file_finished( ft );
+		imcb_file_finished( tf->ic, ft );
 	else
 		bt->tf->watch_out = b_input_add( tf->fd, GAIM_INPUT_WRITE, jabber_bs_send_can_write, bt );
@@ -1005,5 +1005,5 @@
 
 	if( !jabber_write_packet( tf->ic, iq ) )
-		imcb_file_canceled( tf->ft, "Error transmitting bytestream request" );
+		imcb_file_canceled( tf->ic, tf->ft, "Error transmitting bytestream request" );
 	return TRUE;
 }
@@ -1020,5 +1020,5 @@
 
 	if( jd->streamhosts==NULL ) /* we're done here unless we have a proxy to try */
-		imcb_file_canceled( tf->ft, error );
+		imcb_file_canceled( tf->ic, tf->ft, error );
 
 	/* MUST always return FALSE! */
Index: protocols/jabber/si.c
===================================================================
--- protocols/jabber/si.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/jabber/si.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -91,9 +91,9 @@
 
 	if( !foundft )
-		imcb_file_canceled( tf->ft, "Buddy's client doesn't feature file transfers" );
+		imcb_file_canceled( tf->ic, tf->ft, "Buddy's client doesn't feature file transfers" );
 	else if( !foundbt )
-		imcb_file_canceled( tf->ft, "Buddy's client doesn't feature byte streams (required)" );
+		imcb_file_canceled( tf->ic, tf->ft, "Buddy's client doesn't feature byte streams (required)" );
 	else if( !foundsi )
-		imcb_file_canceled( tf->ft, "Buddy's client doesn't feature stream initiation (required)" );
+		imcb_file_canceled( tf->ic, tf->ft, "Buddy's client doesn't feature stream initiation (required)" );
 		
 	return foundft && foundbt && foundsi;
@@ -109,5 +109,5 @@
 
 	/* and start the receive logic */
-	imcb_file_recv_start( tf->ft );
+	imcb_file_recv_start( tf->ic, tf->ft );
 
 }
@@ -156,5 +156,5 @@
 	if( bud == NULL )
 	{
-		imcb_file_canceled( ft, "Couldn't find buddy (BUG?)" );
+		imcb_file_canceled( ic, ft, "Couldn't find buddy (BUG?)" );
 		return;
 	}
Index: protocols/msn/Makefile
===================================================================
--- protocols/msn/Makefile	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/msn/Makefile	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -10,5 +10,5 @@
 
 # [SH] Program variables
-objects = invitation.o msn.o msn_util.o ns.o passport.o sb.o tables.o
+objects = msn.o msn_util.o ns.o passport.o sb.o tables.o
 
 CFLAGS += -Wall
Index: protocols/msn/msn.c
===================================================================
--- protocols/msn/msn.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/msn/msn.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -81,7 +81,9 @@
 	if( md )
 	{
+		/** Disabling MSN ft support for now.
 		while( md->filetransfers ) {
 			imcb_file_canceled( md->filetransfers->data, "Closing connection" );
 		}
+		*/
 		
 		if( md->fd >= 0 )
@@ -344,5 +346,5 @@
 	ret->send_typing = msn_send_typing;
 	ret->handle_cmp = g_strcasecmp;
-	ret->transfer_request = msn_ftp_transfer_request;
+	//ret->transfer_request = msn_ftp_transfer_request;
 
 	register_protocol(ret);
Index: protocols/msn/msn_util.c
===================================================================
--- protocols/msn/msn_util.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/msn/msn_util.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -96,6 +96,5 @@
 	msn_buddy_list_add( bla->ic, "AL", bla->handle, bla->realname );
 	
-	if( imcb_find_buddy( bla->ic, bla->handle ) == NULL )
-		imcb_ask_add( bla->ic, bla->handle, NULL );
+	imcb_ask_add( bla->ic, bla->handle, NULL );
 	
 	g_free( bla->handle );
Index: protocols/msn/sb.c
===================================================================
--- protocols/msn/sb.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/msn/sb.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -691,4 +691,6 @@
 			}
 		}
+#if 0
+		// Disable MSN ft support for now.
 		else if( g_strncasecmp( ct, "text/x-msmsgsinvite", 19 ) == 0 )
 		{
@@ -723,4 +725,5 @@
 			g_free( command );
 		}
+#endif
 		else if( g_strncasecmp( ct, "application/x-msnmsgrp2p", 24 ) == 0 ) 
 		{
Index: protocols/nogaim.c
===================================================================
--- protocols/nogaim.c	(revision 1f92a5851e0e3b1730e940980f2b0122c506c724)
+++ protocols/nogaim.c	(revision 17a6ee93f4fbefe8b4356d884fdd95f4e72ce8cc)
@@ -391,5 +391,5 @@
 	if( !bu || !fullname ) return;
 	
-	if( strcmp( bu->fullname, fullname ) != 0 )
+	if( !bu->fullname || strcmp( bu->fullname, fullname ) != 0 )
 	{
 		g_free( bu->fullname );
