Index: doc/user-guide/commands.xml
===================================================================
--- doc/user-guide/commands.xml	(revision f9ed3113c4bc5110171295abef9c140e1328aeb1)
+++ doc/user-guide/commands.xml	(revision e88fbe272c097066e538d670fe8fa907e9847321)
@@ -21,5 +21,5 @@
 			<description>
 				<para>
-					Adds an account on the given server with the specified protocol, username and password to the account list. Supported protocols right now are: Jabber, MSN, OSCAR (AIM/ICQ) and Yahoo. For more information about adding an account, see <emphasis>help account add &lt;protocol&gt;</emphasis>.
+					Adds an account on the given server with the specified protocol, username and password to the account list. Supported protocols right now are: Jabber, MSN, OSCAR (AIM/ICQ), Yahoo and Twitter. For more information about adding an account, see <emphasis>help account add &lt;protocol&gt;</emphasis>.
 				</para>
 			</description>
@@ -73,9 +73,9 @@
 					
 					<para>
-						By default all your Twitter contacts will show up in your contact list and their tweets will show up as private messages or in &amp;bitlbee depending on your settings. If you want them in a separate channel, use the use_groupchat setting (see <emphasis>help set use_groupchat</emphasis>).
+						By default all your Twitter contacts will come from a contact called twitter_(yourusername). You can change this behaviour using the <emphasis>mode</emphasis> setting (see <emphasis>help set mode</emphasis>).
 					</para>
 					
 					<para>
-						To send tweets yourself, send them to any of your Twitter contacts via /query (doesn't matter who), or just write in the groupchat channel if you enabled that option.
+						To send tweets yourself, send them to the twitter_(yourusername) contact, or just write in the groupchat channel if you enabled that option.
 					</para>
 				</description>
@@ -659,4 +659,24 @@
 	</bitlbee-setting>
 
+	<bitlbee-setting name="mode" type="string" scope="account">
+		<possible-values>one, many, chat</possible-values>
+		<default>one</default>
+
+		<description>
+			<para>
+				By default, everything from the Twitter module will come from one nick, twitter_(yourusername). If you prefer to have individual nicks for everyone, you can set this setting to "many" instead.
+			</para>
+			
+			<para>
+				If you prefer to have all your Twitter things in a separate channel, you can set this setting to "chat".
+			</para>
+			
+			<para>
+				In the last two modes, you can send direct messages by /msg'ing your contacts directly. Note, however, that incoming DMs are not fetched yet.
+			</para>
+		</description>
+
+	</bitlbee-setting>
+
 	<bitlbee-setting name="nick" type="string" scope="chat">
 
@@ -916,14 +936,4 @@
 			<para>
 				Sends you a /notice when a user starts typing a message (if supported by the IM protocol and the user's client). To use this, you most likely want to use a script in your IRC client to show this information in a more sensible way.
-			</para>
-		</description>
-	</bitlbee-setting>
-
-	<bitlbee-setting name="use_groupchat" type="boolean" scope="account">
-		<default>false</default>
-
-		<description>
-			<para>
-				By default the Twitter module shows all Twitter contacts and their Tweet in &amp;bitlbee and/or private messages. With this setting enabled the module will show all contacts and their Tweets in a separate channel.
 			</para>
 		</description>
Index: protocols/twitter/twitter.c
===================================================================
--- protocols/twitter/twitter.c	(revision f9ed3113c4bc5110171295abef9c140e1328aeb1)
+++ protocols/twitter/twitter.c	(revision e88fbe272c097066e538d670fe8fa907e9847321)
@@ -41,5 +41,5 @@
 	// If the user uses multiple private message windows we need to get the 
 	// users buddies.
-	if (!set_getbool( &ic->acc->set, "use_groupchat" ))
+	if (g_strcasecmp(set_getstr(&ic->acc->set, "mode"), "many") == 0)
 		twitter_get_statuses_friends(ic, -1);
 
@@ -51,9 +51,19 @@
 }
 
+static char *set_eval_mode( set_t *set, char *value )
+{
+	if( g_strcasecmp( value, "one" ) == 0 ||
+	    g_strcasecmp( value, "many" ) == 0 ||
+	    g_strcasecmp( value, "char" ) == 0 )
+		return value;
+	else
+		return NULL;
+}
 
 static void twitter_init( account_t *acc )
 {
 	set_t *s;
-	s = set_add( &acc->set, "use_groupchat", "false", set_eval_bool, acc );
+	
+	s = set_add( &acc->set, "mode", "one", set_eval_mode, acc );
 	s->flags |= ACC_SET_OFFLINE_ONLY;
 }
@@ -67,4 +77,5 @@
 	struct im_connection *ic = imcb_new( acc );
 	struct twitter_data *td = g_new0( struct twitter_data, 1 );
+	char name[strlen(acc->user)+9];
 
 	twitter_connections = g_slist_append( twitter_connections, ic );
@@ -84,4 +95,8 @@
 	// Save the return value, so we can remove the timeout on logout.
 	td->main_loop_id = b_timeout_add(60000, twitter_main_loop, ic);
+	
+	sprintf( name, "twitter_%s", acc->user );
+	imcb_add_buddy( ic, name, NULL );
+	imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL );
 }
 
@@ -115,9 +130,10 @@
 static int twitter_buddy_msg( struct im_connection *ic, char *who, char *message, int away )
 {
-	// Let's just update the status.
-//	if ( g_strcasecmp(who, ic->acc->user) == 0 )
+	if (g_strncasecmp(who, "twitter_", 8) == 0 &&
+	    g_strcasecmp(who + 8, ic->acc->user) == 0)
 		twitter_post_status(ic, message);
-//	else
-//		twitter_direct_messages_new(ic, who, message);
+	else
+		twitter_direct_messages_new(ic, who, message);
+	
 	return( 0 );
 }
Index: protocols/twitter/twitter_lib.c
===================================================================
--- protocols/twitter/twitter_lib.c	(revision f9ed3113c4bc5110171295abef9c140e1328aeb1)
+++ protocols/twitter/twitter_lib.c	(revision e88fbe272c097066e538d670fe8fa907e9847321)
@@ -105,10 +105,12 @@
 	if (!imcb_find_buddy( ic, name ))
 	{
+		char *mode = set_getstr(&ic->acc->set, "mode");
+		
 		// The buddy is not in the list, add the buddy and set the status to logged in.
 		imcb_add_buddy( ic, name, NULL );
 		imcb_rename_buddy( ic, name, fullname );
-		if (set_getbool( &ic->acc->set, "use_groupchat" ))
+		if (g_strcasecmp(mode, "chat") == 0)
 			imcb_chat_add_buddy( td->home_timeline_gc, name );
-		else
+		else if (g_strcasecmp(mode, "many") == 0)
 			imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL );
 	}
@@ -452,12 +454,35 @@
 	GSList *l = NULL;
 	struct twitter_xml_status *status;
-
+	char from[MAX_STRING];
+	gboolean mode_one;
+	
+	mode_one = g_strcasecmp( set_getstr( &ic->acc->set, "mode" ), "one" ) == 0;
+
+	if( mode_one )
+	{
+		g_snprintf( from, sizeof( from ) - 1, "twitter_%s", ic->acc->user );
+		from[MAX_STRING-1] = '\0';
+	}
+	
 	for ( l = list; l ; l = g_slist_next(l) )
 	{
+		char *text = NULL;
+		
 		status = l->data;
-		imcb_buddy_msg( ic, status->user->screen_name, status->text, 0, status->created_at );
+		
+		if( mode_one )
+			text = g_strdup_printf( "\002<\002%s\002>\002 %s",
+			                        status->user->screen_name, status->text );
+		
+		imcb_buddy_msg( ic,
+		                mode_one ? from : status->user->screen_name,
+		                mode_one ? text : status->text,
+		                0, status->created_at );
+		
 		// Update the home_timeline_id to hold the highest id, so that by the next request
 		// we won't pick up the updates allready in the list.
 		td->home_timeline_id = td->home_timeline_id < status->id ? status->id : td->home_timeline_id;
+		
+		g_free( text );
 	}
 }
@@ -512,5 +537,5 @@
 
 	// See if the user wants to see the messages in a groupchat window or as private messages.
-	if (set_getbool( &ic->acc->set, "use_groupchat" ))
+	if (g_strcasecmp(set_getstr(&ic->acc->set, "mode"), "chat") == 0)
 		twitter_groupchat(ic, txl->list);
 	else
@@ -612,5 +637,5 @@
 	if (req->status_code != 200) {
 		// It didn't go well, output the error and return.
-		imcb_error(ic, "Could not post tweet... HTTP STATUS: %d", req->status_code);
+		imcb_error(ic, "Could not post message... HTTP STATUS: %d", req->status_code);
 		return;
 	}
