diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/include/config.h ircd-hybrid-6.0/include/config.h
--- ircd-hybrid-6.0.orig/include/config.h	Fri Jun 15 19:17:46 2001
+++ ircd-hybrid-6.0/include/config.h	Fri Jun 15 17:51:58 2001
@@ -411,10 +411,10 @@
 #define B_LINES_OPER_ONLY
 #define E_LINES_OPER_ONLY
 #define F_LINES_OPER_ONLY
-#undef  I_LINES_OPER_ONLY
-#undef  K_LINES_OPER_ONLY
-#undef  O_LINES_OPER_ONLY
-#undef  P_LINES_OPER_ONLY
+#define I_LINES_OPER_ONLY
+#define K_LINES_OPER_ONLY
+#define O_LINES_OPER_ONLY
+#define P_LINES_OPER_ONLY
 
 /* SPOOF_FREEFORM
  * Allow custom spoofed I lines.
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/m_oper.c ircd-hybrid-6.0/src/m_oper.c
--- ircd-hybrid-6.0.orig/src/m_oper.c	Fri Jun 15 19:17:45 2001
+++ ircd-hybrid-6.0/src/m_oper.c	Fri Jun 15 17:51:57 2001
@@ -238,6 +238,8 @@
       {
 	umode_t privs;
 	AndNotUmodes(privs, sptr->allowed_umodes, user_umodes);
+	ClearBit(privs, UMODE_OPER);
+	ClearBit(privs, UMODE_LOCOP);
 	sendto_one(sptr, ":%s NOTICE %s :*** Oper privs are %s",me.name,parv[0],
 		   oper_flags_as_string(privs));
       }
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/m_stats.c ircd-hybrid-6.0/src/m_stats.c
--- ircd-hybrid-6.0.orig/src/m_stats.c	Fri Jun 15 19:17:45 2001
+++ ircd-hybrid-6.0/src/m_stats.c	Fri Jun 15 17:51:57 2001
@@ -396,6 +396,12 @@
       break;
 
     case 'p' :
+      if (!CanSeeOlines(sptr))
+        {
+          ignore_request++;
+          valid_stats++;
+          break;
+        }
       show_opers(sptr);
       valid_stats++;
       break;
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/s_user.c ircd-hybrid-6.0/src/s_user.c
--- ircd-hybrid-6.0.orig/src/s_user.c	Fri Jun 15 19:17:46 2001
+++ ircd-hybrid-6.0/src/s_user.c	Fri Jun 15 19:15:20 2001
@@ -2033,38 +2033,41 @@
 			  what = MODE_DEL;
 			  break;
 			default:
-			  if (CanGrantModes(sptr))
-			    {
-			      if ((what == MODE_ADD)
-				  && TestBit(sptr->allowed_umodes, user_modes_from_c_to_bitmask[(unsigned char)*m]))
-				{
-				  *(m2++) = *m; /* remove the umodes the originators's O:line doesn't allow them to have */
-				  /* But add them to the target's allowed umodes */
-				  SetBit(acptr->allowed_umodes, user_modes_from_c_to_bitmask[(unsigned char)*m]);
-				}
-			      else if ((what == MODE_DEL) && !IsAnOper(acptr))
-				{
-				  /* If they are not an operator, remove that umode from their allowed_umodes 
-				   *  if it is not in user_umodes
-				   */
-				  if (!TestBit(user_umodes, user_modes_from_c_to_bitmask[(unsigned char)*m]))
-				    ClearBit(acptr->allowed_umodes, user_modes_from_c_to_bitmask[(unsigned char)*m]);
-				}
-			    }
-			  else
-			    {
-			      if ((what == MODE_ADD) &&
-				  TestBit(acptr->allowed_umodes, user_modes_from_c_to_bitmask[(unsigned char)*m]))
-				*(m2++) = *m; /* remove the umodes the target's O:line doesn't allow them to have */
-			      else if ((what == MODE_DEL) && !IsAnOper(acptr))
-				{
-				  /* If they are not an operator, remove that umode from their allowed_umodes 
-				   *  if it is not in user_umodes
-				   */
-				  if (!TestBit(user_umodes, user_modes_from_c_to_bitmask[(unsigned char)*m]))
-				    ClearBit(acptr->allowed_umodes, user_modes_from_c_to_bitmask[(unsigned char)*m]);
-				}
-			    }
+			  {
+			    int mode = user_modes_from_c_to_bitmask[(unsigned char)*m];
+			    if (CanGrantModes(sptr))
+			      {
+				if ((what == MODE_ADD) && (mode != UMODE_GRANT) /* You may not grant the ability to grant */
+				    && TestBit(sptr->allowed_umodes, mode))
+				  {
+				    *(m2++) = *m; /* remove the umodes the originators's O:line doesn't allow them to have */
+				    /* But add them to the target's allowed umodes */
+				    SetBit(acptr->allowed_umodes, mode);
+				  }
+				else if ((what == MODE_DEL) && !IsAnOper(acptr))
+				  {
+				    /* If they are not an operator, remove that umode from their allowed_umodes 
+				     *  if it is not in user_umodes
+				     */
+				    if (!TestBit(user_umodes, mode))
+				      ClearBit(acptr->allowed_umodes, mode);
+				  }
+			      }
+			    else
+			      {
+				if ((what == MODE_ADD) &&
+				    TestBit(acptr->allowed_umodes, mode))
+				  *(m2++) = *m; /* remove the umodes the target's O:line doesn't allow them to have */
+				else if ((what == MODE_DEL) && !IsAnOper(acptr))
+				  {
+				    /* If they are not an operator, remove that umode from their allowed_umodes 
+				     *  if it is not in user_umodes
+				     */
+				    if (!TestBit(user_umodes, mode))
+				      ClearBit(acptr->allowed_umodes, mode);
+				  }
+			      }
+			  }
 			  break;
 			}
 		    *m2 = 0;
