Index: protocols/bee.h
===================================================================
--- protocols/bee.h	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/bee.h	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -156,4 +156,5 @@
 G_MODULE_EXPORT void imcb_buddy_msg(struct im_connection *ic, const char *handle, const char *msg, guint32 flags,
                                     time_t sent_at);
+G_MODULE_EXPORT void imcb_notify_email(struct im_connection *ic, char *format, ...) G_GNUC_PRINTF(2, 3);
 
 /* bee_chat.c */
Index: protocols/bee_user.c
===================================================================
--- protocols/bee_user.c	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/bee_user.c	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -271,4 +271,30 @@
 }
 
+void imcb_notify_email(struct im_connection *ic, char *format, ...)
+{
+	const char *handle;
+	va_list params;
+	char *msg;
+
+	if (!set_getbool(&ic->acc->set, "mail_notifications")) {
+		return;
+	}
+
+	va_start(params, format);
+	msg = g_strdup_vprintf(format, params);
+	va_end(params);
+
+	/* up to the protocol to set_add this if they want to use this */
+	handle = set_getstr(&ic->acc->set, "mail_notifications_handle");
+
+	if (handle != NULL) {
+		imcb_buddy_msg(ic, handle, msg, 0, 0);
+	} else {
+		imcb_log(ic, "%s", msg);
+	}
+
+	g_free(msg);
+}
+
 void imcb_buddy_typing(struct im_connection *ic, const char *handle, uint32_t flags)
 {
Index: protocols/jabber/conference.c
===================================================================
--- protocols/jabber/conference.c	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/jabber/conference.c	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -354,77 +354,87 @@
 	struct xt_node *subject = xt_find_node(node->children, "subject");
 	struct xt_node *body = xt_find_node(node->children, "body");
-	struct groupchat *chat = bud ? jabber_chat_by_jid(ic, bud->bare_jid) : NULL;
-	struct jabber_chat *jc = chat ? chat->data : NULL;
-	char *s;
+	struct groupchat *chat = NULL;
+	struct jabber_chat *jc = NULL;
+	char *from = NULL;
+	char *nick = NULL;
+	char *final_from = NULL;
+	char *bare_jid = NULL;
+
+	from = (bud) ? bud->full_jid : xt_find_attr(node, "from");
+
+	if (from) {
+		nick = strchr(from, '/');
+		if (nick) {
+			*nick = 0;
+		}
+		chat = jabber_chat_by_jid(ic, from);
+		if (nick) {
+			*nick = '/';
+			nick++;
+		}
+	}
+
+	jc = (chat) ? chat->data : NULL;
+
+	if (!bud) {
+		struct xt_node *c;
+		char *s;
+
+		/* Try some clever stuff to find out the real JID here */
+		c = xt_find_node_by_attr(node->children, "delay", "xmlns", XMLNS_DELAY);
+
+		if (c && ((s = xt_find_attr(c, "from")) ||
+		          (s = xt_find_attr(c, "from_jid")))) {
+			/* This won't be useful if it's the MUC JID */
+			if (!(jc && jabber_compare_jid(s, jc->name))) {
+				/* Hopefully this one makes more sense! */
+				bud = jabber_buddy_by_jid(ic, s, GET_BUDDY_FIRST | GET_BUDDY_CREAT);
+			}
+		}
+
+	}
 
 	if (subject && chat) {
-		s = (bud && bud->ext_jid) ? strchr(bud->ext_jid, '/') : NULL;
-		if (s) {
-			*s = 0;
-		}
-		imcb_chat_topic(chat, bud ? bud->ext_jid : NULL, subject->text_len > 0 ?
-		                subject->text : NULL, jabber_get_timestamp(node));
-		if (s) {
-			*s = '/';
-		}
-	}
-
-	if (bud == NULL || (jc && ~jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me)) {
-		char *nick;
-
-		if (body == NULL || body->text_len == 0) {
-			/* Meh. Empty messages aren't very interesting, no matter
-			   how much some servers love to send them. */
-			return;
-		}
-
-		s = xt_find_attr(node, "from");   /* pkt_message() already NULL-checked this one. */
-		nick = strchr(s, '/');
-		if (nick) {
-			/* If this message included a resource/nick we don't know,
-			   we might still know the groupchat itself. */
-			*nick = 0;
-			chat = jabber_chat_by_jid(ic, s);
-			*nick = '/';
-
-			nick++;
+		char *subject_text = subject->text_len > 0 ? subject->text : NULL;
+		if (g_strcmp0(chat->topic, subject_text) != 0) {
+			bare_jid = (bud) ? jabber_get_bare_jid(bud->ext_jid) : NULL;
+			imcb_chat_topic(chat, bare_jid, subject_text,
+			                jabber_get_timestamp(node));
+			g_free(bare_jid);
+		}
+	}
+
+	if (body == NULL || body->text_len == 0) {
+		/* Meh. Empty messages aren't very interesting, no matter
+		   how much some servers love to send them. */
+		return;
+	}
+
+	if (chat == NULL) {
+		if (nick == NULL) {
+			imcb_log(ic, "System message from unknown groupchat %s: %s", from, body->text);
 		} else {
-			/* message.c uses the EXACT_JID option, so bud should
-			   always be NULL here for bare JIDs. */
-			chat = jabber_chat_by_jid(ic, s);
-		}
-
-		if (nick == NULL) {
-			/* This is fine, the groupchat itself isn't in jd->buddies. */
-			if (chat) {
-				imcb_chat_log(chat, "From conference server: %s", body->text);
-			} else {
-				imcb_log(ic, "System message from unknown groupchat %s: %s", s, body->text);
-			}
-		} else {
-			/* This can happen too, at least when receiving a backlog when
-			   just joining a channel. */
-			if (chat) {
-				imcb_chat_log(chat, "Message from unknown participant %s: %s", nick, body->text);
-			} else {
-				imcb_log(ic, "Groupchat message from unknown JID %s: %s", s, body->text);
-			}
+			imcb_log(ic, "Groupchat message from unknown JID %s: %s", from, body->text);
 		}
 
 		return;
-	} else if (chat == NULL) {
-		/* How could this happen?? We could do kill( self, 11 )
-		   now or just wait for the OS to do it. :-) */
+	} else if (chat != NULL && bud == NULL && nick == NULL) {
+		imcb_chat_log(chat, "From conference server: %s", body->text);
 		return;
-	}
-	if (body && body->text_len > 0) {
-		s = (bud->ext_jid) ? strchr(bud->ext_jid, '/') : NULL;
-		if (s) {
-			*s = 0;
-		}
-		imcb_chat_msg(chat, bud->ext_jid, body->text, 0, jabber_get_timestamp(node));
-		if (s) {
-			*s = '/';
-		}
-	}
-}
+	} else if (jc && jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me) {
+		/* exclude self-messages since they would get filtered out
+		 * but not the ones in the backlog */
+		return;
+	}
+
+	if (bud && jc && bud != jc->me) {
+		bare_jid = jabber_get_bare_jid(bud->ext_jid ? bud->ext_jid : bud->full_jid);
+		final_from = bare_jid;
+	} else {
+		final_from = nick;
+	}
+
+	imcb_chat_msg(chat, final_from, body->text, 0, jabber_get_timestamp(node));
+
+	g_free(bare_jid);
+}
Index: protocols/jabber/iq.c
===================================================================
--- protocols/jabber/iq.c	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/jabber/iq.c	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -27,4 +27,5 @@
 static xt_status jabber_parse_roster(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);
 static xt_status jabber_iq_display_vcard(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);
+static xt_status jabber_gmail_handle_new(struct im_connection *ic, struct xt_node *node);
 
 xt_status jabber_pkt_iq(struct xt_node *node, gpointer data)
@@ -141,4 +142,8 @@
 		    (strcmp(s, XMLNS_SI) == 0)) {
 			return jabber_si_handle_request(ic, node, c);
+		} else if ((c = xt_find_node(node->children, "new-mail")) &&
+		           (s = xt_find_attr(c, "xmlns")) &&
+		           (strcmp(s, XMLNS_GMAILNOTIFY) == 0)) {
+			return jabber_gmail_handle_new(ic, node);
 		} else if (!(c = xt_find_node(node->children, "query")) ||
 		           !(s = xt_find_attr(c, "xmlns"))) {
@@ -342,4 +347,7 @@
 			return XT_ABORT;
 		}
+		if (jd->flags & JFLAG_GMAILNOTIFY && node == NULL) {
+			jabber_iq_query_server(ic, jd->server, XMLNS_DISCO_INFO);
+		}
 	} else if ((jd->flags & (JFLAG_WANT_BIND | JFLAG_WANT_SESSION)) == 0) {
 		if (!jabber_get_roster(ic)) {
@@ -369,4 +377,23 @@
 
 	return st;
+}
+
+xt_status jabber_iq_query_gmail(struct im_connection *ic);
+
+static xt_status jabber_gmail_handle_new(struct im_connection *ic, struct xt_node *node)
+{
+	struct xt_node *response;
+	struct jabber_data *jd = ic->proto_data;
+
+	response = jabber_make_packet("iq", "result", g_strdup_printf("%s@%s", jd->username, jd->server), NULL);
+
+	jabber_cache_add(ic, response, NULL);
+	if (!jabber_write_packet(ic, response)) {
+		return XT_ABORT;
+	}
+
+	jabber_iq_query_gmail(ic);
+
+	return XT_HANDLED;
 }
 
@@ -710,4 +737,32 @@
 }
 
+xt_status jabber_iq_parse_gmail(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);
+
+xt_status jabber_iq_query_gmail(struct im_connection *ic)
+{
+	struct xt_node *node, *query;
+	struct jabber_data *jd = ic->proto_data;
+
+	node = xt_new_node("query", NULL, NULL);
+	xt_add_attr(node, "xmlns", XMLNS_GMAILNOTIFY);
+	if (jd->gmail_time) {
+		char *formatted = g_strdup_printf("%" G_GUINT64_FORMAT, (jd->gmail_time + 1));
+		xt_add_attr(node, "newer-than-time", formatted);
+		g_free(formatted);
+	}
+	if (jd->gmail_tid) {
+		xt_add_attr(node, "newer-than-tid", jd->gmail_tid);
+	}
+
+	if (!(query = jabber_make_packet("iq", "get", jd->me, node))) {
+		imcb_log(ic, "WARNING: Couldn't generate server query");
+		xt_free_node(node);
+	}
+
+	jabber_cache_add(ic, query, jabber_iq_parse_gmail);
+
+	return jabber_write_packet(ic, query) ? XT_HANDLED : XT_ABORT;
+}
+
 xt_status jabber_iq_parse_server_features(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);
 
@@ -729,4 +784,61 @@
 
 	return jabber_write_packet(ic, query) ? XT_HANDLED : XT_ABORT;
+}
+
+xt_status jabber_iq_parse_gmail(struct im_connection *ic, struct xt_node *node, struct xt_node *orig)
+{
+	struct xt_node *c;
+	struct jabber_data *jd = ic->proto_data;
+	char *xmlns, *from;
+	guint64 l_time = 0;
+	char *tid = NULL;
+	int max = 0;
+
+	if (!(c = xt_find_node(node->children, "mailbox")) ||
+	    !(from = xt_find_attr(node, "from")) ||
+	    !(xmlns = xt_find_attr(c, "xmlns")) ||
+	    (g_strcmp0(xmlns, XMLNS_GMAILNOTIFY) != 0)) {
+		imcb_log(ic, "WARNING: Received incomplete mailbox packet for gmail notify");
+		return XT_HANDLED;
+	}
+
+	max = set_getint(&ic->acc->set, "mail_notifications_limit");
+	c = c->children;
+
+	while ((max-- > 0) && (c = xt_find_node(c, "mail-thread-info"))) {
+		struct xt_node *s;
+		char *subject = "<no subject>";
+		char *sender = "<no sender>";
+		guint64 t_time;
+
+		t_time = g_ascii_strtoull(xt_find_attr(c, "date"), NULL, 10);
+		if (t_time && t_time > l_time) {
+			l_time = t_time;
+			tid = xt_find_attr(c, "tid");
+		}
+
+		if ((s = xt_find_node(c->children, "senders")) &&
+		    (s = xt_find_node_by_attr(s->children, "sender", "unread", "1"))) {
+			sender = xt_find_attr(s, "name");
+		}
+
+		if ((s = xt_find_node(c->children, "subject")) && s->text) {
+			subject = s->text;
+		}
+
+		imcb_notify_email(ic, "New mail from %s: %s", sender, subject);
+
+		c = c->next;
+	}
+
+	if (l_time && (!jd->gmail_time || l_time > jd->gmail_time)) {
+		jd->gmail_time = l_time;
+		if (tid) {
+			g_free(jd->gmail_tid);
+			jd->gmail_tid = g_strdup(tid);
+		}
+	}
+
+	return XT_HANDLED;
 }
 
@@ -781,4 +893,17 @@
 			c = c->next;
 		}
+
+		if (jd->flags & JFLAG_GMAILNOTIFY) {
+			/* search for gmail notification feature */
+			c = xt_find_node(node->children, "query");
+			c = c->children;
+			while ((c = xt_find_node(c, "feature"))) {
+				if (strcmp(xt_find_attr(c, "var"), XMLNS_GMAILNOTIFY) == 0) {
+					jabber_iq_query_gmail(ic);
+				}
+				c = c->next;
+			}
+		}
+
 	} else if (strcmp(xmlns, XMLNS_BYTESTREAMS) == 0) {
 		char *host, *jid, *port_s;
Index: protocols/jabber/jabber.c
===================================================================
--- protocols/jabber/jabber.c	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/jabber/jabber.c	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -100,5 +100,14 @@
 
 	s = set_add(&acc->set, "xmlconsole", "false", set_eval_bool, acc);
+
+	s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc);
 	s->flags |= ACC_SET_OFFLINE_ONLY;
+
+	/* changing this is rarely needed so keeping it secret */
+	s = set_add(&acc->set, "mail_notifications_limit", "5", set_eval_int, acc);
+	s->flags |= SET_HIDDEN_DEFAULT;
+
+	s = set_add(&acc->set, "mail_notifications_handle", NULL, NULL, acc);
+	s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK;
 
 	acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE |
@@ -260,4 +269,12 @@
 	}
 
+	if (set_getbool(&acc->set, "mail_notifications")) {
+		/* It's gmail specific, but it checks for server support before enabling it */
+		jd->flags |= JFLAG_GMAILNOTIFY;
+		if (set_getstr(&acc->set, "mail_notifications_handle")) {
+			imcb_add_buddy(ic, set_getstr(&acc->set, "mail_notifications_handle"), NULL);
+		}
+	}
+
 	jabber_generate_id_hash(jd);
 }
@@ -334,4 +351,5 @@
 	g_free(jd->away_message);
 	g_free(jd->internal_jid);
+	g_free(jd->gmail_tid);
 	g_free(jd->username);
 	g_free(jd->me);
Index: protocols/jabber/jabber.h
===================================================================
--- protocols/jabber/jabber.h	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/jabber/jabber.h	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -46,4 +46,5 @@
 	JFLAG_XMLCONSOLE = 64,          /* If the user added an xmlconsole buddy. */
 	JFLAG_STARTTLS_DONE = 128,      /* If a plaintext session was converted to TLS. */
+	JFLAG_GMAILNOTIFY = 256,        /* If gmail notification is enabled */
 
 	JFLAG_GTALK =  0x100000,        /* Is Google Talk, as confirmed by iq discovery */
@@ -102,4 +103,6 @@
 	const struct jabber_away_state *away_state;
 	char *away_message;
+	guint64 gmail_time;
+	char *gmail_tid;
 
 	md5_state_t cached_id_prefix;
@@ -224,4 +227,5 @@
 #define XMLNS_DELAY        "urn:xmpp:delay"                                      /* XEP-0203 */
 #define XMLNS_XDATA        "jabber:x:data"                                       /* XEP-0004 */
+#define XMLNS_GMAILNOTIFY  "google:mail:notify"                                  /* Not a XEP */
 #define XMLNS_CHATSTATES   "http://jabber.org/protocol/chatstates"               /* XEP-0085 */
 #define XMLNS_DISCO_INFO   "http://jabber.org/protocol/disco#info"               /* XEP-0030 */
@@ -312,4 +316,5 @@
 void jabber_error_free(struct jabber_error *err);
 gboolean jabber_set_me(struct im_connection *ic, const char *me);
+char *jabber_get_bare_jid(char *jid);
 
 extern const struct jabber_away_state jabber_away_state_list[];
Index: protocols/jabber/jabber_util.c
===================================================================
--- protocols/jabber/jabber_util.c	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/jabber/jabber_util.c	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -820,2 +820,18 @@
 	return TRUE;
 }
+
+/* Returns new reference! g_free() afterwards. */
+char *jabber_get_bare_jid(char *jid)
+{
+	char *s = NULL;
+
+	if (jid == NULL) {
+		return NULL;
+	}
+
+	if ((s = strchr(jid, '/'))) {
+		return g_strndup(jid, s - jid);
+	} else {
+		return g_strdup(jid);
+	}
+}
Index: protocols/jabber/presence.c
===================================================================
--- protocols/jabber/presence.c	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/jabber/presence.c	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -181,4 +181,20 @@
 }
 
+static char *choose_priority(struct im_connection *ic)
+{
+	struct jabber_data *jd = ic->proto_data;
+	char *prio = set_getstr(&ic->acc->set, "priority");
+
+	if (jd->away_state->code != NULL) {
+		int new_prio = (atoi(prio) - 5);
+		if (new_prio < 0) {
+			new_prio = 0;
+		}
+		return g_strdup_printf("%d", new_prio);
+	}
+
+	return g_strdup(prio);
+}
+
 /* Whenever presence information is updated, call this function to inform the
    server. */
@@ -189,7 +205,8 @@
 	GSList *l;
 	int st;
+	char *prio = choose_priority(ic);
 
 	node = jabber_make_packet("presence", NULL, NULL, NULL);
-	xt_add_child(node, xt_new_node("priority", set_getstr(&ic->acc->set, "priority"), NULL));
+	xt_add_child(node, xt_new_node("priority", prio, NULL));
 	if (jd->away_state) {
 		xt_add_child(node, xt_new_node("show", jd->away_state->code, NULL));
@@ -222,4 +239,5 @@
 
 	xt_free_node(node);
+	g_free(prio);
 	return st;
 }
Index: protocols/msn/msn.c
===================================================================
--- protocols/msn/msn.c	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/msn/msn.c	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -46,5 +46,9 @@
 	s->flags |= ACC_SET_OFFLINE_ONLY;
 
-	set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc);
+	s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc);
+	s->flags |= ACC_SET_OFFLINE_ONLY;
+
+	s = set_add(&acc->set, "mail_notifications_handle", NULL, NULL, acc);
+	s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK;
 
 	acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE |
@@ -82,4 +86,8 @@
 	msn_ns_connect(ic, server,
 	               set_getint(&ic->acc->set, "port"));
+
+	if (set_getbool(&acc->set, "mail_notifications") && set_getstr(&acc->set, "mail_notifications_handle")) {
+		imcb_add_buddy(ic, set_getstr(&acc->set, "mail_notifications_handle"), NULL);
+	}
 }
 
Index: protocols/msn/ns.c
===================================================================
--- protocols/msn/ns.c	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/msn/ns.c	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -394,7 +394,7 @@
 
 					if (inbox && folders) {
-						imcb_log(ic,
-						         "INBOX contains %s new messages, plus %s messages in other folders.", inbox,
-						         folders);
+						imcb_notify_email(ic,
+						        "INBOX contains %s new messages, plus %s messages in other folders.", inbox,
+						        folders);
 					}
 
@@ -408,6 +408,5 @@
 
 					if (from && fromname) {
-						imcb_log(ic, "Received an e-mail message from %s <%s>.", fromname,
-						         from);
+						imcb_notify_email(ic, "Received an e-mail message from %s <%s>.", fromname, from);
 					}
 
Index: protocols/purple/purple.c
===================================================================
--- protocols/purple/purple.c	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/purple/purple.c	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -238,4 +238,7 @@
 		s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc);
 		s->flags |= ACC_SET_OFFLINE_ONLY;
+
+		s = set_add(&acc->set, "mail_notifications_handle", NULL, NULL, acc);
+		s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK;
 	}
 
@@ -332,4 +335,8 @@
 
 	purple_account_set_enabled(pd->account, "BitlBee", TRUE);
+
+	if (set_getbool(&acc->set, "mail_notifications") && set_getstr(&acc->set, "mail_notifications_handle")) {
+		imcb_add_buddy(ic, set_getstr(&acc->set, "mail_notifications_handle"), NULL);
+	}
 }
 
@@ -1255,5 +1262,5 @@
 	struct im_connection *ic = purple_ic_by_gc(gc);
 
-	imcb_log(ic, "Received e-mail from %s for %s: %s <%s>", from, to, subject, url);
+	imcb_notify_email(ic, "Received e-mail from %s for %s: %s <%s>", from, to, subject, url);
 
 	return NULL;
Index: protocols/yahoo/yahoo.c
===================================================================
--- protocols/yahoo/yahoo.c	(revision 08a93231c04493e35e0a9d48fe142f81f6da1240)
+++ protocols/yahoo/yahoo.c	(revision bef322e939457bf0f4bf9441e9ec1d6efe29c4af)
@@ -123,5 +123,11 @@
 static void byahoo_init(account_t *acc)
 {
-	set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc);
+	set_t *s;
+
+	s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc);
+	s->flags |= ACC_SET_OFFLINE_ONLY;
+
+	s = set_add(&acc->set, "mail_notifications_handle", NULL, NULL, acc);
+	s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK;
 
 	acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE;
@@ -145,4 +151,8 @@
 	yd->y2_id = yahoo_init(acc->user, acc->pass);
 	yahoo_login(yd->y2_id, yd->current_status);
+
+	if (set_getbool(&acc->set, "mail_notifications") && set_getstr(&acc->set, "mail_notifications_handle")) {
+		imcb_add_buddy(ic, set_getstr(&acc->set, "mail_notifications_handle"), NULL);
+	}
 }
 
@@ -950,10 +960,8 @@
 	struct im_connection *ic = byahoo_get_ic_by_id(id);
 
-	if (!set_getbool(&ic->acc->set, "mail_notifications")) {
-		; /* The user doesn't care. */
-	} else if (from && subj) {
-		imcb_log(ic, "Received e-mail message from %s with subject `%s'", from, subj);
+	if (from && subj) {
+		imcb_notify_email(ic, "Received e-mail message from %s with subject `%s'", from, subj);
 	} else if (cnt > 0) {
-		imcb_log(ic, "Received %d new e-mails", cnt);
+		imcb_notify_email(ic, "Received %d new e-mails", cnt);
 	}
 }
