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:13:58 2001
+++ ircd-hybrid-6.0/include/client.h	Sun May 27 18:13:36 2001
@@ -334,6 +334,8 @@
 #define FLAGS_BOTS         0x00800 /* shows bots */
 #define FLAGS_EXTERNAL     0x01000 /* show servers introduced */
 #define FLAGS_NINVITE      0x40000 /* Don't send or receive INVITE messages -- PMA */
+#define FLAGS_NCTCP        0x200000 /* Don't receive CTCP messages or notices -- PMA */
+
 /* user information flags, only settable by remote mode or local oper */
 #define FLAGS_IMMUNE       0x02000 /* immune from kick/deop */
 #define FLAGS_OPER         0x04000 /* Operator */
@@ -398,13 +400,13 @@
 
 #define SEND_UMODES  (FLAGS_INVISIBLE | FLAGS_OPER | FLAGS_WALLOP | \
                       FLAGS_IMMUNE | FLAGS_IDENTIFIED | FLAGS_NINVITE | \
-                      FLAGS_BLOCK_NOTID)
+                      FLAGS_BLOCK_NOTID | FLAGS_NCTCP)
 /*
  * Only opers can have modes outside USER_UMODES.  If you change this
  * set, then also change the explanatory NOTICE in user_mode(). -dark
  */
 #define USER_UMODES  (FLAGS_INVISIBLE | FLAGS_WALLOP | FLAGS_NINVITE | \
-                      FLAGS_BLOCK_NOTID)
+                      FLAGS_BLOCK_NOTID | FLAGS_NCTCP)
 #define ALL_UMODES   (SEND_UMODES | FLAGS_SERVNOTICE | FLAGS_CCONN | \
                       FLAGS_REJ | FLAGS_SKILL | FLAGS_FULL | FLAGS_SPY | \
                       FLAGS_NCHANGE | FLAGS_OPERWALL | FLAGS_DEBUG | \
@@ -461,6 +463,7 @@
 #define BlocksInvites(x)        ((x)->umodes & FLAGS_NINVITE)
 #define SetNoInvites(x)         ((x)->umodes |= FLAGS_NINVITE)
 #define ClearNoInvites(x)       ((x)->umodes &= ~FLAGS_NINVITE)
+#define DoesNotCTCP(x)          ((x)->umodes & FLAGS_NCTCP)
 #define SendWallops(x)          (((x)->umodes & FLAGS_WALLOP) && IsAnOper(x))
 #define ClearWallops(x)         ((x)->umodes &= ~FLAGS_WALLOP)
 #define SendServNotice(x)       (((x)->umodes & FLAGS_SERVNOTICE) && IsAnOper(x))
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	Sun May 27 18:13:58 2001
+++ ircd-hybrid-6.0/include/config.h	Sun May 27 18:01:35 2001
@@ -777,6 +777,16 @@
 #undef NEED_ULINES
    
 /*
+ * NCTCP - a usermode to block CTCP messages
+ */
+#define NCTCP
+
+/*
+ * SILENCE - ?
+ */
+#define SILENCE
+
+/*
  * If this is defined operse sending notices to range of addresses will
  * be forced to  specify at least the TLD
  */
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/opers.txt ircd-hybrid-6.0/opers.txt
--- ircd-hybrid-6.0.orig/opers.txt	Sun May 27 18:13:58 2001
+++ ircd-hybrid-6.0/opers.txt	Sun May 27 18:01:35 2001
@@ -14,6 +14,8 @@
          +i     - Designates this client 'invisible'.
          +I     - Prevents this client from sending or receiving
                   INVITE messages.
+         +C     - Prevents this client from sending or receiving
+                  CTCP or DCC messages.
          +w     - Can see server wallops.
        * +z     - Can see oper wallops.
          +s     - Can see generic server messages and oper kills.
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/m_message.c ircd-hybrid-6.0/src/m_message.c
--- ircd-hybrid-6.0.orig/src/m_message.c	Sun May 27 18:13:58 2001
+++ ircd-hybrid-6.0/src/m_message.c	Sun May 27 18:01:35 2001
@@ -377,16 +377,32 @@
 		    me.name, parv[0], nick);
 	 return 0;
       }
-
+#ifdef  SILENCE
       if (!is_silenced(sptr, acptr)) {
-          if (!notice && MyConnect(sptr) &&
-              acptr->user && acptr->user->away)
-            sendto_one(sptr, form_str(RPL_AWAY), me.name,
-                       parv[0], acptr->name,
-                       acptr->user->away);
-          sendto_prefix_one(acptr, sptr, ":%s %s %s :%s",
-                            parv[0], cmd, nick, parv[2]);
+#endif
+        if (MyConnect(sptr) && acptr->user)
+          {
+#ifdef  NCTCP
+            // NCTCP (umode +C) checks  -- PMA
+            if (parv[2][0] == 1)                  // is CTCP
+              if (!SeesAllConnections(sptr) &&    // exempt from AUSPEX
+                  !SeesAllConnections(acptr))     // exempt to AUSPEX
+                if (DoesNotCTCP(acptr) ||         // block to +N 
+                   (notice && DoesNotCTCP(sptr))) // block replies from +N
+                  return 0;                       // kill it!
+#endif // NCTCP
+            if (!notice && acptr->user->away)
+              sendto_one(sptr, form_str(RPL_AWAY), me.name,
+                         parv[0], acptr->name,
+                         acptr->user->away);
+          }
+        /* here's where we actually send the message */
+        sendto_prefix_one(acptr, sptr, ":%s %s %s :%s",
+                          parv[0], cmd, nick, parv[2]);
+#ifdef SILENCE
       }
+#endif
+
 
 #ifdef  IDLE_CHECK
       /* reset idle time for message only if its not to self */
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:13:58 2001
+++ ircd-hybrid-6.0/src/s_user.c	Sun May 27 18:01:35 2001
@@ -84,6 +84,7 @@
   {FLAGS_AUSPEX, 'a'},
   {FLAGS_BOTS,  'b'},
   {FLAGS_CCONN, 'c'},
+  {FLAGS_NCTCP, 'C'},
   {FLAGS_DEBUG, 'd'},
   {FLAGS_FULL,  'f'},
   {FLAGS_INVISIBLE, 'i'},
@@ -121,7 +122,7 @@
   0,            /* @ */
   0,            /* A */
   0,            /* B */
-  0,            /* C */
+  FLAGS_NCTCP,  /* C */
   0,            /* D */
   FLAGS_BLOCK_NOTID, /* E */
   0,            /* F */
