diff --git a/src/core/nicklist.c b/src/core/nicklist.c
index d5841b45..fe2a2842 100644
--- a/src/core/nicklist.c
+++ b/src/core/nicklist.c
@@ -57,6 +57,19 @@ NICK_REC *nicklist_insert(CHANNEL_REC *channel, const char *nick,
 	return rec;
 }
 
+/* Set host address for nick */
+void nicklist_set_host(CHANNEL_REC *channel, NICK_REC *nick, const char *host)
+{
+        g_return_if_fail(channel != NULL);
+        g_return_if_fail(nick != NULL);
+	g_return_if_fail(host != NULL);
+
+        g_free_not_null(nick->host);
+	nick->host = g_strdup(host);
+
+        signal_emit("nicklist host changed", 2, channel, nick);
+}
+
 static void nicklist_destroy(CHANNEL_REC *channel, NICK_REC *nick)
 {
 	signal_emit("nicklist remove", 2, channel, nick);
@@ -257,12 +270,12 @@ void nicklist_update_flags(SERVER_REC *server, const char *nick,
 
 		if (gone != -1 && (int)rec->gone != gone) {
 			rec->gone = gone;
-			signal_emit("nick gone changed", 2, channel, rec);
+			signal_emit("nicklist gone changed", 2, channel, rec);
 		}
 
 		if (serverop != -1 && (int)rec->serverop != serverop) {
 			rec->serverop = serverop;
-			signal_emit("nick serverop changed", 2, channel, rec);
+			signal_emit("nicklist serverop changed", 2, channel, rec);
 		}
 	}
 	g_slist_free(nicks);
diff --git a/src/core/nicklist.h b/src/core/nicklist.h
index e1deb154..0fde8bc6 100644
--- a/src/core/nicklist.h
+++ b/src/core/nicklist.h
@@ -15,6 +15,8 @@ struct _NICK_REC {
 /* Add new nick to list */
 NICK_REC *nicklist_insert(CHANNEL_REC *channel, const char *nick,
 			  int op, int voice, int send_massjoin);
+/* Set host address for nick */
+void nicklist_set_host(CHANNEL_REC *channel, NICK_REC *nick, const char *host);
 /* Remove nick from list */
 void nicklist_remove(CHANNEL_REC *channel, NICK_REC *nick);
 /* Change nick */
diff --git a/src/irc/core/irc-nicklist.c b/src/irc/core/irc-nicklist.c
index 245d1fdd..807934d2 100644
--- a/src/irc/core/irc-nicklist.c
+++ b/src/irc/core/irc-nicklist.c
@@ -134,8 +134,11 @@ static void event_who(SERVER_REC *server, const char *data)
 	nickrec = chanrec == NULL ? NULL :
 		nicklist_find(chanrec, nick);
 	if (nickrec != NULL) {
-		if (nickrec->host == NULL)
-			nickrec->host = g_strdup_printf("%s@%s", user, host);
+		if (nickrec->host == NULL) {
+                        char *str = g_strdup_printf("%s@%s", user, host);
+			nicklist_set_host(chanrec, nickrec, str);
+                        g_free(str);
+		}
 		if (nickrec->realname == NULL)
 			nickrec->realname = g_strdup(realname);
 		sscanf(hops, "%d", &nickrec->hops);
diff --git a/src/irc/core/massjoin.c b/src/irc/core/massjoin.c
index 701d2a33..1c7d55fb 100644
--- a/src/irc/core/massjoin.c
+++ b/src/irc/core/massjoin.c
@@ -59,7 +59,7 @@ static void event_join(IRC_SERVER_REC *server, const char *data,
 
 	/* add user to nicklist */
 	nickrec = nicklist_insert(CHANNEL(chanrec), nick, FALSE, FALSE, TRUE);
-	nickrec->host = g_strdup(address);
+        nicklist_set_host(CHANNEL(chanrec), nickrec, address);
 
 	if (chanrec->massjoins == 0) {
 		/* no nicks waiting in massjoin queue */