+diff -r 4c7b03099b6f include/s_user.h
+--- a/include/s_user.h
++++ b/include/s_user.h
+@@ -79,7 +79,7 @@
+ extern int set_nick_name(struct Client* cptr, struct Client* sptr,
+ const char* nick, int parc, char* parv[]);
+ extern void send_umode_out(struct Client* cptr, struct Client* sptr,
+- struct Flags* old, int prop);
++ struct Flags* old, int prop, int alreadyh);
+ extern int whisper(struct Client* source, const char* nick,
+ const char* channel, const char* text, int is_notice);
+ extern void send_user_info(struct Client* to, char* names, int rpl,
+@@ -102,7 +102,7 @@
+ extern struct Client* next_client(struct Client* next, const char* ch);
+ extern char *umode_str(struct Client *cptr, int type);
+ extern void send_umode(struct Client *cptr, struct Client *sptr,
+- struct Flags *old, int sendset, int opernames);
++ struct Flags *old, int sendset, int opernames, int alreadyh);
+ extern void set_snomask(struct Client *, unsigned int, int);
+ extern int is_snomask(char *);
+ extern int check_target_limit(struct Client *sptr, void *target, const char *name,
+diff -r 4c7b03099b6f ircd/m_oper.c
+--- a/ircd/m_oper.c
++++ b/ircd/m_oper.c
+@@ -189,7 +189,7 @@
+
+ set_snomask(sptr, SNO_OPERDEFAULT, SNO_ADD);
+ cli_max_sendq(sptr) = 0; /* Get the sendq from the oper's class */
+- send_umode_out(cptr, sptr, &old_mode, HasPriv(sptr, PRIV_PROPAGATE));
++ send_umode_out(cptr, sptr, &old_mode, HasPriv(sptr, PRIV_PROPAGATE), 0);
+ send_reply(sptr, RPL_YOUREOPER);
+
+ sendto_opmask_butone(0, SNO_OLDSNO, "%s (%s@%s) is now operator (%c)",
+diff -r 4c7b03099b6f ircd/m_sethost.c
+--- a/ircd/m_sethost.c
++++ b/ircd/m_sethost.c
+@@ -114,11 +114,16 @@
+ */
+ int m_sethost(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
+ {
++ int alreadyh = 0;
+ char hostmask[USERLEN + HOSTLEN + 2];
+ char curhostmask[USERLEN + HOSTLEN + 2];
+
+ struct Flags setflags;
+
++ /* user already +h, save */
++ if (IsSetHost(sptr))
++ alreadyh = 1;
++
+ /* Back up the flags first */
+ setflags = cli_flags(sptr);
+
+@@ -161,7 +166,7 @@
+ }
+ }
+
+- send_umode_out(cptr, sptr, &setflags, 0);
++ send_umode_out(cptr, sptr, &setflags, 0, alreadyh);
+ return 0;
+ }
+
+@@ -176,6 +181,7 @@
+ */
+ int ms_sethost(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
+ {
++ int alreadyh = 0;
+ struct Client *target;
+ char hostmask[USERLEN + HOSTLEN + 2];
+ struct Membership *chan;
+@@ -204,6 +210,10 @@
+ return 0;
+ }
+
++ /* target already +h, save */
++ if (IsSetHost(target))
++ alreadyh = 1;
++
+ /* Back up the flags first */
+ setflags = cli_flags(target);
+ FlagClr(&setflags, FLAG_SETHOST);
+@@ -256,6 +266,6 @@
+ }
+ }
+
+- send_umode_out(target, target, &setflags, 0);
++ send_umode_out(target, target, &setflags, 0, alreadyh);
+ return 0;
+ }
+diff -r 4c7b03099b6f ircd/s_user.c