Index: src/modules/m_names.c
===================================================================
--- src/modules/m_names.c	(revision 1)
+++ src/modules/m_names.c	(working copy)
@@ -90,7 +90,9 @@ static char buf[BUFSIZE];
 #define TRUNCATED_NAMES 64
 DLLFUNC CMD_FUNC(m_names)
 {
-	int  mlen = strlen(me.name) + NICKLEN + 7;
+	int uhnames = SupportUHNAMES(sptr); // cache UHNAMES support
+	int bufLen = NICKLEN + (!uhnames ? 0 : 1 + USERLEN + 1 + HOSTLEN);
+	int  mlen = strlen(me.name) + bufLen + 7;
 	aChannel *chptr;
 	aClient *acptr;
 	int  member;
@@ -202,12 +204,20 @@ DLLFUNC CMD_FUNC(m_names)
 			if (cm->flags & CHFL_VOICE)
 				buf[idx++] = '+';
 		}
-		for (s = acptr->name; *s; s++)
+		char nuhBuffer[bufLen + 1];
+		if(!uhnames) {
+			strlcpy(nuhBuffer, acptr->name, sizeof(nuhBuffer));
+		} else {
+			strlcpy(nuhBuffer, make_nick_user_host(acptr->name, 
+				acptr->user->username, acptr->user->cloakedhost),
+				sizeof(nuhBuffer));
+		}
+		for (s = nuhBuffer; *s; s++)
 			buf[idx++] = *s;
 		buf[idx++] = ' ';
 		buf[idx] = '\0';
 		flag = 1;
-		if (mlen + idx + NICKLEN > BUFSIZE - 7)
+		if (mlen + idx + bufLen > BUFSIZE - 7)
 		{
 			sendto_one(sptr, rpl_str(RPL_NAMREPLY), me.name,
 			    parv[0], buf);
Index: src/modules/m_protoctl.c
===================================================================
--- src/modules/m_protoctl.c	(revision 1)
+++ src/modules/m_protoctl.c	(working copy)
@@ -135,6 +135,11 @@ CMD_FUNC(m_protoctl)
 			Debug((DEBUG_ERROR, "Chose protocol %s for link %s", proto, cptr->name));
 			SetNAMESX(cptr);
 		}
+		if (!strcmp(s, "UHNAMES"))
+		{
+			Debug((DEBUG_ERROR, "Chose protocol %s for link %s", proto, cptr->name));
+			SetUHNAMES(cptr);
+		}
 		else if (strcmp(s, "NOQUIT") == 0)
 		{
 #ifndef PROTOCTL_MADNESS
Index: src/api-isupport.c
===================================================================
--- src/api-isupport.c	(revision 1)
+++ src/api-isupport.c	(working copy)
@@ -148,6 +148,7 @@ void isupport_init(void)
 	IsupportAdd(NULL, "HCN", NULL);
 	IsupportAdd(NULL, "SAFELIST", NULL);
 	IsupportAdd(NULL, "NAMESX", NULL);
+	IsupportAdd(NULL, "UHNAMES", NULL);
 	if (cmdstr)
 		IsupportAdd(NULL, "CMDS", cmdstr);
 }
Index: include/struct.h
===================================================================
--- include/struct.h	(revision 1)
+++ include/struct.h	(working copy)
@@ -361,6 +361,7 @@ typedef unsigned int u_int32_t;	/* XXX H
 #define PROTO_NICKIP	0x2000  /* Send IP addresses in the NICK command */
 #define PROTO_NAMESX	0x4000  /* Send all rights in NAMES output */
 #define PROTO_CLK		0x8000	/* Send cloaked host in the NICK command (regardless of +x/-x) */
+#define PROTO_UHNAMES	0x10000  /* Send n!u@h in NAMES */
 
 /*
  * flags macros.
@@ -527,6 +528,7 @@ typedef unsigned int u_int32_t;	/* XXX H
 #define SupportTKLEXT(x)	(CHECKPROTO(x, PROTO_TKLEXT))
 #define SupportNAMESX(x)	(CHECKPROTO(x, PROTO_NAMESX))
 #define SupportCLK(x)		(CHECKPROTO(x, PROTO_CLK))
+#define SupportUHNAMES(x)	(CHECKPROTO(x, PROTO_UHNAMES))
 
 #define SetSJOIN(x)		((x)->proto |= PROTO_SJOIN)
 #define SetNoQuit(x)		((x)->proto |= PROTO_NOQUIT)
@@ -541,6 +543,7 @@ typedef unsigned int u_int32_t;	/* XXX H
 #define SetTKLEXT(x)	((x)->proto |= PROTO_TKLEXT)
 #define SetNAMESX(x)	((x)->proto |= PROTO_NAMESX)
 #define SetCLK(x)		((x)->proto |= PROTO_CLK)
+#define SetUHNAMES(x)	((x)->proto |= PROTO_UHNAMES)
 
 #define ClearSJOIN(x)		((x)->proto &= ~PROTO_SJOIN)
 #define ClearNoQuit(x)		((x)->proto &= ~PROTO_NOQUIT)
