Index: protocols/bee_chat.c
===================================================================
--- protocols/bee_chat.c	(revision 04cd284bce74c114fde3043c951a5c8ef9eb79ae)
+++ protocols/bee_chat.c	(revision 62f53b508742804d5df6533150f17d41e6afcbb2)
@@ -196,5 +196,5 @@
 	}
 	
-	if( bee->ui->chat_remove_user )
+	if( bee->ui->chat_remove_user && bu )
 		bee->ui->chat_remove_user( bee, c, bu );
 }
Index: protocols/purple/purple.c
===================================================================
--- protocols/purple/purple.c	(revision 04cd284bce74c114fde3043c951a5c8ef9eb79ae)
+++ protocols/purple/purple.c	(revision 62f53b508742804d5df6533150f17d41e6afcbb2)
@@ -80,4 +80,26 @@
 	char help_title[64];
 	GString *help;
+	static gboolean dir_fixed = FALSE;
+	
+	/* Layer violation coming up: Making an exception for libpurple here.
+	   Dig in the IRC state a bit to get a username. Ideally we should
+	   check if s/he identified but this info doesn't seem *that* important.
+	   It's just that fecking libpurple can't *not* store this shit.
+	   
+	   Remember that libpurple is not really meant to be used on public
+	   servers anyway! */
+	if( !dir_fixed )
+	{
+		irc_t *irc = acc->bee->ui_data;
+		char *dir;
+		
+		dir = g_strdup_printf( "%s/purple/%s", global.conf->configdir, irc->user->nick );
+		purple_util_set_user_dir( dir );
+		g_free( dir );
+		
+		purple_blist_load();
+		purple_prefs_load();
+		dir_fixed = TRUE;
+	}
 	
 	help = g_string_new( "" );
@@ -254,5 +276,6 @@
 	PurpleAccount *pa;
 	
-	if( local_bee != NULL && local_bee != acc->bee )
+	if( ( local_bee != NULL && local_bee != acc->bee ) ||
+	    ( global.conf->runmode == RUNMODE_DAEMON && !getenv( "BITLBEE_DEBUG" ) ) )
 	{
 		imcb_error( ic,  "Daemon mode detected. Do *not* try to use libpurple in daemon mode! "
@@ -351,4 +374,7 @@
 	account_t *acc = set->data;
 	struct im_connection *ic = acc->ic;
+	
+	if( ic )
+		imcb_log( ic, "Changing display_name not currently supported with libpurple!" );
 	
 	return NULL;
@@ -517,5 +543,5 @@
 }
 
-struct groupchat *purple_chat_join( struct im_connection *ic, const char *room, const char *nick, const char *password )
+struct groupchat *purple_chat_join( struct im_connection *ic, const char *room, const char *nick, const char *password, set_t **sets )
 {
 	PurpleAccount *pa = ic->proto_data;
@@ -1132,4 +1158,5 @@
 	GList *prots;
 	GString *help;
+	char *dir;
 	
 	if( B_EV_IO_READ != PURPLE_INPUT_READ ||
@@ -1140,5 +1167,8 @@
 	}
 	
-	purple_util_set_user_dir( "/tmp" );
+	dir = g_strdup_printf( "%s/purple", global.conf->configdir );
+	purple_util_set_user_dir( dir );
+	g_free( dir );
+	
 	purple_debug_set_enabled( FALSE );
 	purple_core_set_ui_ops( &bee_core_uiops );
@@ -1151,10 +1181,5 @@
 	}
 	
-	/* This seems like stateful shit we don't want... */
 	purple_set_blist( purple_blist_new() );
-	purple_blist_load();
-	
-	/* Meh? */
-	purple_prefs_load();
 	
 	/* No, really. So far there were ui_ops for everything, but now suddenly
@@ -1221,5 +1246,6 @@
 	
 	g_string_append( help, "\n\nFor used protocols, more information about available "
-	                 "settings can be found using \x02help purple <protocol name>\x02" );
+	                 "settings can be found using \x02help purple <protocol name>\x02 "
+	                 "(create an account using that protocol first!)" );
 	
 	/* Add a simple dynamically-generated help item listing all
Index: protocols/twitter/twitter.c
===================================================================
--- protocols/twitter/twitter.c	(revision 04cd284bce74c114fde3043c951a5c8ef9eb79ae)
+++ protocols/twitter/twitter.c	(revision 62f53b508742804d5df6533150f17d41e6afcbb2)
@@ -29,4 +29,14 @@
 #include "url.h"
 
+#define twitter_msg( ic, fmt... ) \
+	do {                                                        \
+		struct twitter_data *td = ic->proto_data;           \
+		if( td->home_timeline_gc )                          \
+			imcb_chat_log( td->home_timeline_gc, fmt ); \
+		else                                                \
+			imcb_log( ic, fmt );                        \
+	} while( 0 );
+		
+
 /**
  * Main loop function
@@ -436,4 +446,6 @@
 		if( id )
 			twitter_status_destroy( ic, id );
+		else
+			twitter_msg( ic, "Could not undo last action" );
 		
 		g_free( cmds );
@@ -467,4 +479,7 @@
 		if( id )
 			twitter_status_retweet( ic, id );
+		else
+			twitter_msg( ic, "User `%s' does not exist or didn't "
+			                 "post any statuses recently", cmd[1] );
 		
 		g_free( cmds );
