diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/include/channel.h ircd-hybrid-6.0/include/channel.h
--- ircd-hybrid-6.0.orig/include/channel.h	Sun May 27 18:53:39 2001
+++ ircd-hybrid-6.0/include/channel.h	Sun May 27 18:52:59 2001
@@ -205,7 +205,8 @@
 /* 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)        ((c)->users && \
+				 (SeesAllConnections(v) || PubChannel(c) || IsMember((v),(c))))
 #define PubChannel(x)           ((!x) || ((x)->mode.mode &\
                                  (MODE_PRIVATE | MODE_SECRET)) == 0)
 
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/include/client.h ircd-hybrid-6.0/include/client.h
--- ircd-hybrid-6.0.orig/include/client.h	Sun May 27 18:53:41 2001
+++ ircd-hybrid-6.0/include/client.h	Sun May 27 18:52:59 2001
@@ -337,6 +337,8 @@
 #define FLAGS_OPER         0x4000 /* Operator */
 #define FLAGS_LOCOP        0x8000 /* Local operator -- SRB */
 
+#define FLAGS_AUSPEX       0x10000 /* See the invisible. */
+
 #define FLAGS_GOD          0x400000 /* greater deity */
 /* *sigh* overflow flags */
 #define FLAGS2_RESTRICTED   0x0001      /* restricted client */
@@ -356,6 +358,8 @@
 #define FLAGS2_OPER_DIE         0x0800  /* oper can die */
 #define FLAGS2_OPER_REHASH      0x1000  /* oper can rehash */
 #define FLAGS2_OPER_IMMUNE	0x2000	/* oper can umode m */
+#define FLAGS2_OPER_AUSPEX	0x800000 /* oper can see the invisible */
+					 /* Careful of the numbering if you add another flag... */
 #define FLAGS2_OPER_GOD         0x4000000 /* oper can have an apotheosis */
 #define FLAGS2_OPER_FLAGS       (FLAGS2_OPER_GLOBAL_KILL | \
                                  FLAGS2_OPER_GOD | \
@@ -366,7 +370,8 @@
                                  FLAGS2_OPER_K | \
                                  FLAGS2_OPER_DIE | \
                                  FLAGS2_OPER_REHASH | \
-                                 FLAGS2_OPER_IMMUNE)
+                                 FLAGS2_OPER_IMMUNE | \
+                                 FLAGS2_OPER_AUSPEX)
 /* ZIP_LINKS */
 
 #define FLAGS2_ZIP           0x4000  /* (server) link is zipped */
@@ -390,7 +395,7 @@
                       FLAGS_REJ | FLAGS_SKILL | FLAGS_FULL | FLAGS_SPY | \
                       FLAGS_NCHANGE | FLAGS_OPERWALL | FLAGS_DEBUG | \
                       FLAGS_BOTS | FLAGS_EXTERNAL | FLAGS_LOCOP | \
-                      FLAGS_GOD | FLAGS_IMMUNE)
+                      FLAGS_GOD | FLAGS_IMMUNE | FLAGS_AUSPEX)
 
 #ifndef OPER_UMODES
 #define OPER_UMODES  (FLAGS_OPER | FLAGS_WALLOP | FLAGS_SERVNOTICE | \
@@ -450,6 +455,7 @@
 #define SendNickChange(x)       ((x)->umodes & FLAGS_NCHANGE)
 #define SetWallops(x)           ((x)->umodes |= FLAGS_WALLOP)
 #define IsImmune(x)             ((x)->umodes & FLAGS_IMMUNE)
+#define SeesAllConnections(x)	((x)->umodes & FLAGS_AUSPEX)
 
 
 #ifdef REJECT_HOLD
@@ -518,6 +524,8 @@
 #define IsOperRehash(x)         ((x)->flags2 & FLAGS2_OPER_REHASH)
 #define IsSetOperM(x)           ((x)->flags2 & FLAGS2_OPER_IMMUNE)
 #define SetOperM(x)             ((x)->flags2 |= FLAGS2_OPER_IMMUNE)
+#define IsSetOperAuspex(x)	((x)->flags2 & FLAGS2_OPER_AUSPEX)
+#define SetOperAuspex(x)	((x)->flags2 |= FLAGS2_OPER_AUSPEX)
 #define CBurst(x)               ((x)->flags2 & FLAGS2_CBURST)
 
 /*
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/include/s_conf.h ircd-hybrid-6.0/include/s_conf.h
--- ircd-hybrid-6.0.orig/include/s_conf.h	Sun May 27 18:53:41 2001
+++ ircd-hybrid-6.0/include/s_conf.h	Sun May 27 18:52:59 2001
@@ -328,6 +328,7 @@
 #define CONF_OPER_REHASH     64
 #define CONF_OPER_DIE       128
 #define CONF_OPER_M         256
+#define CONF_OPER_AUSPEX    512
 #define CONF_OPER_GOD      2048
 
 typedef struct
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/channel.c ircd-hybrid-6.0/src/channel.c
--- ircd-hybrid-6.0.orig/src/channel.c	Sun May 27 18:53:41 2001
+++ ircd-hybrid-6.0/src/channel.c	Sun May 27 18:52:59 2001
@@ -4187,7 +4187,7 @@
       for (lp = chptr->members; lp; lp = lp->next)
         {
           c2ptr = lp->value.cptr;
-          if (IsInvisible(c2ptr) && !IsMember(sptr,chptr))
+          if (IsInvisible(c2ptr) && !SeesAllConnections(sptr) && !IsMember(sptr,chptr))
             continue;
 #ifdef HIDE_OPS
 	  if(is_chan_op(sptr,chptr))
@@ -4235,6 +4235,9 @@
     }
 
   /* Second, do all non-public, non-secret channels in one big sweep */
+  /* This block is for showing users who aren't in a channel or aren't
+  ** in any channel sptr can see.
+  */
 
   strncpy_irc(buf, "* * :", 6);
   idx = 5;
@@ -4255,9 +4258,9 @@
       while (lp)
         {
           ch3ptr = lp->value.chptr;
-          if (PubChannel(ch3ptr) || IsMember(sptr, ch3ptr))
+          if (PubChannel(ch3ptr) || SeesAllConnections(sptr) || IsMember(sptr, ch3ptr))
             showflag = 1;
-          if (SecretChannel(ch3ptr))
+          if (SecretChannel(ch3ptr) && !SeesAllConnections(sptr))
             secret = 1;
           lp = lp->next;
         }
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/m_list.c ircd-hybrid-6.0/src/m_list.c
--- ircd-hybrid-6.0.orig/src/m_list.c	Sun May 27 18:53:40 2001
+++ ircd-hybrid-6.0/src/m_list.c	Sun May 27 18:52:59 2001
@@ -53,7 +53,7 @@
    */
   static time_t last_used=0L;
   int i,j,minusers;
-  minusers = IsOper(sptr) ? 1 : 4;
+  minusers = SeesAllConnections(sptr) ? 1 : 4;
 
   /* throw away non local list requests that do get here -Dianora */
   if(!MyConnect(sptr))
@@ -80,7 +80,7 @@
              (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) && !SeesAllConnections(sptr) && !IsMember(sptr, chptr)))
             continue;
           if (chptr->users < minusers) continue;
           sendto_one(sptr, form_str(RPL_LIST), me.name, parv[0],
@@ -118,7 +118,7 @@
         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) && !SeesAllConnections(sptr) && !IsMember(sptr, chptr)))
             continue;
           if (chptr->users < minusers) continue;
           /* EVIL!  sendto_one doesnt return status of any kind!  Forcing us
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	Sun May 27 18:53:41 2001
+++ ircd-hybrid-6.0/src/m_oper.c	Sun May 27 18:52:59 2001
@@ -204,6 +204,8 @@
                 sptr->umodes &= ~FLAGS_GOD;
               if( !IsSetOperM(sptr) )
                 sptr->umodes &= ~FLAGS_IMMUNE;
+              if( !IsSetOperAuspex(sptr) )
+                sptr->umodes &= ~FLAGS_AUSPEX;
               
               sendto_one(sptr, ":%s NOTICE %s :*** Oper flags set from conf",
                          me.name,parv[0]);
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/m_who.c ircd-hybrid-6.0/src/m_who.c
--- ircd-hybrid-6.0.orig/src/m_who.c	Fri Nov 24 17:36:30 2000
+++ ircd-hybrid-6.0/src/m_who.c	Sun May 27 18:52:59 2001
@@ -171,12 +171,22 @@
   **  and get people on channel 12 ;) --msa
   */
   if (mask)
-    (void)collapse(mask);
+    {
+      if (!strcmp(mask, "**"))
+        mask = NULL;
+      else if (*mask == (char) 0)
+        mask = NULL;
+      else
+        (void)collapse(mask);
+    }
   if (!mask || (*mask == (char) 0))
     {
-      sendto_one(sptr, form_str(RPL_ENDOFWHO), me.name, parv[0],
-                 EmptyString(mask) ?  "*" : mask);
-      return 0;
+      if (!SeesAllConnections(sptr))
+        {
+          sendto_one(sptr, form_str(RPL_ENDOFWHO), me.name, parv[0],
+                     EmptyString(mask) ?  "*" : mask);
+          return 0;
+        }
     }
   else if ((*(mask+1) == (char) 0) && (*mask == '*'))
     {
@@ -199,7 +209,7 @@
       chptr = hash_find_channel(channame, NULL);
       if (chptr)
         {
-          member = IsMember(sptr, chptr);
+          member = IsMember(sptr, chptr) || SeesAllConnections(sptr);
           if (member || !SecretChannel(chptr))
             for (lp = chptr->members; lp; lp = lp->next)
               {
@@ -222,7 +232,7 @@
       for (lp = acptr->user->channel; lp; lp = lp->next)
         {
           chptr = lp->value.chptr;
-          member = IsMember(sptr, chptr);
+          member = IsMember(sptr, chptr) || SeesAllConnections(sptr);
           if (isinvis && !member)
             continue;
           if (member || (!isinvis && PubChannel(chptr)))
@@ -270,7 +280,8 @@
         }
       if (!acptr->user->channel && !isinvis)
         showperson = 1;
-      if (showperson &&
+        
+      if ((SeesAllConnections(sptr) || showperson) &&
           (!mask ||
            match(mask, acptr->name) ||
            match(mask, acptr->username) ||
@@ -279,7 +290,7 @@
            match(mask, acptr->info)))
         {
           do_who(sptr, acptr, ch2ptr, NULL);
-          if (!--maxmatches)
+          if (!SeesAllConnections(sptr) && !--maxmatches)
             {
               sendto_one(sptr, form_str(RPL_ENDOFWHO), me.name, parv[0],
                          EmptyString(mask) ?  "*" : mask);
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/m_whois.c ircd-hybrid-6.0/src/m_whois.c
--- ircd-hybrid-6.0.orig/src/m_whois.c	Fri Nov 24 17:36:30 2000
+++ ircd-hybrid-6.0/src/m_whois.c	Sun May 27 18:52:59 2001
@@ -350,7 +350,7 @@
           for (lp = user->channel; lp; lp = lp->next)
             {
               chptr = lp->value.chptr;
-              member = IsMember(sptr, chptr);
+              member = IsMember(sptr, chptr) || SeesAllConnections(sptr);
               if (invis && !member)
                 continue;
               if (member || (!invis && PubChannel(chptr)))
@@ -360,7 +360,10 @@
                 }
               if (!invis && HiddenChannel(chptr) &&
                   !SecretChannel(chptr))
-                showperson = 1;
+                {
+                  showperson = 1;
+                  break;
+                }
             }
           if (!showperson)
             continue;
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/messages_cust.tab ircd-hybrid-6.0/src/messages_cust.tab
--- ircd-hybrid-6.0.orig/src/messages_cust.tab	Sun May 27 18:53:41 2001
+++ ircd-hybrid-6.0/src/messages_cust.tab	Sun May 27 18:52:59 2001
@@ -28,7 +28,7 @@
 /* 001  RPL_WELCOME, */ ":%s 001 %s :Welcome to the Internet Relay Network %s",
 /* 002  RPL_YOURHOST,*/ ":%s 002 %s :Your host is %s, running version %s",
 /* 003  RPL_CREATED, */ ":%s 003 %s :This server was cobbled together %s",
-/* 004  RPL_MYINFO, */ ":%s 004 %s %s %s oiwszcrkfydnxbm biklmnopstved",
+/* 004  RPL_MYINFO, */ ":%s 004 %s %s %s oiwszcrkfydnxbma biklmnopstved",
 /* 005 */       (char *)NULL,
 /* 006 */       (char *)NULL,
 /* 007 */       (char *)NULL,
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/s_conf.c ircd-hybrid-6.0/src/s_conf.c
--- ircd-hybrid-6.0.orig/src/s_conf.c	Sun May 27 18:53:41 2001
+++ ircd-hybrid-6.0/src/s_conf.c	Sun May 27 18:52:59 2001
@@ -2981,6 +2981,10 @@
         int_privs |= CONF_OPER_M;           /* allow immunity */
       else if(*privs == 'm')
         int_privs &= ~CONF_OPER_M;          /* disallow immunity */
+      else if(*privs == 'A')
+        int_privs |= CONF_OPER_AUSPEX;      /* allow seeing the invisible */
+      else if(*privs == 'a')
+        int_privs &= ~CONF_OPER_AUSPEX;     /* disallow seeing the invisible */
 
       privs++;
     }
@@ -3033,6 +3037,15 @@
   else
     *privs_ptr++ = 'm';
   
+  if(port & CONF_OPER_AUSPEX)
+    {
+      if(cptr)
+        SetOperAuspex(cptr);
+      *privs_ptr++ = 'A';
+    }
+  else
+    *privs_ptr++ = 'a';
+  
   if(port & CONF_OPER_N)
     {
       if(cptr)
@@ -3141,6 +3154,8 @@
         int_flags |= FLAGS_NCHANGE;
       else if(*flags == 'm')
         int_flags |= FLAGS_IMMUNE;
+      else if(*flags == 'a')
+        int_flags |= FLAGS_AUSPEX;
       flags++;
     }
 
@@ -3190,6 +3205,8 @@
     *flags_ptr++ = 'n';
   if(flags & FLAGS_IMMUNE)
     *flags_ptr++ = 'm';
+  if(flags & FLAGS_AUSPEX)
+    *flags_ptr++ = 'a';
   *flags_ptr = '\0';
 
   return(flags_out);
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	Sun May 27 18:53:41 2001
+++ ircd-hybrid-6.0/src/s_user.c	Sun May 27 18:53:31 2001
@@ -80,6 +80,7 @@
 
 static FLAG_ITEM user_modes[] =
 { 
+  {FLAGS_AUSPEX, 'a'},
   {FLAGS_BOTS,  'b'},
   {FLAGS_CCONN, 'c'},
   {FLAGS_DEBUG, 'd'},
@@ -139,7 +140,7 @@
   0,            /* Z 0x5A */
   0, 0, 0, 0, 0, /* 0x5F */ 
   /* 0x60 */       0,
-  0,            /* a */
+  FLAGS_AUSPEX, /* a */
   FLAGS_BOTS,   /* b */
   FLAGS_CCONN,  /* c */
   FLAGS_DEBUG,  /* d */
@@ -2023,6 +2024,10 @@
 			      *(m2++) = *m;
 			    break;
 #endif
+			  case FLAGS_AUSPEX:
+                            if (IsSetOperAuspex(sptr))
+                              *(m2++) = *m;
+                            break;
                           default:
                             *(m2++) = *m;
                             break;
@@ -2139,7 +2144,8 @@
   			            FLAGS2_OPER_GOD|
 #endif
                                     FLAGS2_OPER_K|
-                                    FLAGS2_OPER_IMMUNE);
+                                    FLAGS2_OPER_IMMUNE|
+                                    FLAGS2_OPER_AUSPEX);
                   while(cur_cptr)
                     {
                       if(acptr == cur_cptr) 
@@ -2200,6 +2206,13 @@
       acptr->umodes &= ~FLAGS_IMMUNE; /* only services really need this,
                                         though it could be useful for
                                         opers once in a while */
+    }
+
+  if ((acptr->umodes & FLAGS_AUSPEX) && !IsSetOperAuspex(sptr) && MyClient(sptr) && !IsServer(sptr))
+    {
+      sendto_one(sptr,":%s NOTICE %s :*** You need oper and A flag for +a",
+		 me.name,parv[0]);
+      acptr->umodes &= ~FLAGS_AUSPEX;
     }
 
 #ifdef GODOPERS
