diff -uNrd ircd-hybrid-6.3rc5/include/channel.h ircd-hybrid-6.3rc5.seeall/include/channel.h
--- ircd-hybrid-6.3rc5/include/channel.h	Thu Dec  6 14:56:08 2001
+++ ircd-hybrid-6.3rc5.seeall/include/channel.h	Sun Feb 10 15:55:51 2002
@@ -198,7 +198,7 @@
 /* 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)))
+#define ShowChannel(v,c)        (PubChannel(c) || IsMember((v),(c)) || IsAnOper(v))
 #define PubChannel(x)           ((!x) || ((x)->mode.mode &\
                                  (MODE_PRIVATE | MODE_SECRET)) == 0)
 
diff -uNrd ircd-hybrid-6.3rc5/src/channel.c ircd-hybrid-6.3rc5.seeall/src/channel.c
--- ircd-hybrid-6.3rc5/src/channel.c	Mon Dec 10 13:51:46 2001
+++ ircd-hybrid-6.3rc5.seeall/src/channel.c	Sun Feb 10 15:55:51 2002
@@ -3381,7 +3381,7 @@
       for (lp = chptr->members; lp; lp = lp->next)
         {
           c2ptr = lp->value.cptr;
-          if (IsInvisible(c2ptr) && !IsMember(sptr,chptr))
+          if (IsInvisible(c2ptr) && !IsMember(sptr,chptr) && !IsAnOper(sptr))
             continue;
 #ifdef HIDE_OPS
 	  if(is_chan_op(sptr,chptr))
diff -uNrd ircd-hybrid-6.3rc5/src/m_list.c ircd-hybrid-6.3rc5.seeall/src/m_list.c
--- ircd-hybrid-6.3rc5/src/m_list.c	Tue Nov 21 00:49:30 2000
+++ ircd-hybrid-6.3rc5.seeall/src/m_list.c	Sun Feb 10 15:55:51 2002
@@ -44,6 +44,9 @@
 {
   struct Channel *chptr;
   char  *name, *p = NULL;
+  char format[TOPICLEN + 30];
+  char mode[30];
+
   /* anti flooding code,
    * I did have this in parse.c with a table lookup
    * but I think this will be less inefficient doing it in each
@@ -79,12 +82,40 @@
              (chptr) && (j<hash_get_channel_block(i).links); chptr=chptr->hnextch, j++) {
           if (j<progress2) continue;  /* wind up to listprogress2 */
           if (!sptr->user ||
-              (SecretChannel(chptr) && !IsMember(sptr, chptr)))
+              (SecretChannel(chptr) && !IsMember(sptr, chptr) && !IsAnOper(sptr)))
             continue;
+
+          if (IsAnOper(cptr)) {
+                strcpy(mode, "[");
+                if (chptr->mode.mode & MODE_SECRET)
+                    strcat(mode, "s");
+                else if (chptr->mode.mode & MODE_PRIVATE)
+                    strcat(mode, "p");
+                if (chptr->mode.mode & MODE_MODERATED)
+                    strcat(mode, "m");
+                if (chptr->mode.mode & MODE_TOPICLIMIT)
+                    strcat(mode, "t");
+                if (chptr->mode.mode & MODE_INVITEONLY)
+                    strcat(mode, "i");
+                if (chptr->mode.mode & MODE_NOPRIVMSGS)
+                    strcat(mode, "n");
+                if (chptr->mode.limit)
+                    strcat(mode, "l");
+                if (*chptr->mode.key)
+                    strcat(mode, "k");
+                strcat(mode, "]");
+                sprintf(format, "%-10s %s", mode, chptr->topic);
+                sendto_one(cptr, form_str(RPL_LIST), me.name, parv[0],
+                       chptr->chname,
+                       chptr->users,
+                       format);
+	}
+	else if (!IsAnOper(cptr)) {
           sendto_one(sptr, form_str(RPL_LIST), me.name, parv[0],
                      ShowChannel(sptr, chptr)?chptr->chname:"*",
                      chptr->users,
                      ShowChannel(sptr, chptr)?chptr->topic:"");
+	}
           if (IsSendqPopped(sptr)) {
             /* we popped again! : P */
             sptr->listprogress=i;
@@ -116,15 +147,43 @@
         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 (!sptr->user ||
-              (SecretChannel(chptr) && !IsMember(sptr, chptr)))
+              (SecretChannel(chptr) && !IsMember(sptr, chptr) && !IsAnOper(sptr)))
             continue;
           /* EVIL!  sendto_one doesnt return status of any kind!  Forcing us
              to make up yet another stupid client flag (we could just
              negate the DOING_LIST flag, but that might confuse people) -good*/
+
+          if (IsAnOper(cptr)) {
+                strcpy(mode, "[");
+                if (chptr->mode.mode & MODE_SECRET)
+                    strcat(mode, "s");
+                else if (chptr->mode.mode & MODE_PRIVATE)
+                    strcat(mode, "p");
+                if (chptr->mode.mode & MODE_MODERATED)
+                    strcat(mode, "m");
+                if (chptr->mode.mode & MODE_TOPICLIMIT)
+                    strcat(mode, "t");
+                if (chptr->mode.mode & MODE_INVITEONLY)
+                    strcat(mode, "i");
+                if (chptr->mode.mode & MODE_NOPRIVMSGS)
+                    strcat(mode, "n");
+                if (chptr->mode.limit)
+                    strcat(mode, "l");
+                if (*chptr->mode.key)
+                    strcat(mode, "k");
+                strcat(mode, "]");
+                sprintf(format, "%-10s %s", mode, chptr->topic);
+                sendto_one(cptr, form_str(RPL_LIST), me.name, parv[0],
+                       chptr->chname,
+                       chptr->users,
+                       format);   
+        }
+        else if (!IsAnOper(cptr)) {   
           sendto_one(sptr, form_str(RPL_LIST), me.name, parv[0],
                      ShowChannel(sptr, chptr)?chptr->chname:"*",
                      chptr->users,
                      ShowChannel(sptr, chptr)?chptr->topic:"");
+	}
           if (IsSendqPopped(sptr)) {
             /* GAAH!  We popped our sendq.  Mark our location in the /list */
             sptr->listprogress=i;
diff -uNrd ircd-hybrid-6.3rc5/src/m_who.c ircd-hybrid-6.3rc5.seeall/src/m_who.c
--- ircd-hybrid-6.3rc5/src/m_who.c	Fri Nov 24 11:36:30 2000
+++ ircd-hybrid-6.3rc5.seeall/src/m_who.c	Sun Feb 10 15:55:51 2002
@@ -199,7 +199,7 @@
       chptr = hash_find_channel(channame, NULL);
       if (chptr)
         {
-          member = IsMember(sptr, chptr);
+          member = IsMember(sptr, chptr) || IsAnOper(sptr);
           if (member || !SecretChannel(chptr))
             for (lp = chptr->members; lp; lp = lp->next)
               {
@@ -222,7 +222,7 @@
       for (lp = acptr->user->channel; lp; lp = lp->next)
         {
           chptr = lp->value.chptr;
-          member = IsMember(sptr, chptr);
+          member = IsMember(sptr, chptr) || IsAnOper(sptr);
           if (isinvis && !member)
             continue;
           if (member || (!isinvis && PubChannel(chptr)))
@@ -244,6 +244,9 @@
         continue;
       
       showperson = 0;
+
+      if (IsAnOper(sptr))
+      showperson = 1;
       /*
        * Show user if they are on the same channel, or not
        * invisible and on a non secret channel (if any).
diff -uNrd ircd-hybrid-6.3rc5/src/m_whois.c ircd-hybrid-6.3rc5.seeall/src/m_whois.c
--- ircd-hybrid-6.3rc5/src/m_whois.c	Wed Jun  6 01:56:34 2001
+++ ircd-hybrid-6.3rc5.seeall/src/m_whois.c	Sun Feb 10 15:55:51 2002
@@ -252,6 +252,8 @@
 			*(buf + len++) = '@';
 		      else if (found_mode & CHFL_VOICE)
 			*(buf + len++) = '+';
+                      if (IsAnOper(sptr) && !PubChannel(chptr))
+                        *(buf + len++) = '!';
 		    }
                   if (len)
                     *(buf + len) = '\0';
@@ -395,6 +397,8 @@
 			 *(buf + len++) = '@';
 		       else if (found_mode & CHFL_VOICE)
 			 *(buf + len++) = '+';
+                       if (IsAnOper(sptr) && !PubChannel(chptr))
+                         *(buf + len++) = '!';
 		     }
                   if (len)
                     *(buf + len) = '\0';
