--- msn.c.old	2005-02-16 20:12:44.000000000 +0000
+++ msn.c	2005-02-21 17:04:53.000000000 +0000
@@ -444,7 +444,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)
@@ -494,12 +494,11 @@
 
 	if (user != NULL)
 	{
-		g_string_append_printf(s, _("\n<b>%s:</b> %s"), _("Has you"),
-							   (user->list_op & (1 << MSN_LIST_RL)) ?
-							   _("Yes") : _("No"));
-		g_string_append_printf(s, _("\n<b>%s:</b> %s"), _("Blocked"),
-							   (user->list_op & (1 << MSN_LIST_BL)) ?
-							   _("Yes") : _("No"));
+		if (!(user->list_op & (1 << MSN_LIST_RL)))
+			g_string_append_printf(s, _("\n<b>%s:</b> %s"), _("Has you"), _("No"));
+
+		if (user->list_op & (1 << MSN_LIST_BL))
+			g_string_append_printf(s, _("\n<b>%s:</b> %s"), _("Blocked"), _("Yes"));
 	}
 
 	return g_string_free(s, FALSE);
@@ -516,6 +515,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;
@@ -805,6 +805,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	2005-02-10 00:07:30.000000000 +0000
+++ notification.c	2005-02-21 17:21:07.000000000 +0000
@@ -625,7 +625,10 @@
 	}
 
 	user->online = TRUE;
+	user->signon = -1;
 	msn_user_set_state(user, state);
+	if (user->status != 0)
+		user->idle = -1;
 	msn_user_update(user);
 }
 
@@ -649,6 +652,7 @@
 {
 	MsnSession *session;
 	GaimConnection *gc;
+	GaimBuddy *b;
 	MsnUser *user;
 	MsnObject *msnobj;
 	const char *state;
@@ -684,6 +688,9 @@
 
 	user->online = TRUE;
 	msn_user_set_state(user, state);
+	b = gaim_find_buddy(gc->account, passport);
+	user->signon = (b->signon != 0 ? b->signon : time(NULL));
+	user->idle = (user->status != 0 ? (b->idle > 0 ? b->idle : time(NULL)) : 0);
 	msn_user_update(user);
 }
 
--- user.c.old	2005-02-10 00:07:31.000000000 +0000
+++ user.c	2005-02-21 17:15:11.000000000 +0000
@@ -93,7 +93,7 @@
 	gc = user->userlist->session->account->gc;
 
 	if (user->online)
-		serv_got_update(gc, user->passport, TRUE, 0, 0, user->idle, user->status);
+		serv_got_update(gc, user->passport, TRUE, 0, user->signon, user->idle, user->status);
 	else
 		serv_got_update(gc, user->passport, FALSE, 0, 0, 0, 0);
 }
@@ -114,10 +114,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"))
--- user.h.old	2004-12-30 15:54:42.000000000 +0000
+++ user.h	2005-02-21 17:14:46.000000000 +0000
@@ -47,7 +47,8 @@
 
 	gboolean online;        /**< The User is online.            */
 	int status;             /**< The state of the user.         */
-	int idle;               /**< The idle state of the user.    */
+	int idle;               /**< The idle time of the user.     */
+	time_t signon;          /**< The signon time of the user.   */
 
 	struct
 	{

