--- msn.c.old	2004-08-05 22:45:57.000000000 +0100
+++ msn.c	2004-08-08 17:57:33.000000000 +0100
@@ -415,7 +415,7 @@
                emblems[i++] = "offline";
        else if (away_type == MSN_BUSY || away_type == MSN_PHONE)
                emblems[i++] = "occupied";
-       else if (away_type != 0)
+       else if (away_type != 0 && away_type != MSN_IDLE)
                emblems[i++] = "away";
 
        if (user == NULL)
@@ -443,15 +443,24 @@
 static char *
 msn_tooltip_text(GaimBuddy *b)
 {
-	char *text = NULL;
+	GString *text = g_string_new("");
+	MsnUser *user;
+
+	user = b->proto_data;
 
 	if (GAIM_BUDDY_IS_ONLINE(b))
 	{
-		text = g_strdup_printf(_("\n<b>%s:</b> %s"), _("Status"),
+		g_string_append_printf(text, "\n<b>%s:</b> %s", _("Status"),
 							   msn_away_get_text(MSN_AWAY_TYPE(b->uc)));
 	}
 
-	return text;
+	if (!(user->list_op & MSN_LIST_RL_OP))
+	{
+		g_string_append_printf(text, "\n<b>%s:</b> %s", _("Contact List"),
+							   _("You are not on this buddy's contact list"));
+	}
+
+	return g_string_free(text, FALSE);
 }
 
 static GList *
@@ -465,6 +474,7 @@
 	m = g_list_append(m, _("Busy"));
 	m = g_list_append(m, _("On The Phone"));
 	m = g_list_append(m, _("Out To Lunch"));
+	m = g_list_append(m, _("Idle"));
 	m = g_list_append(m, _("Hidden"));
 
 	return m;
@@ -763,6 +773,8 @@
 			status = MSN_PHONE;
 		else if (!strcmp(state, _("Out To Lunch")))
 			status = MSN_LUNCH;
+		else if (!strcmp(state, _("Idle")))
+			status = MSN_IDLE;
 		else if (!strcmp(state, _("Hidden")))
 			status = MSN_HIDDEN;
 		else
--- notification.c.old	2004-06-23 20:38:58.000000000 +0100
+++ notification.c	2004-06-27 18:06:49.000000000 +0100
@@ -480,10 +480,7 @@
 	if (!g_ascii_strcasecmp(state, "BSY"))
 		status |= UC_UNAVAILABLE | (MSN_BUSY << 1);
 	else if (!g_ascii_strcasecmp(state, "IDL"))
-	{
 		status |= UC_UNAVAILABLE | (MSN_IDLE << 1);
-		idle = -1;
-	}
 	else if (!g_ascii_strcasecmp(state, "BRB"))
 		status |= UC_UNAVAILABLE | (MSN_BRB << 1);
 	else if (!g_ascii_strcasecmp(state, "AWY"))
@@ -493,7 +490,10 @@
 	else if (!g_ascii_strcasecmp(state, "LUN"))
 		status |= UC_UNAVAILABLE | (MSN_LUNCH << 1);
 
-	serv_got_update(gc, passport, 1, 0, 0, idle, status);
+	if (status != 0)
+		idle = -1;
+
+	serv_got_update(gc, passport, 1, 0, -1, idle, status);
 }
 
 static void
@@ -522,7 +522,9 @@
 	const char *passport;
 	const char *friendly;
 	int status = 0;
-	int idle = 0;
+	time_t idle = 0;
+	time_t signon = 0;
+	GaimBuddy *b;
 
 	session = cmdproc->session;
 	gc = session->account->gc;
@@ -547,10 +549,7 @@
 	if (!g_ascii_strcasecmp(state, "BSY"))
 		status |= UC_UNAVAILABLE | (MSN_BUSY << 1);
 	else if (!g_ascii_strcasecmp(state, "IDL"))
-	{
 		status |= UC_UNAVAILABLE | (MSN_IDLE << 1);
-		idle = -1;
-	}
 	else if (!g_ascii_strcasecmp(state, "BRB"))
 		status |= UC_UNAVAILABLE | (MSN_BRB << 1);
 	else if (!g_ascii_strcasecmp(state, "AWY"))
@@ -560,7 +559,10 @@
 	else if (!g_ascii_strcasecmp(state, "LUN"))
 		status |= UC_UNAVAILABLE | (MSN_LUNCH << 1);
 
-	serv_got_update(gc, passport, 1, 0, 0, idle, status);
+	b = gaim_find_buddy(gc->account, passport);
+	signon = (b->signon != 0 ? b->signon : time(NULL));
+	idle = (status != 0 ? (b->idle > 0 ? b->idle : time(NULL)) : 0);
+	serv_got_update(gc, passport, 1, 0, signon, idle, status);
 }
 
 static void

