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 Feb 18 17:06:48 2001
+++ ircd-hybrid-6.0/include/config.h	Sun Feb 18 16:48:48 2001
@@ -177,6 +177,29 @@
  */
 #define NETWORK_DESC "http://openprojects.nu/"
 
+/* USE_SERVICES
+ * Defines whether or not you're using services on your network
+ */
+#define USE_SERVICES
+#ifdef USE_SERVICES
+
+/* SERVICES_NAME and ????SERV
+ * names for your services pseudo-users
+  */
+  
+#define SERVICES_NAME "services.openprojects.quiet"
+  
+#define CHANSERV "ChanServ"
+#define NICKSERV "NickServ"
+#define MEMOSERV "MemoServ"
+#define OPERSERV "OperServ"
+#define STATSERV "StatServ"
+#define HELPSERV "HelpServ"
+#define SEENSERV "SeenServ"
+#define GLOBALNOTICE "GlobalNotice"
+  
+#endif
+    
 
 /* TS_MAX_DELTA and TS_WARN_DELTA -  allowed delta for TS when another
  * server connects.
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/include/m_commands.h ircd-hybrid-6.0/include/m_commands.h
--- ircd-hybrid-6.0.orig/include/m_commands.h	Sun Feb 18 17:06:47 2001
+++ ircd-hybrid-6.0/include/m_commands.h	Sun Feb 18 16:52:52 2001
@@ -104,4 +104,15 @@
 extern int m_makepass(struct Client *,struct Client *,int,char **);
 extern int m_stopic(struct Client *,struct Client *,int,char **);
 
+#ifdef USE_SERVICES
+extern int m_chanserv(struct Client *,struct Client *,int,char **);
+extern int m_memoserv(struct Client *,struct Client *,int,char **);
+extern int m_nickserv(struct Client *,struct Client *,int,char **);
+extern int m_operserv(struct Client *,struct Client *,int,char **);
+extern int m_statserv(struct Client *,struct Client *,int,char **);
+extern int m_helpserv(struct Client *,struct Client *,int,char **);
+extern int m_seenserv(struct Client *,struct Client *,int,char **);
+extern int m_global(struct Client *,struct Client *,int,char **);
+#endif /* USE_SERVICES */
+
 #endif /* INCLUDED_m_commands_h */
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/include/msg.h ircd-hybrid-6.0/include/msg.h
--- ircd-hybrid-6.0.orig/include/msg.h	Sun Feb 18 17:06:47 2001
+++ ircd-hybrid-6.0/include/msg.h	Sun Feb 18 17:03:31 2001
@@ -132,6 +132,25 @@
 #endif /* LWALLOPS */
 #define MSG_KNOCK          "KNOCK"  /* KNOCK */
 
+#ifdef USE_SERVICES
+#define MSG_CHANSERV    "CHANSERV"      /* CHANSERV */
+#define MSG_CS                  "CS"                    /* CS */
+#define MSG_NICKSERV    "NICKSERV"      /* NICKSERV */
+#define MSG_NS                  "NS"                    /* NS */
+#define MSG_MEMOSERV    "MEMOSERV"      /* MEMOSERV */
+#define MSG_MS                  "MS"                    /* MS */
+#define MSG_OPERSERV    "OPERSERV"      /* OPERSERV */
+#define MSG_OS                  "OS"                    /* OS */
+#define MSG_SEENSERV    "SEENSERV"      /* SEENSERV */
+#define MSG_LS                  "LS"                    /* LS */
+#define MSG_HELPSERV    "HELPSERV"      /* HELPSERV */
+#define MSG_HS                  "HS"                    /* HS */
+#define MSG_STATSERV    "STATSERV"      /* STATSERV */
+#define MSG_SS                  "SS"                    /* SS */
+#define MSG_GLOBAL      "GLOBALNOTICE"  /* GLOBALNOTICE */
+#define MSG_GN                  "GN"                    /* GN */
+#endif
+
 #define MAXPARA    15 
 
 #define MSG_TESTLINE "TESTLINE"
@@ -251,8 +270,23 @@
   { MSG_DIE, m_die,          0, MAXPARA, 1, 0, 0, 0L },
   { MSG_HTM,    m_htm,       0, MAXPARA, 1, 0, 0, 0L },
   { MSG_SET,    m_set,       0, MAXPARA, 1, 0, 0, 0L },
-  { MSG_TESTLINE,       m_testline,          0, MAXPARA, 1, 0, 0, 0L },
-
+  { MSG_TESTLINE, m_testline,0, MAXPARA, 1, 0, 0, 0L },
+  { MSG_CHANSERV, m_chanserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_CS,       m_chanserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_NICKSERV, m_nickserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_NS,       m_nickserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_MEMOSERV, m_memoserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_MS,       m_memoserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_OPERSERV, m_operserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_OS,       m_operserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_SEENSERV, m_seenserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_LS,       m_seenserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_STATSERV, m_statserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_SS,       m_statserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_HELPSERV, m_helpserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_HS,       m_helpserv,      0, 1, 1, 0, 1, 0L },
+  { MSG_GLOBAL,   m_global,        0, 1, 1, 0, 1, 0L },
+  { MSG_GN,       m_global,        0, 1, 1, 0, 1, 0L },
   { MSG_SETHOST, m_sethost,  0, 2,       1, 0, 0, 0L },
   { MSG_SETIDENT, m_setident,0, 2,       1, 0, 0, 0L },
   { MSG_SETNAME, m_setname,  0, 2, 1, 0, 0, 0L },
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/Makefile.in ircd-hybrid-6.0/src/Makefile.in
--- ircd-hybrid-6.0.orig/src/Makefile.in	Sun Feb 18 17:06:48 2001
+++ ircd-hybrid-6.0/src/Makefile.in	Sun Feb 18 16:43:18 2001
@@ -65,6 +65,7 @@
 	m_quit.c \
 	m_rehash.c \
 	m_restart.c \
+	m_services.c \
 	m_server.c \
 	m_set.c \
 	m_setname.c \
diff -ruN -x configure -x *~ -x ircd-hybrid-6.0.orig -x *.rej ircd-hybrid-6.0.orig/src/m_services.c ircd-hybrid-6.0/src/m_services.c
--- ircd-hybrid-6.0.orig/src/m_services.c	Wed Dec 31 16:00:00 1969
+++ ircd-hybrid-6.0/src/m_services.c	Sun Feb 18 17:05:21 2001
@@ -0,0 +1,251 @@
+/************************************************************************
+ *   IRC - Internet Relay Chat, src/m_services.c
+ *   Copyright (C) 1990 Jarkko Oikarinen and
+ *                      University of Oulu, Computing Center
+ *
+ *   See file AUTHORS in IRC package for additional names of
+ *   the programmers. 
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 1, or (at your option)
+ *   any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *   $Id: 087-50-services-communication-commands.patch,v 1.3 2001/07/16 18:55:38 lilo dead $
+ */
+#include "m_commands.h"
+#include "client.h"
+#include "ircd.h"
+#include "numeric.h"
+#include "s_misc.h"
+#include "s_serv.h"
+#include "send.h"
+
+/*
+ * m_functions execute protocol messages on this server:
+ *
+ *      cptr    is always NON-NULL, pointing to a *LOCAL* client
+ *              structure (with an open socket connected!). This
+ *              identifies the physical socket where the message
+ *              originated (or which caused the m_function to be
+ *              executed--some m_functions may call others...).
+ *
+ *      sptr    is the source of the message, defined by the
+ *              prefix part of the message if present. If not
+ *              or prefix not found, then sptr==cptr.
+ *
+ *              (!IsServer(cptr)) => (cptr == sptr), because
+ *              prefixes are taken *only* from servers...
+ *
+ *              (IsServer(cptr))
+ *                      (sptr == cptr) => the message didn't
+ *                      have the prefix.
+ *
+ *                      (sptr != cptr && IsServer(sptr) means
+ *                      the prefix specified servername. (?)
+ *
+ *                      (sptr != cptr && !IsServer(sptr) means
+ *                      that message originated from a remote
+ *                      user (not local).
+ *
+ *              combining
+ *
+ *              (!IsServer(sptr)) means that, sptr can safely
+ *              taken as defining the target structure of the
+ *              message in this server.
+ *
+ *      *Always* true (if 'parse' and others are working correct):
+ *
+ *      1)      sptr->from == cptr  (note: cptr->from == cptr)
+ *
+ *      2)      MyConnect(sptr) <=> sptr == cptr (e.g. sptr
+ *              *cannot* be a local connection, unless it's
+ *              actually cptr!). [MyConnect(x) should probably
+ *              be defined as (x == x->from) --msa ]
+ *
+ *      parc    number of variable parameter strings (if zero,
+ *              parv is allowed to be NULL)
+ *
+ *      parv    a NULL terminated list of parameter pointers,
+ *
+ *                      parv[0], sender (prefix string), if not present
+ *                              this points to an empty string.
+ *                      parv[1]...parv[parc-1]
+ *                              pointers to additional parameters
+ *                      parv[parc] == NULL, *always*
+ *
+ *              note:   it is guaranteed that parv[0]..parv[parc-1] are all
+ *                      non-NULL pointers.
+ */
+
+#ifdef USE_SERVICES
+
+/*
+ * m_chanserv
+ *
+ */
+int m_chanserv(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
+{
+	struct Client       *acptr;
+	if (parc < 2 || *parv[1] == '\0') {
+		sendto_one (sptr, form_str(ERR_NOTEXTTOSEND), me.name, parv[0]);
+		return(-1);
+	}
+                                                                
+	if ((acptr = find_person (CHANSERV, NULL))) {
+		sendto_one(acptr, ":%s PRIVMSG %s@%s :%s", parv[0], CHANSERV, SERVICES_NAME, parv[1]);        
+		return(0);
+	} else  {
+		return(-1);
+	}
+}
+
+
+/*
+ * m_nickserv
+ *
+ */
+int m_nickserv(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
+{
+	struct Client       *acptr;
+	if (parc < 2 || *parv[1] == '\0') {
+		sendto_one (sptr, form_str(ERR_NOTEXTTOSEND), me.name, parv[0]);
+		return(-1);
+	}
+	
+	if ((acptr = find_person (NICKSERV, NULL))) {
+		sendto_one(acptr, ":%s PRIVMSG %s@%s :%s", parv[0], NICKSERV, SERVICES_NAME, parv[1]);        
+		return(0);
+	} else  {
+		return(-1);
+	}
+}
+
+/*
+ * m_memoserv
+ *
+ */
+int m_memoserv(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
+{
+	struct Client       *acptr;
+	if (parc < 2 || *parv[1] == '\0') {
+		sendto_one (sptr, form_str(ERR_NOTEXTTOSEND), me.name, parv[0]);
+		return(-1);
+	}
+                                                                
+	if ((acptr = find_person (MEMOSERV, NULL))) {
+		sendto_one(acptr, ":%s PRIVMSG %s@%s :%s", parv[0], MEMOSERV, SERVICES_NAME, parv[1]);        
+		return(0);
+	} else {
+		return(-1);
+	}
+}
+
+/*
+ * m_operserv
+ *
+ */
+int m_operserv(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
+{
+	struct Client       *acptr;
+	if (parc < 2 || *parv[1] == '\0') {
+		sendto_one (sptr, form_str(ERR_NOTEXTTOSEND), me.name, parv[0]);
+		return(-1);
+	}
+	
+	if ((acptr = find_person (OPERSERV, NULL))) {
+		sendto_one(acptr, ":%s PRIVMSG %s@%s :%s", parv[0], OPERSERV, SERVICES_NAME, parv[1]);
+		return(0);
+	} else  {
+		return(-1);
+		}
+}
+/*
+ * m_seenserv
+ *
+ */
+int m_seenserv(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
+{
+	struct Client       *acptr;
+	if (parc < 2 || *parv[1] == '\0') {
+		sendto_one (sptr, form_str(ERR_NOTEXTTOSEND), me.name, parv[0]);
+		return(-1);
+	}
+	
+	if ((acptr = find_person (SEENSERV, NULL))) {
+		sendto_one(acptr, ":%s PRIVMSG %s@%s :%s", parv[0], SEENSERV, SERVICES_NAME, parv[1]);
+		return(0);
+	} else  {
+		return(-1);
+		}
+}
+/*
+ * m_statserv
+ *
+ */
+int m_statserv(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
+{
+	struct Client       *acptr;
+	if (parc < 2 || *parv[1] == '\0') {
+		sendto_one (sptr, form_str(ERR_NOTEXTTOSEND), me.name, parv[0]);
+		return(-1);
+	}
+	
+	if ((acptr = find_person (STATSERV, NULL))) {
+		sendto_one(acptr, ":%s PRIVMSG %s@%s :%s", parv[0], STATSERV, SERVICES_NAME, parv[1]);
+		return(0);
+	} else  {
+		return(-1);
+		}
+}
+/*
+ * m_helpserv
+ *
+ */
+int m_helpserv(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
+{
+	struct Client       *acptr;
+	if (parc < 2 || *parv[1] == '\0') {
+		sendto_one (sptr, form_str(ERR_NOTEXTTOSEND), me.name, parv[0]);
+		return(-1);
+	}
+	
+	if ((acptr = find_person (HELPSERV, NULL))) {
+		sendto_one(acptr, ":%s PRIVMSG %s@%s :%s", parv[0], HELPSERV, SERVICES_NAME, parv[1]);
+		return(0);
+	} else  {
+		return(-1);
+		}
+}
+
+/*
+ * m_global
+ *
+ */
+int m_global(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
+{
+	struct Client       *acptr;
+	if (parc < 2 || *parv[1] == '\0') {
+		sendto_one (sptr, form_str(ERR_NOTEXTTOSEND), me.name, parv[0]);
+		return(-1);
+	}
+	
+	if ((acptr = find_person (GLOBALNOTICE, NULL))) {
+		sendto_one(acptr, ":%s PRIVMSG %s@%s :%s", parv[0], GLOBALNOTICE, SERVICES_NAME, parv[1]);
+		return(0);
+	} else  {
+		return(-1);
+		}
+}
+
+#endif /* USE_SERVICES */
+
