diff -BbuprN -x '*.o' suntzu/src/act.comm.c suntzu-ken/src/act.comm.c
--- suntzu/src/act.comm.c	2003-11-30 14:47:24.000000000 -0600
+++ suntzu-ken/src/act.comm.c	2003-12-28 09:06:00.000000000 -0600
@@ -523,9 +523,9 @@ ACMD(do_gen_comm)
   };
 
   /* to keep pets, etc from being ordered to shout */
-  if (!ch->desc)
+  if (!ch->desc && !MOB_FLAGGED(ch, MOB_USECHANNELS))
     return;
-
+  if (!IS_NPC(ch)) { /* NPCs who can use channels have no restrictions */
   if (PLR_FLAGGED(ch, PLR_NOSHOUT)) {
     send_to_char(ch, "%s", com_msgs[subcmd][0]);
     return;
@@ -536,7 +536,8 @@ ACMD(do_gen_comm)
   }
   /* level_can_shout defined in config.c */
   if (GET_LEVEL(ch) < CONFIG_LEVEL_CAN_SHOUT) {
-    send_to_char(ch, "You must be at least level %d before you can %s.\r\n", CONFIG_LEVEL_CAN_SHOUT, com_msgs[subcmd][1]);
+      send_to_char(ch, "You must be at least level %d before you can %s.\r\n", 
+                   CONFIG_LEVEL_CAN_SHOUT, com_msgs[subcmd][1]);
     return;
   }
   /* make sure the char is on the channel */
@@ -544,12 +545,14 @@ ACMD(do_gen_comm)
     send_to_char(ch, "%s", com_msgs[subcmd][2]);
     return;
   }
+  }
   /* skip leading spaces */
   skip_spaces(&argument);
 
   /* make sure that there is something there to say! */
   if (!*argument) {
-    send_to_char(ch, "Yes, %s, fine, %s we must, but WHAT???\r\n", com_msgs[subcmd][1], com_msgs[subcmd][1]);
+    send_to_char(ch, "Yes, %s, fine, %s we must, but WHAT???\r\n",
+                 com_msgs[subcmd][1], com_msgs[subcmd][1]);
     return;
   }
   if (subcmd == SCMD_HOLLER) {
@@ -563,10 +566,12 @@ ACMD(do_gen_comm)
   strlcpy(color_on, com_msgs[subcmd][3], sizeof(color_on));
 
   /* first, set up strings to be given to the communicator */
-  if (PRF_FLAGGED(ch, PRF_NOREPEAT))
+  if (IS_NPC(ch) || PRF_FLAGGED(ch, PRF_NOREPEAT))
     send_to_char(ch, "%s", CONFIG_OK);
   else
-    send_to_char(ch, "%sYou %s, '%s'%s", COLOR_LEV(ch) >= C_CMP ? color_on : "", com_msgs[subcmd][1], argument, CCNRM(ch, C_CMP));
+    send_to_char(ch, "%sYou %s, '%s'%s", 
+		 COLOR_LEV(ch) >= C_CMP ? color_on : "", 
+		 com_msgs[subcmd][1], argument, CCNRM(ch, C_CMP));
 
   snprintf(buf1, sizeof(buf1), "$n %ss, '%s'", com_msgs[subcmd][1], argument);
 
diff -BbuprN -x '*.o' suntzu/src/constants.c suntzu-ken/src/constants.c
--- suntzu/src/constants.c	2003-11-29 19:36:43.000000000 -0600
+++ suntzu-ken/src/constants.c	2003-12-28 08:56:13.000000000 -0600
@@ -219,8 +219,8 @@ const char *action_bits[] = {
   "NO_BASH",
   "NO_BLIND",
   "NO_KILL",
-  "DEAD",    /* You should never see this. */
-  "SPARE1",
+  "DEAD (do not set)",    /* You should never see this. */
+  "USECHANNELS",
   "SPARE2",
   "SPARE3",
   "SPARE4",
diff -BbuprN -x '*.o' suntzu/src/oasis.h suntzu-ken/src/oasis.h
--- suntzu/src/oasis.h	2003-11-26 15:18:42.000000000 -0600
+++ suntzu-ken/src/oasis.h	2003-12-28 08:56:23.000000000 -0600
@@ -34,7 +34,7 @@
 #define NUM_ROOM_FLAGS 		18
 #define NUM_ROOM_SECTORS	10
 
-#define NUM_MOB_FLAGS		19
+#define NUM_MOB_FLAGS		21
 #define NUM_AFF_FLAGS		28
 #define NUM_ATTACK_TYPES	15
 
diff -BbuprN -x '*.o' suntzu/src/structs.h suntzu-ken/src/structs.h
--- suntzu/src/structs.h	2003-11-30 18:41:53.000000000 -0600
+++ suntzu-ken/src/structs.h	2003-12-28 08:46:47.000000000 -0600
@@ -225,7 +225,7 @@
 #define MOB_NOKILL		18 /* Mob can't be killed               */
 #define MOB_NOTDEADYET		19 /* (R) Mob being extracted.          */
 
-#define MOB_SPARE1		20 /* (R) Mob being extracted.          */
+#define MOB_USECHANNELS		20 /* Mob can use channels and gossip.  */
 #define MOB_SPARE2		21 /* (R) Mob being extracted.          */
 #define MOB_SPARE3		22 /* (R) Mob being extracted.          */
 #define MOB_SPARE4		23 /* (R) Mob being extracted.          */
