diff -ruN ircd-hybrid-6.0/README.superop ircd-hybrid-6.0.superop/README.superop
--- ircd-hybrid-6.0/README.superop	Wed Dec 31 19:00:00 1969
+++ ircd-hybrid-6.0/README.superop	Sat Jul 14 19:58:27 2001
@@ -0,0 +1,20 @@
+
+This is a quick hack to hybrid ircd to give server ops power in channels.
+It's intended for very small sites or networks that are devoted to a very
+small number of channels, where channel maintenance is as important as
+server maintenance.
+
+If there is a reasonable use for this functionality, I could turn this from
+a quick hack to a real patch, maybe make some new flag or something so
+configuration is more flexible.  But I won't know unless you tell me. Please
+let me know if you apply this patch, find it unsuitable, or just to let me
+know you've tried it: james@becnel.net
+
+
+DISCLAIMER: This is a quick hack, so who knows what will happen.  But
+whatever happens, don't blame me!  You're installing the patch, you need to
+understand it.  I will not be held liable for any damages that might arise
+through the use of this patch.
+
+Released under the GPL (GNU General Public License):
+http://www.opensource.org/licenses/gpl-license.html
diff -ruN ircd-hybrid-6.0/include/channel.h ircd-hybrid-6.0.superop/include/channel.h
--- ircd-hybrid-6.0/include/channel.h	Thu Oct  5 23:00:55 2000
+++ ircd-hybrid-6.0.superop/include/channel.h	Sat Jul 14 17:22:57 2001
@@ -203,7 +203,11 @@
 /* channel not shown but names are */
 #define HiddenChannel(x)        ((x) && ((x)->mode.mode & MODE_PRIVATE))
 /* channel visible */
-#define ShowChannel(v,c)        (PubChannel(c) || IsMember((v),(c)))
+#ifdef SOP_SEES_ALL
+  #define ShowChannel(v,c)        (PubChannel(c) || IsMember((v),(c)) || IsAnOper(v))
+#else
+  #define ShowChannel(v,c)        (PubChannel(c) || IsMember((v),(c)))
+#endif
 #define PubChannel(x)           ((!x) || ((x)->mode.mode &\
                                  (MODE_PRIVATE | MODE_SECRET)) == 0)
 
diff -ruN ircd-hybrid-6.0/include/config.h ircd-hybrid-6.0.superop/include/config.h
--- ircd-hybrid-6.0/include/config.h	Sun Nov 26 23:11:47 2000
+++ ircd-hybrid-6.0.superop/include/config.h	Sat Jul 14 21:21:38 2001
@@ -1036,3 +1036,66 @@
 #define CONFIG_H_LEVEL_6
 
 #endif /* INCLUDED_config_h */
+
+/***************** SUPER-OPER CONFIGUATION **************/
+
+/* PLEASE READ SECTION:
+ *
+ * This section is added by a patch, ircd-hybrid-6.0-diff.sop
+ * The patch gives server operators (O:/o: line people) power to
+ * muck around in channels.  The idea is that for small networks,
+ * where the server is setup primarily for just a few channels,
+ * the server ops are just as interested in keeping these few channels
+ * running as smoothly as the servers.
+ * 
+ * DO NOT USE THIS ON AN IMPORTANT NETWORK!  Once your users find out
+ * your opers can clean channels as easily as chanops, the ops will
+ * be bothered constantly for each and every minor channel mishap.
+ *
+ */
+
+/* Allow Server OPs to set any channel's modes, 
+ * regarless of wheter they have ops or not */
+#undef SOP_SETS_MODES
+
+/* Allow Server OPs to chan_op themselves. Not
+ * really necessary given the above option, but
+ * for those who like pretty @ symbols .... */
+#undef SOP_OPS_SELF
+
+/* Make Server OPs immune to channel bans.
+ * They can join channels even where there is a
+ * +b mode against them. */
+#undef SOP_NEVER_BANNED
+
+/* Allow Server OPs to join +i channels, even
+ * when they are not /invited */
+#undef SOP_ALWAYS_IN
+
+/* Allow Server OPs to join channels, even when
+ * the channel is at it's limit (+l) */
+#undef SOP_NO_LIMITS
+
+/* Allow Server OPs to join channels, even when
+ * the channel needs a key to join (+k) */
+#undef SOP_GOT_KEYS
+
+/* Allow Server OPs to speak on channels, even when
+ * moderated (+m) and the oper has no voice (+v/+o) */
+#undef SOP_ALWAYS_VOICE
+
+/* Allow Server OPs to kick from any channel,
+ * even when they don't have channel ops. */
+#undef SOP_KICK_ALL
+
+/* Make Server OPs immune to kicks. Anyone
+ * trying to kick a server op will get a 
+ * ERR_USERNOTINCHANNEL */
+#undef SOP_NOT_KICKED
+
+/* Allow Server OPs to see all channels on server, 
+ * even secret, non-public ones */
+#undef SOP_SEES_ALL
+
+/*************** END SUPER-OPER CONFIGUATION ************/
+
diff -ruN ircd-hybrid-6.0/src/channel.c ircd-hybrid-6.0.superop/src/channel.c
--- ircd-hybrid-6.0/src/channel.c	Sun Nov 26 23:11:49 2000
+++ ircd-hybrid-6.0.superop/src/channel.c	Sat Jul 14 20:47:23 2001
@@ -740,7 +740,7 @@
 int     is_chan_op(struct Client *cptr, struct Channel *chptr)
 {
   Link  *lp;
-
+   
   if (chptr)
     if ((lp = find_user_link(chptr->members, cptr)))
       return (lp->flags & CHFL_CHANOP);
@@ -1186,15 +1186,20 @@
   user_mode = user_channel_mode(sptr, chptr);
   chan_op = (user_mode & CHFL_CHANOP);
 
+#ifdef SOP_SETS_MODES
+  /* has ops or is a server or is a server operator*/
+  ischop = IsServer(sptr) || chan_op || IsAnOper(sptr);
+#else
   /* has ops or is a server */
   ischop = IsServer(sptr) || chan_op;
-
+#endif
+   
   /* is client marked as deopped */
   isdeop = !ischop && !IsServer(sptr) && (user_mode & CHFL_DEOPPED);
 
   /* is an op or server or remote user on a TS channel */
   isok = ischop || (!isdeop && IsServer(cptr) && chptr->channelts);
-
+   
   if(isok)
     chptr->keep_their_modes = YES;
 
@@ -1310,7 +1315,11 @@
           if ((who == sptr) && (c == 'o'))
             {
               if(whatt == MODE_ADD)
+#ifdef SOP_OPS_SELF
+                if (!IsAnOper(sptr)) break;
+#else
                 break;
+#endif
               
               if(whatt == MODE_DEL)
                 self_lose_ops = 1;
@@ -2334,12 +2343,20 @@
     }
 #endif
 
+#ifdef SOP_NEVER_BANNED
+  if ( (ban_or_exception = is_banned(sptr, chptr)) == CHFL_BAN && !IsAnOper(sptr))
+#else
   if ( (ban_or_exception = is_banned(sptr, chptr)) == CHFL_BAN)
+#endif
     return (ERR_BANNEDFROMCHAN);
   else
     *flags |= ban_or_exception; /* Mark this client as "charmed" */
 
+#ifdef SOP_ALWAYS_IN
+  if (chptr->mode.mode & MODE_INVITEONLY && !IsAnOper(sptr) )
+#else
   if (chptr->mode.mode & MODE_INVITEONLY)
+#endif
     {
       for (lp = sptr->user->invited; lp; lp = lp->next)
         if (lp->value.chptr == chptr)
@@ -2349,9 +2366,17 @@
     }
 
   if (*chptr->mode.key && (BadPtr(key) || irccmp(chptr->mode.key, key)))
+#ifdef SOP_GOT_KEYS
+    if (!IsAnOper(sptr)) return (ERR_BADCHANNELKEY);
+#else
     return (ERR_BADCHANNELKEY);
+#endif
 
+#ifdef SOP_NO_LIMITS
+  if (chptr->mode.limit && chptr->users >= chptr->mode.limit && !IsAnOper(sptr) )
+#else
   if (chptr->mode.limit && chptr->users >= chptr->mode.limit)
+#endif
     return (ERR_CHANNELISFULL);
 
   return 0;
@@ -3526,7 +3551,11 @@
    *    -Dianora
    */
 
+#ifdef SOP_KICK_ALL
+  if (!IsServer(sptr) && !is_chan_op(sptr, chptr) && !IsAnOper(sptr)) 
+#else
   if (!IsServer(sptr) && !is_chan_op(sptr, chptr) ) 
+#endif
     { 
       /* was a user, not a server, and user isn't seen as a chanop here */
       
@@ -3594,7 +3623,11 @@
       return(0);
     }
 
+#ifdef SOP_NOT_KICKED
+  if (IsMember(who, chptr) && !IsAnOper(who))
+#else
   if (IsMember(who, chptr))
+#endif
     {
 #ifdef HIDE_OPS
       sendto_channel_chanops_butserv(chptr, sptr,
diff -ruN ircd-hybrid-6.0/src/m_list.c ircd-hybrid-6.0.superop/src/m_list.c
--- ircd-hybrid-6.0/src/m_list.c	Tue Nov 21 01:49:30 2000
+++ ircd-hybrid-6.0.superop/src/m_list.c	Sat Jul 14 17:35:18 2001
@@ -78,8 +78,13 @@
         for (j=0, chptr=(struct Channel*)(hash_get_channel_block(i).list);
              (chptr) && (j<hash_get_channel_block(i).links); chptr=chptr->hnextch, j++) {
           if (j<progress2) continue;  /* wind up to listprogress2 */
-          if (!sptr->user ||
+#ifdef SOP_SEES_ALL
+	   if (!sptr->user ||
+              (SecretChannel(chptr) && !IsMember(sptr, chptr) && !IsAnOper(sptr)))
+#else
+	   if (!sptr->user ||
               (SecretChannel(chptr) && !IsMember(sptr, chptr)))
+#endif
             continue;
           sendto_one(sptr, form_str(RPL_LIST), me.name, parv[0],
                      ShowChannel(sptr, chptr)?chptr->chname:"*",
@@ -115,8 +120,13 @@
       for (i=0; i<CH_MAX; i++) {
         for (j=0, chptr = (struct Channel*)(hash_get_channel_block(i).list);
              (chptr) && (j<hash_get_channel_block(i).links); chptr = chptr->hnextch, j++) {
+#ifdef SOP_SEES_ALL
+          if (!sptr->user ||
+              (SecretChannel(chptr) && !IsMember(sptr, chptr) && !IsAnOper(sptr)))
+#else
           if (!sptr->user ||
               (SecretChannel(chptr) && !IsMember(sptr, chptr)))
+#endif
             continue;
           /* EVIL!  sendto_one doesnt return status of any kind!  Forcing us
              to make up yet another stupid client flag (we could just
diff -ruN ircd-hybrid-6.0/src/m_message.c ircd-hybrid-6.0.superop/src/m_message.c
--- ircd-hybrid-6.0/src/m_message.c	Sun Sep 10 04:42:49 2000
+++ ircd-hybrid-6.0.superop/src/m_message.c	Sat Jul 14 21:07:35 2001
@@ -183,7 +183,11 @@
             check_for_flud(sptr, NULL, chptr, 1);
 #endif /* FLUD */
 
+#ifdef SOP_ALWAYS_VOICE
+      if (can_send(sptr, chptr) == 0 || IsAnOper(sptr))
+#else
       if (can_send(sptr, chptr) == 0)
+#endif
         sendto_channel_butone(cptr, sptr, chptr,
                               ":%s %s %s :%s",
                               parv[0], cmd, nick,
