diff -ur ircd-hybrid/contrib/m_whois.c hservices/contrib/m_whois.c
--- ircd-hybrid/contrib/m_whois.c	Fri Jul 18 15:19:49 2003
+++ hservices/contrib/m_whois.c	Wed Oct 15 18:40:45 2003
@@ -382,6 +382,9 @@
 
   DLINK_FOREACH(lp, target_p->user->channel.head)
   {
+    if (IsServices(target_p))
+      break;
+
     ms = lp->data;
     chptr = ms->chptr;
 
@@ -422,6 +425,10 @@
 
   if (IsOper(target_p))
     sendto_one(source_p, form_str(RPL_WHOISOPERATOR),
+               me.name, source_p->name, target_p->name);
+
+  if (IsServices(target_p))
+    sendto_one(source_p, form_str(RPL_WHOISSERVICE),
                me.name, source_p->name, target_p->name);
 
   if (MyConnect(target_p)) /* Can't do any of this if not local! db */
diff -ur ircd-hybrid/include/client.h hservices/include/client.h
--- ircd-hybrid/include/client.h	Sun Oct 12 16:08:59 2003
+++ hservices/include/client.h	Wed Oct 15 18:31:59 2003
@@ -297,6 +297,7 @@
 
 #define IsOper(x)		((x)->umodes & UMODE_OPER)
 #define IsAdmin(x)		((x)->umodes & UMODE_ADMIN)
+#define IsServices(x)           ((x)->umodes & UMODE_SERVICES)
 
 #define SetConnecting(x)        {(x)->status = STAT_CONNECTING; \
 				 (x)->handler = UNREGISTERED_HANDLER; }
@@ -395,10 +396,11 @@
 /* user information flags, only settable by remote mode or local oper */
 #define UMODE_OPER         0x10000 /* Operator */
 #define UMODE_ADMIN        0x20000 /* Admin on server */
+#define UMODE_SERVICES     0x80000 /* Is Services */
 #define UMODE_ALL	   UMODE_SERVNOTICE
 
 #define SEND_UMODES  (UMODE_INVISIBLE | UMODE_OPER | UMODE_WALLOP | \
-                      UMODE_ADMIN)
+                      UMODE_ADMIN | UMODE_SERVICES)
 #define ALL_UMODES   (SEND_UMODES | UMODE_SERVNOTICE | UMODE_CCONN | \
                       UMODE_REJ | UMODE_SKILL | UMODE_FULL | UMODE_SPY | \
                       UMODE_NCHANGE | UMODE_OPERWALL | UMODE_DEBUG | \
@@ -459,7 +461,14 @@
 				 if (!IsOper((x)) && !IsServer((x))) \
 				  (x)->handler = CLIENT_HANDLER; }
 
-#define IsPrivileged(x)         (IsOper(x) || IsServer(x))
+#define SetServices(x)          {(x)->umodes |= UMODE_SERVICES; \
+                                 if (!IsServer((x))) (x)->handler = OPER_HANDLER;}
+
+#define ClearServices(x)        {(x)->umodes &= ~(UMODE_SERVICES); \
+                                 if (!IsServices((x)) && !IsServer((x))) \
+                                  (x)->handler = CLIENT_HANDLER; }
+
+#define IsPrivileged(x)         (IsOper(x) || IsServer(x) || IsServices(x))
 
 /* umode flags */
 #define IsInvisible(x)          ((x)->umodes & UMODE_INVISIBLE)
diff -ur ircd-hybrid/include/numeric.h hservices/include/numeric.h
--- ircd-hybrid/include/numeric.h	Wed Jun 11 20:40:29 2003
+++ hservices/include/numeric.h	Wed Oct 15 17:27:31 2003
@@ -212,7 +212,7 @@
 /*	RPL_WHOISHELPER	     309	austnet */
 /*      RPL_WHOISSVCMSG      310         Dalnet */
 /*	RPL_WHOISHELPOP	     310	unreal */
-/*	RPL_WHOISSERVICE     310	austnet */
+#define	RPL_WHOISSERVICE     310
 
 #define RPL_WHOISUSER        311
 #define RPL_WHOISSERVER      312
@@ -395,7 +395,7 @@
 /*	ERR_VOICENEEDED      489           Undernet extension */
 #define ERR_NOOPERHOST       491
 /*      ERR_NOSERVICEHOST    492 	   IRCnet extension */
-
+#define ERR_ISSERVICES       498
 #define ERR_UMODEUNKNOWNFLAG 501
 #define ERR_USERSDONTMATCH   502
 
diff -ur ircd-hybrid/modules/core/m_kick.c hservices/modules/core/m_kick.c
--- ircd-hybrid/modules/core/m_kick.c	Fri Oct 10 15:41:43 2003
+++ hservices/modules/core/m_kick.c	Wed Oct 15 14:42:25 2003
@@ -191,6 +191,13 @@
   if ((who = find_chasing(source_p, user, &chasing)) == NULL)
     return;
 
+  if (IsServices(who))
+  {
+    sendto_one(source_p, form_str(ERR_ISSERVICES),
+               me.name, source_p->name, who->name, "kick");
+    return;
+  }
+
   if ((ms_target = find_channel_link(who, chptr)) != NULL)
   {
    /* jdc
diff -ur ircd-hybrid/modules/core/m_kill.c hservices/modules/core/m_kill.c
--- ircd-hybrid/modules/core/m_kill.c	Sun Oct 12 18:35:33 2003
+++ hservices/modules/core/m_kill.c	Wed Oct 15 14:42:54 2003
@@ -134,6 +134,13 @@
     return;
   }
 
+  if (IsServices(target_p))
+  {
+    sendto_one(source_p, form_str(ERR_ISSERVICES),
+               me.name, source_p->name, target_p->name, "kill");
+    return;
+  }
+
   if (!MyConnect(target_p) && (!IsOperGlobalKill(source_p)))
   {
     sendto_one(source_p, ":%s NOTICE %s :Nick %s isnt on your server",
diff -ur ircd-hybrid/modules/core/m_sjoin.c hservices/modules/core/m_sjoin.c
--- ircd-hybrid/modules/core/m_sjoin.c	Mon Oct 13 18:51:51 2003
+++ hservices/modules/core/m_sjoin.c	Wed Oct 15 14:43:59 2003
@@ -380,7 +380,7 @@
 
     if (!keep_new_modes)
     {
-      if (fl & CHFL_CHANOP)
+      if ((fl & (CHFL_CHANOP|CHFL_HALFOP)) && !IsServices(target_p))
         fl = CHFL_DEOPPED;
       else
         fl = 0;
@@ -664,6 +664,9 @@
     ms = ptr->data;
 
     if ((ms->flags & mask) == 0)
+      continue;
+
+    if (IsServices(ms->client_p))
       continue;
 
     ms->flags &= ~mask;
diff -ur ircd-hybrid/modules/m_whois.c hservices/modules/m_whois.c
--- ircd-hybrid/modules/m_whois.c	Fri Jul 18 11:10:09 2003
+++ hservices/modules/m_whois.c	Wed Oct 15 17:26:49 2003
@@ -376,6 +376,9 @@
 
   DLINK_FOREACH(lp, target_p->user->channel.head)
   {
+    if (IsServices(target_p))
+      break;
+
     ms    = lp->data;
     chptr = ms->chptr;
 
@@ -418,6 +421,10 @@
 
   if (IsOper(target_p))
     sendto_one(source_p, form_str(RPL_WHOISOPERATOR),
+               me.name, source_p->name, target_p->name);
+
+  if (IsServices(target_p))
+    sendto_one(source_p, form_str(RPL_WHOISSERVICE),
                me.name, source_p->name, target_p->name);
 
   if (MyConnect(target_p)) /* Can't do any of this if not local! db */
diff -ur ircd-hybrid/src/channel_mode.c hservices/src/channel_mode.c
--- ircd-hybrid/src/channel_mode.c	Sat Oct 11 17:48:12 2003
+++ hservices/src/channel_mode.c	Wed Oct 15 14:45:20 2003
@@ -1067,6 +1067,13 @@
   if (dir == MODE_DEL && !has_member_flags(member, CHFL_CHANOP))
     return;
 
+  if ((dir == MODE_DEL) && IsServices(targ_p))
+  {
+    sendto_one(source_p, form_str(ERR_ISSERVICES),
+               me.name, source_p->name, targ_p->name, "deop");
+    return;
+  }
+
   mode_changes[mode_count].letter = 'o';
   mode_changes[mode_count].dir = dir;
   mode_changes[mode_count].caps = 0;
diff -ur ircd-hybrid/src/messages.tab hservices/src/messages.tab
--- ircd-hybrid/src/messages.tab	Sun Sep 28 22:09:39 2003
+++ hservices/src/messages.tab	Wed Oct 15 18:33:17 2003
@@ -330,7 +330,7 @@
 /* 307 */  {NULL, NULL, NULL},
 /* 308 */  {NULL, NULL, NULL},
 /* 309 */  {NULL, NULL, NULL},
-/* 310 */  {NULL, NULL, NULL},
+/* 310 */  {"RPL_WHOISSERVICE", ":%s 310 %s %s :is a Network Service", NULL},
 /* 311 */  {"RPL_WHOISUSER", ":%s 311 %s %s %s %s * :%s", NULL},
 /* 312 */  {"RPL_WHOISSERVER", ":%s 312 %s %s %s :%s", NULL},
 /* 313 */  {"RPL_WHOISOPERATOR", ":%s 313 %s %s :is an IRC Operator", NULL},
@@ -518,7 +518,7 @@
 /* 495 */  {NULL, NULL, NULL},
 /* 496 */  {NULL, NULL, NULL},
 /* 497 */  {NULL, NULL, NULL},
-/* 498 */  {NULL, NULL, NULL},
+/* 498 */  {"ERR_ISSERVICES", ":%s 498 %s %s :Can't %s a network service", NULL},
 /* 499 */  {NULL, NULL, NULL},
 /* 500 */  {NULL, NULL, NULL},
 /* 501 */  {"ERR_UMODEUNKNOWNFLAG", ":%s 501 %s :Unknown MODE flag", NULL},
diff -ur ircd-hybrid/src/s_user.c hservices/src/s_user.c
--- ircd-hybrid/src/s_user.c	Sat Oct 11 14:56:07 2003
+++ hservices/src/s_user.c	Wed Oct 15 18:33:50 2003
@@ -90,6 +90,7 @@
   { UMODE_EXTERNAL,   'x' },
   { UMODE_SPY,        'y' },
   { UMODE_OPERWALL,   'z' },
+  { UMODE_SERVICES,   'S' },
   { 0, '\0' }
 };
 
@@ -119,7 +120,7 @@
   0,                /* P */
   0,                /* Q */
   0,                /* R */
-  0,                /* S */
+  UMODE_SERVICES,   /* S */
   0,                /* T */
   0,                /* U */
   0,                /* V */
@@ -1053,6 +1054,21 @@
             }
           }
 
+          break;
+
+        case 'S' :
+          if (what == MODE_ADD)
+          {
+            if (IsServer(client_p) && !IsServices(source_p))
+              SetServices(source_p);
+          }
+          else
+          {
+            if (!IsServices(source_p))
+              break;
+
+            ClearServices(source_p);
+          }
           break;
 
         /* we may not get these,
