diff -uNr Unreal3.2/src/modules/m_oper.c Unreal3.2.tmp/src/modules/m_oper.c
--- Unreal3.2/src/modules/m_oper.c	Wed Dec 29 23:59:03 2010
+++ Unreal3.2.tmp/src/modules/m_oper.c	Thu Dec 30 16:46:33 2010
@@ -98,10 +98,14 @@
 	oper_oflags[8].umode = &UMODE_WHOIS;
 	oper_oflags[8].host = NULL;
 	oper_oflags[8].announce = NULL;
-	oper_oflags[9].oflag = 0;
-	oper_oflags[9].umode = NULL;
+	oper_oflags[9].oflag = OFLAG_GREHASH;
+	oper_oflags[9].umode = &UMODE_GREHASH;
 	oper_oflags[9].host = NULL;
 	oper_oflags[9].announce = NULL;
+	oper_oflags[10].oflag = 0;
+	oper_oflags[10].umode = NULL;
+	oper_oflags[10].host = NULL;
+	oper_oflags[10].announce = NULL;
 }
 	
 
@@ -316,9 +320,9 @@
 
 		if (announce != NULL)
 			sendto_snomask_global(SNO_OPER,
-			    "%s (%s@%s) [%s] %s",
+			    "%s (%s@%s) [%s] %s || OPCanGRehash: %d || oflag: %ld",
 			    parv[0], sptr->user->username, sptr->sockhost,
-			    parv[1], announce);
+			    parv[1], announce, OPCanGRehash(sptr), sptr->oflag);
 		if (aconf->snomask)
 			set_snomask(sptr, aconf->snomask);
 		else
diff -uNr Unreal3.2/src/modules/m_svso.c Unreal3.2.tmp/src/modules/m_svso.c
--- Unreal3.2/src/modules/m_svso.c	Mon Jan 22 13:25:40 2007
+++ Unreal3.2.tmp/src/modules/m_svso.c	Thu Dec 30 16:51:25 2010
@@ -85,6 +85,7 @@
 	OFLAG_UMODEQ, 'q',
 	OFLAG_DCCDENY, 'd',
 	OFLAG_ADDLINE, 'X',
+	OFLAG_GREHASH, 'e',
         0, 0
 };
 
diff -uNr Unreal3.2/src/s_conf.c Unreal3.2.tmp/src/s_conf.c
--- Unreal3.2/src/s_conf.c	Wed Dec 29 23:59:03 2010
+++ Unreal3.2.tmp/src/s_conf.c	Thu Dec 30 16:50:33 2010
@@ -207,6 +207,7 @@
 	OFLAG_UMODEQ, 'q',
 	OFLAG_DCCDENY, 'd',
 	OFLAG_ADDLINE, 'X',
+	OFLAG_GREHASH, 'e',
 	0, 0
 };
 
@@ -219,6 +220,7 @@
 	{ OFLAG_TKL,		"can_gkline"},
 	{ OFLAG_GKILL,		"can_globalkill" },
 	{ OFLAG_GNOTICE,	"can_globalnotice" },
+	{ OFLAG_GREHASH,	"can_globalrehash" },
 	{ OFLAG_GROUTE,		"can_globalroute" },
 	{ OFLAG_GLOBOP,         "can_globops" },
 	{ OFLAG_GZL,		"can_gzline"},
diff -uNr Unreal3.2/src/s_serv.c Unreal3.2.tmp/src/s_serv.c
--- Unreal3.2/src/s_serv.c	Wed Dec 29 23:59:03 2010
+++ Unreal3.2.tmp/src/s_serv.c	Thu Dec 30 16:52:03 2010
@@ -628,8 +628,7 @@
 		sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
 		return 0;
 	}
-	if (!MyClient(sptr) && !IsNetAdmin(sptr)
-	    && !IsULine(sptr))
+	if (!MyClient(sptr) && !IsULine(sptr) && !IsGRehash(sptr))
 	{
 		sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
 		return 0;
@@ -692,14 +691,10 @@
 			parv[1] = parv[2];
 			parv[2] = NULL;
 			parc--;
-			/* Only netadmins may use /REHASH -global, which is because:
-			 * a) it makes sense
-			 * b) remote servers don't support remote rehashes by non-netadmins
-			 */
-			if (!IsNetAdmin(sptr))
+
+			if (!IsGRehash(sptr))
 			{
 				sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
-				sendnotice(sptr, "'/REHASH -global' requires you to be NetAdmin");
 				return 0;
 			}
 			if (parv[1] && *parv[1] != '-')
diff -uNr Unreal3.2/src/s_svs.c Unreal3.2.tmp/src/s_svs.c
--- Unreal3.2/src/s_svs.c	Mon May 22 16:01:46 2006
+++ Unreal3.2.tmp/src/s_svs.c	Thu Dec 30 16:50:39 2010
@@ -79,6 +79,7 @@
 	OFLAG_UMODEQ, 'q',
 	OFLAG_DCCDENY, 'd',
 	OFLAG_ADDLINE, 'X',
+	OFLAG_GREHASH, 'e',
 	0, 0
 };
 
diff -uNr Unreal3.2/src/umodes.c Unreal3.2.tmp/src/umodes.c
--- Unreal3.2/src/umodes.c	Wed Dec 29 23:59:03 2010
+++ Unreal3.2.tmp/src/umodes.c	Thu Dec 30 17:00:17 2010
@@ -50,7 +50,7 @@
 Snomask *Snomask_Table = NULL;
 short	 Snomask_highest = 0;
 
-/* cptr->umodes (32 bits): 26 used, 6 free */
+/* cptr->umodes (32 bits): 27 used, 5 free */
 long UMODE_INVISIBLE = 0L;     /* makes user invisible */
 long UMODE_OPER = 0L;          /* Operator */
 long UMODE_WALLOP = 0L;        /* send wallops to them */
@@ -78,6 +78,7 @@
 long UMODE_STRIPBADWORDS = 0L; /* Strip badwords */
 long UMODE_HIDEWHOIS = 0L;     /* Hides channels in /whois */
 long UMODE_NOCTCP = 0L;	       /* Blocks ctcp (except dcc and action) */
+long UMODE_GREHASH = 0L;       /* Allows to rehash all servers on the network */
 
 long SNO_KILLS = 0L;
 long SNO_CLIENT = 0L;
@@ -155,6 +156,7 @@
 	UmodeAdd(NULL, 't', UMODE_GLOBAL, NULL, &UMODE_SETHOST);
 	UmodeAdd(NULL, 'G', UMODE_GLOBAL, NULL, &UMODE_STRIPBADWORDS);
 	UmodeAdd(NULL, 'p', UMODE_GLOBAL, NULL, &UMODE_HIDEWHOIS);
+	UmodeAdd(NULL, 'e', UMODE_GLOBAL, umode_allow_opers, &UMODE_GREHASH);
 	SnomaskAdd(NULL, 'k', umode_allow_all, &SNO_KILLS);
 	SnomaskAdd(NULL, 'c', umode_allow_opers, &SNO_CLIENT);
 	SnomaskAdd(NULL, 'f', umode_allow_opers, &SNO_FLOOD);
diff -uNr -x setup.h Unreal3.2/include/h.h Unreal3.2.tmp/include/h.h
--- Unreal3.2/include/h.h	Wed Dec 29 23:59:03 2010
+++ Unreal3.2.tmp/include/h.h	Thu Dec 30 16:44:45 2010
@@ -446,6 +446,7 @@
 extern MODVAR long UMODE_STRIPBADWORDS; /* 0x80000000	 */
 extern MODVAR long UMODE_HIDEWHOIS; /* hides channels in /whois */
 extern MODVAR long UMODE_NOCTCP;    /* blocks all ctcp (except dcc and action) */
+extern MODVAR long UMODE_GREHASH;	/* allows to rehash all servers on the network */
 extern MODVAR long AllUmodes, SendUmodes;
 
 extern MODVAR long SNO_KILLS;
diff -uNr -x setup.h Unreal3.2/include/struct.h Unreal3.2.tmp/include/struct.h
--- Unreal3.2/include/struct.h	Wed Dec 29 23:59:03 2010
+++ Unreal3.2.tmp/include/struct.h	Thu Dec 30 16:41:27 2010
@@ -394,6 +394,7 @@
 #define	IsInvisible(x)		((x)->umodes & UMODE_INVISIBLE)
 #define IsServices(x)		((x)->umodes & UMODE_SERVICES)
 #define	IsAnOper(x)		((x)->umodes & (UMODE_OPER|UMODE_LOCOP))
+#define IsGRehash(x)	((x)->umodes & UMODE_GREHASH)
 #define IsARegNick(x)		((x)->umodes & (UMODE_REGNICK))
 #define IsRegNick(x)		((x)->umodes & UMODE_REGNICK)
 #define IsRegNickMsg(x)		((x)->umodes & UMODE_RGSTRONLY)
@@ -582,6 +583,7 @@
 #define OFLAG_GNOTICE	0x00008000	/* Oper can send global notices */
 #define OFLAG_ADMIN		0x00010000	/* Admin */
 #define OFLAG_ADDLINE	0x00020000	/* Oper can use /addline */
+#define OFLAG_GREHASH	0x00040000	/* can rehash all servers */
 #define OFLAG_ZLINE		0x00080000	/* Oper can use /zline and /unzline */
 #define OFLAG_NETADMIN	0x00200000	/* netadmin gets +N */
 #define OFLAG_COADMIN	0x00800000	/* co admin gets +C */
@@ -595,7 +597,7 @@
 #define OFLAG_LOCAL	(OFLAG_REHASH|OFLAG_HELPOP|OFLAG_GLOBOP|OFLAG_WALLOP|OFLAG_LOCOP|OFLAG_LROUTE|OFLAG_LKILL|OFLAG_KLINE|OFLAG_UNKLINE|OFLAG_LNOTICE)
 #define OFLAG_GLOBAL	(OFLAG_LOCAL|OFLAG_GROUTE|OFLAG_GKILL|OFLAG_GNOTICE)
 #define OFLAG_ISGLOBAL	(OFLAG_GROUTE|OFLAG_GKILL|OFLAG_GNOTICE|OFLAG_TKL|OFLAG_GZL|OFLAG_OVERRIDE)
-#define OFLAG_NADMIN	(OFLAG_NETADMIN | OFLAG_SADMIN | OFLAG_ADMIN | OFLAG_GLOBAL | OFLAG_UMODEQ | OFLAG_DCCDENY)
+#define OFLAG_NADMIN	(OFLAG_NETADMIN | OFLAG_SADMIN | OFLAG_ADMIN | OFLAG_GLOBAL | OFLAG_UMODEQ | OFLAG_DCCDENY | OFLAG_GREHASH)
 #define OFLAG_ADMIN_	(OFLAG_ADMIN | OFLAG_GLOBAL | OFLAG_DCCDENY)
 #define OFLAG_COADMIN_	(OFLAG_COADMIN | OFLAG_GLOBAL | OFLAG_DCCDENY)
 #define OFLAG_SADMIN_	(OFLAG_SADMIN | OFLAG_GLOBAL | OFLAG_UMODEQ | OFLAG_DCCDENY)
@@ -627,6 +629,7 @@
 #define OPIsNetAdmin(x) ((x)->oflag & OFLAG_NETADMIN)
 #define OPIsCoAdmin(x)	((x)->oflag & OFLAG_COADMIN)
 #define OPIsWhois(x)    ((x)->oflag & OFLAG_WHOIS)
+#define OPCanGRehash(x)	((x)->oflag & OFLAG_GREHASH)
 #ifdef SHOW_SECRET
 #define OPCanSeeSecret(x) IsAnOper(x)
 #else
@@ -654,6 +657,7 @@
 #define OPSSetCoAdmin(x) ((x)->oflag |= OFLAG_COADMIN)
 #define OPSetZLine(x)	((x)->oflag |= OFLAG_ZLINE)
 #define OPSetWhois(x)   ((x)->oflag |= OFLAG_WHOIS)
+#define OPSetGRehash(x)	((x)->oflag |= OFLAG_GREHASH)
 #define OPClearRehash(x)	((x)->oflag &= ~OFLAG_REHASH)
 #define OPClearDie(x)		((x)->oflag &= ~OFLAG_DIE)
 #define OPClearRestart(x)	((x)->oflag &= ~OFLAG_RESTART)
@@ -675,6 +679,7 @@
 #define OPClearCoAdmin(x)	((x)->oflag &= ~OFLAG_COADMIN)
 #define OPClearZLine(x)		((x)->oflag &= ~OFLAG_ZLINE)
 #define OPClearWhois(x)         ((x)->oflag &= ~OFLAG_WHOIS)
+#define OPClearGRehash(x)	((x)->oflag &= ~OFLAG_GREHASH)
 /*
  * defined debugging levels
  */
