diff -urwN hybserv-cvs.2005-11-31/help/seenserv/index hybserv-shakeit-2005/help/seenserv/index
--- hybserv-cvs.2005-11-31/help/seenserv/index	2005-08-14 12:29:30.000000000 +0300
+++ hybserv-shakeit-2005/help/seenserv/index	2005-10-31 14:29:31.955859344 +0200
@@ -6,8 +6,12 @@
 
     SEEN       Gives information on a nick/hostmask
     SEENNICK   Gives information on specific nick only
+    JOIN       Joins a specified channel (identified founders only)
+    PART       Parts a specified channel (identified founders only)
 
 %+a%b* * * *
 %+aAdministrator commands:
 %+a%b%b
 %+a    SEENSTAT  Gives general 'last seen' statistics
+%+a    JOIN      Joins a channel.
+%+a    PART      Parts a channel.
diff -urwN hybserv-cvs.2005-11-31/help/seenserv/join hybserv-shakeit-2005/help/seenserv/join
--- hybserv-cvs.2005-11-31/help/seenserv/join	1970-01-01 02:00:00.000000000 +0200
+++ hybserv-shakeit-2005/help/seenserv/join	2005-10-31 14:29:31.955859344 +0200
@@ -0,0 +1,4 @@
+Syntax: %bJOIN <channel>%b
+
+Will have %O add <channel> to the list of channels being
+monitored. Available for identified to %C founders only.
diff -urwN hybserv-cvs.2005-11-31/help/seenserv/part hybserv-shakeit-2005/help/seenserv/part
--- hybserv-cvs.2005-11-31/help/seenserv/part	1970-01-01 02:00:00.000000000 +0200
+++ hybserv-shakeit-2005/help/seenserv/part	2005-10-31 14:29:31.956859192 +0200
@@ -0,0 +1,5 @@
+Syntax: %bPART <channel>%b
+
+Will have %O remove <channel> from the list of channels being
+monitored.  Available for identified to %C founders only.
+
diff -urwN hybserv-cvs.2005-11-31/include/chanserv.h hybserv-shakeit-2005/include/chanserv.h
--- hybserv-cvs.2005-11-31/include/chanserv.h	2005-10-31 03:27:11.000000000 +0200
+++ hybserv-shakeit-2005/include/chanserv.h	2005-10-31 14:29:31.956859192 +0200
@@ -29,6 +29,9 @@
 #define CS_SPLITOPS     0x00000800 /* let people keep ops from splits */
 #define CS_VERBOSE      0x00001000 /* notify chanops for access changes */
 #define CS_EXPIREBANS   0x00002000 /* expire bans after EXPIRETIME */
+/* <ShakeIT> */
+#define CS_SEENSERV     0x00004000 /* channel is served by SeenServ */
+/* </ShakeIT> */
 
 /* access_lvl[] indices */
 #if defined HYBRID7 && defined HYBRID7_HALFOPS
diff -urwN hybserv-cvs.2005-11-31/include/seenserv.h hybserv-shakeit-2005/include/seenserv.h
--- hybserv-cvs.2005-11-31/include/seenserv.h	2005-08-14 12:29:26.000000000 +0300
+++ hybserv-shakeit-2005/include/seenserv.h	2005-10-31 14:29:31.957859040 +0200
@@ -25,6 +25,10 @@
 
 void es_process(char *, char *);
 void es_add(char *, char *, char *, char *, time_t, int);
+/* <ShakeIT> */
+void ss_join(struct Channel *);
+void ss_part(struct Channel *);
+/* </ShakeIT> */
 
 extern int seenc;
 extern aSeen *seenp, *seenb; 
diff -urwN hybserv-cvs.2005-11-31/src/chanserv.c hybserv-shakeit-2005/src/chanserv.c
--- hybserv-cvs.2005-11-31/src/chanserv.c	2005-10-31 03:27:11.000000000 +0200
+++ hybserv-shakeit-2005/src/chanserv.c	2005-10-31 14:29:31.961858432 +0200
@@ -171,7 +171,9 @@
 	    { "IDENTIFY", c_identify, LVL_IDENT },
 	    { "ACCESS", c_access, LVL_IDENT },
 	    { "AKICK", c_akick, LVL_IDENT },
-	    { "LIST", c_list, LVL_NONE },
+/* <ShakeIT> */
+	    { "LIST", c_list, LVL_IDENT },
+/* <ShakeIT> */
 	    { "LEVEL", c_level, LVL_IDENT },
 	    { "SET", c_set, LVL_IDENT },
 	    { "CYCLE", c_cycle, LVL_IDENT },
@@ -183,7 +185,9 @@
 #endif /* HYBRID7_HALFOPS */
 	    { "VOICE", c_voice, LVL_IDENT },
 	    { "UNBAN", c_unban, LVL_IDENT },
-	    { "INFO", c_info, LVL_NONE },
+/* <ShakeIT> */
+	    { "INFO", c_info, LVL_IDENT },
+/* </ShakeIT> */
 	    { "CLEAR", c_clear, LVL_IDENT },
 	    { "FIXTS" , c_fixts, LVL_ADMIN },
 #ifdef EMPOWERADMINS
@@ -1957,13 +1961,24 @@
 	 * or ChanServ will be changing the topic or setting
 	 * mlock modes everytime someone joins.
 	 */
+/* <ShakeIT> */
 	if (newchan)
+	{
 		cs_join(cptr);
 
+		if (cptr->flags & CS_SEENSERV)
+		ss_join(chptr);
+	}
+/* </ShakeIT> */
+
 #else
 
 	cs_join(cptr);
 
+/* <ShakeIT> */
+	if (cptr->flags & CS_SEENSERV)
+		ss_join(chptr);
+/* </ShakeIT> */
 #endif /* HYBRID_ONLY */
 
 	/*
@@ -2194,6 +2208,9 @@
 				       cptr->name);
 
 				chptr = FindChannel(cptr->name);
+/* <ShakeIT> */
+				ss_part(chptr);
+/* </ShakeIT> */
 				if (IsChannelMember(chptr, Me.csptr))
 					cs_part(chptr);
 
@@ -2223,13 +2240,20 @@
 		for (tempc = Me.csptr->firstchan; tempc != NULL; )
 		{
 			if ((tempc->chptr->numusers == 1) ||
+/* <ShakeIT> */
+			    (tempc->chptr->numusers == 2 && IsChannelMember(tempc->chptr, Me.esptr)) ||
+/* </ShakeIT> */
 			        !cs_ShouldBeOnChan(FindChan(tempc->chptr->name)))
+              
 			{
 				/* ChanServ is the only client on the channel, part */
 				SendUmode(OPERUMODE_Y, "%s: Parting channel [%s]",
 				          n_ChanServ, tempc->chptr->name);
 
 				temp = tempc->next;
+/* <ShakeIT> */
+				ss_part(tempc->chptr);
+/* </ShakeIT> */
 				cs_part(tempc->chptr);
 				tempc = temp;
 			}
@@ -3360,6 +3384,10 @@
 
 	chptr = FindChannel(cptr->name);
 
+/* <ShakeIT> */
+	ss_part(chptr);
+/* </ShakeIT> */
+
 	if (IsChannelMember(chptr, Me.csptr))
 		cs_part(chptr);
 
diff -urwN hybserv-cvs.2005-11-31/src/seenserv.c hybserv-shakeit-2005/src/seenserv.c
--- hybserv-cvs.2005-11-31/src/seenserv.c	2005-09-24 02:17:48.000000000 +0300
+++ hybserv-shakeit-2005/src/seenserv.c	2005-10-31 14:29:31.964857976 +0200
@@ -20,6 +20,7 @@
 #include "data.h"
 #include "hash.h"
 #include "helpserv.h"
+#include "chanserv.h"
 #include "seenserv.h"
 #include "hybdefs.h"
 #include "match.h"
@@ -45,6 +46,10 @@
 static void es_help(struct Luser *, int, char **);
 static void es_seenstat(struct Luser *, int, char **);
 static void FreeSeen(void);
+/* <ShakeIT> */
+static void es_join(struct Luser *, int, char **, int);
+static void es_part(struct Luser *, int, char **);
+/* </ShakeIT> */
 
 static struct Command seencmds[] =
     {
@@ -52,6 +57,10 @@
 	    { "SEENNICK", es_seennick, LVL_NONE },
 	    { "HELP", es_help, LVL_NONE },
 	    { "SEENSTAT", es_seenstat, LVL_ADMIN },
+/* <ShakeIT> */
+	    { "JOIN", es_join, LVL_NONE },
+	    { "PART", es_part, LVL_NONE },
+/* </ShakeIT> */
 	    { 0, 0, 0 }
     };
 
@@ -540,4 +549,107 @@
 
 } /* es_seenstat() */
 
+/* <ShakeIT> */
+/*
+ * ss_join - joins channel whitout performing any check
+ */
+void ss_join(struct Channel *cptr)
+{
+  char sendstr[MAXLINE];
+  char **av;
+  
+  if (!cptr)
+    return;  
+
+  ircsprintf(sendstr,
+             ":%s SJOIN %ld %s + :+%s\r\n",
+             Me.name, (long) cptr->since, cptr->name, n_SeenServ);
+  toserv(sendstr);
+  SplitBuf(sendstr, &av);
+
+  AddChannel(av, 0, (char **) NULL);
+  
+  MyFree(av);
+} /* ss_join() */
+
+/* ss_part - removes SeenServ from channel */
+void
+ss_part(struct Channel *chptr)
+{
+  if (!chptr)
+    return;
+  if (IsChannelMember(chptr, Me.esptr))
+    toserv(":%s PART %s\r\n", n_SeenServ, chptr->name);
+  RemoveFromChannel(chptr, Me.esptr);
+} /* ss_part() */
+
+static void
+es_join(struct Luser *lptr, int ac, char **av, int sockfd)
+
+{
+  struct Channel *chptr;
+  struct ChanInfo *cptr;
+  
+  if (ac < 2)
+    return;
+
+  if (!(chptr = FindChannel(av[1])))
+    {  
+      notice (n_SeenServ, lptr->nick, "No such channel - %s", av[1]);
+      return;
+    }
+  
+  if (!(cptr = FindChan(chptr->name)))
+    {
+      notice(n_SeenServ, lptr->nick, "The channel %s is not registered", chptr->name);
+      return;
+    }
+  
+  if (IsFounder(lptr, cptr) || IsAdmin(lptr))
+    {
+    	cptr->flags |= CS_SEENSERV;
+      ss_join(chptr);
+      return;
+    }
+
+  notice(n_SeenServ, lptr->nick, "You are not the FOUNDER of %s", cptr->name);
+} /* es_join() */
+
+/*
+es_part()
+  Have SeenServ part 'chptr'
+*/
+void
+es_part(struct Luser *lptr, int ac, char **av)
+
+{
+  struct Channel *chptr;
+  struct ChanInfo *cptr;
+  
+  if (ac < 2)
+    return;
+   
+  if (!(chptr = FindChannel(av[1])))
+    {  
+      notice (n_SeenServ, lptr->nick, "No such channel - %s", av[1]);
+      return;
+    }
+  
+  if (!(cptr = FindChan(chptr->name)))
+    {
+      notice(n_SeenServ, lptr->nick, "The channel %s is not registered", chptr->name);
+      return;
+    }
+      
+  if (IsFounder(lptr, cptr) || IsAdmin(lptr))
+    {
+      cptr->flags &= ~CS_SEENSERV;
+      ss_part(chptr);
+      return;
+    }
+  
+  notice(n_SeenServ, lptr->nick, "You are not the FOUNDER of %s", cptr->name);
+} /* es_part() */
+/* </ShakeIT> */
+
 #endif /* SEENSERVICES */
diff -urwN hybserv-cvs.2005-11-31/src/server.c hybserv-shakeit-2005/src/server.c
--- hybserv-cvs.2005-11-31/src/server.c	2005-10-29 20:33:10.000000000 +0300
+++ hybserv-shakeit-2005/src/server.c	2005-10-31 14:29:31.966857672 +0200
@@ -1256,6 +1256,22 @@
 		return;
 	}
 
+/* <ShakeIT> */
+#ifdef SEENSERVICES
+	if (!serviceptr && match("SEEN *", command))
+	{
+		struct Channel *chptr;
+
+		chptr = FindChannel(av[2]);
+		if (IsChannelMember(chptr, Me.esptr))
+		{
+			es_process(who, command);
+			return;
+		}
+	}
+#endif
+/* </ShakeIT> */
+
 	if (serviceptr && (command[0] == '\001'))
 	{
 		/* process ctcp request */
