diff -uNr -x *.o -x *.so -x version.c -x include Unreal3.2.terror/src/modules/m_svso.c Unreal3.2/src/modules/m_svso.c
--- Unreal3.2.terror/src/modules/m_svso.c	Mon Jan 22 13:25:40 2007
+++ Unreal3.2/src/modules/m_svso.c	Fri Dec 31 06:53:46 2010
@@ -85,6 +85,7 @@
 	OFLAG_UMODEQ, 'q',
 	OFLAG_DCCDENY, 'd',
 	OFLAG_ADDLINE, 'X',
+	OFLAG_GREHASH, 'e',
         0, 0
 };
 
diff -uNr -x *.o -x *.so -x version.c -x include Unreal3.2.terror/src/s_conf.c Unreal3.2/src/s_conf.c
--- Unreal3.2.terror/src/s_conf.c	Wed Dec 29 23:59:03 2010
+++ Unreal3.2/src/s_conf.c	Fri Dec 31 06:54:44 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 -x *.o -x *.so -x version.c -x include Unreal3.2.terror/src/s_svs.c Unreal3.2/src/s_svs.c
--- Unreal3.2.terror/src/s_svs.c	Mon May 22 16:01:46 2006
+++ Unreal3.2/src/s_svs.c	Fri Dec 31 06:56:06 2010
@@ -79,6 +79,7 @@
 	OFLAG_UMODEQ, 'q',
 	OFLAG_DCCDENY, 'd',
 	OFLAG_ADDLINE, 'X',
+	OFLAG_GREHASH, 'e',
 	0, 0
 };
 
diff -uNr Unreal3.2.terror/include/struct.h Unreal3.2/include/struct.h
--- Unreal3.2.terror/include/struct.h	Wed Dec 29 23:59:03 2010
+++ Unreal3.2/include/struct.h	Fri Dec 31 06:59:41 2010
@@ -582,6 +582,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	/* Oper 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 +596,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)
@@ -622,6 +623,7 @@
 #define OPCanUnKline(x)	((x)->oflag & OFLAG_UNKLINE)
 #define OPCanLNotice(x)	((x)->oflag & OFLAG_LNOTICE)
 #define OPCanGNotice(x)	((x)->oflag & OFLAG_GNOTICE)
+#define OPCanGRehash(x)	((x)->oflag & OFLAG_GREHASH)
 #define OPIsAdmin(x)	((x)->oflag & OFLAG_ADMIN)
 #define OPIsSAdmin(x)	((x)->oflag & OFLAG_SADMIN)
 #define OPIsNetAdmin(x) ((x)->oflag & OFLAG_NETADMIN)
@@ -648,6 +650,7 @@
 #define OPSetUnKline(x)	((x)->oflag |= OFLAG_UNKLINE)
 #define OPSetLNotice(x)	((x)->oflag |= OFLAG_LNOTICE)
 #define OPSetGNotice(x)	((x)->oflag |= OFLAG_GNOTICE)
+#define OPSetGRehash(x)	((x)->oflag |= OFLAG_GREHASH)
 #define OPSSetAdmin(x)	((x)->oflag |= OFLAG_ADMIN)
 #define OPSSetSAdmin(x)	((x)->oflag |= OFLAG_SADMIN)
 #define OPSSetNetAdmin(x) ((x)->oflag |= OFLAG_NETADMIN)
@@ -669,6 +672,7 @@
 #define OPClearUnKline(x)	((x)->oflag &= ~OFLAG_UNKLINE)
 #define OPClearLNotice(x)	((x)->oflag &= ~OFLAG_LNOTICE)
 #define OPClearGNotice(x)	((x)->oflag &= ~OFLAG_GNOTICE)
+#define OPClearGRehash(x)	((x)->oflag &= ~OFLAG_GREHASH)
 #define OPClearAdmin(x)		((x)->oflag &= ~OFLAG_ADMIN)
 #define OPClearSAdmin(x)	((x)->oflag &= ~OFLAG_SADMIN)
 #define OPClearNetAdmin(x)	((x)->oflag &= ~OFLAG_NETADMIN)
--- Unreal3.2.old/src/s_serv.c	Wed Dec 29 23:59:03 2010
+++ Unreal3.2/src/s_serv.c	Fri Dec 31 11:37:58 2010
@@ -628,12 +628,13 @@
 		sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
 		return 0;
 	}
-	if (!MyClient(sptr) && !IsNetAdmin(sptr)
-	    && !IsULine(sptr))
-	{
-		sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
-		return 0;
-	}
+
+	/* Blindly trust incoming rehashes, they're required to do access
+	 * checking on their part. A good reason why you shouldn't mix
+	 * 3.2.9 with earlier versions, unless you don't mind other people
+	 * rehashing your server.
+	 */
+
 	x = 0;
 
 	if ((parc < 3) || BadPtr(parv[2])) {
@@ -642,13 +643,27 @@
 		 */
 		if (parv[1] && (parv[1][0] == '-'))
 			x = HUNTED_ISME;
-		else
+		else {
+			 /* This breaks /rehashing the same server as you're on, only /rehash
+			  * without any argument allows now to rehash the local server.
+			  * Everything else (except arguments) will be treated as remote rehash.
+			  */
+			if(MyClient(sptr) && !OPCanGRehash(sptr) && (parc == 2)) {
+				sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
+				return 0;
+			}
 			x = hunt_server_token(cptr, sptr, MSG_REHASH, TOK_REHASH, "%s", 1, parc, parv);
+		}
 	} else {
 		if (!_match("-glob*", parv[1])) /* This is really ugly... hack to make /rehash -global -something work */
 			x = HUNTED_ISME;
-		else
+		else {
+			if(MyClient(sptr) && !OPCanGRehash(sptr)) {
+				sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
+				return 0;
+			}
 			x = hunt_server_token(cptr, sptr, MSG_REHASH, TOK_REHASH, "%s %s", 1, parc, parv);
+		}
 	}
 	if (x != HUNTED_ISME)
 		return 0; /* Now forwarded or server didnt exist */
@@ -692,14 +707,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 (MyClient(sptr) && !OPCanGRehash(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] != '-')
