diff -upN ./SVN_Comp01/Fire/src/act_comm.c ./SVN_Comp/Fire/src/act_comm.c
--- ./SVN_Comp01/Fire/src/act_comm.c	2009-01-11 23:13:16.000000000 -0500
+++ ./SVN_Comp/Fire/src/act_comm.c	2009-01-11 07:32:28.000000000 -0500
@@ -259,7 +259,6 @@ void do_replay( CHAR_DATA *ch, const cha
 /* RT auction rewritten in ROM style */
 void do_auction( CHAR_DATA *ch, const char *argument )
 {
-    DESCRIPTOR_DATA        *d = NULL;
 
     if ( argument[0] == '\0' )
     {
@@ -292,29 +291,15 @@ void do_auction( CHAR_DATA *ch, const ch
         }
 
         REMOVE_BIT( ch->comm, COMM_NOAUCTION );
+        
+        channel_speech( CHAN_AUCTION, ch, argument, NULL );
     }
-
-    ch_printf( ch, "You auction '%s'\r\n", argument );
-    for ( d = descriptor_list; d != NULL; d = d->next )
-    {
-        CHAR_DATA              *victim = NULL;
-
-        victim = d->original ? d->original : d->character;
-
-        if ( d->connected == CON_PLAYING &&
-             d->character != ch &&
-             !IS_SET( victim->comm, COMM_NOAUCTION ) &&
-             !IS_SET( victim->comm, COMM_QUIET ) )
-        {
-            act_new( "$n auctions '$t'", ch, argument, d->character, TO_VICT, POS_DEAD );
-        }
-    }
+    
 }
 
 /* RT chat replaced with ROM gossip */
 void do_gossip( CHAR_DATA *ch, const char *argument )
 {
-    DESCRIPTOR_DATA        *d = NULL;
 
     if ( argument[0] == '\0' )
     {
@@ -349,28 +334,12 @@ void do_gossip( CHAR_DATA *ch, const cha
 
         REMOVE_BIT( ch->comm, COMM_NOGOSSIP );
 
-        ch_printf( ch, "You gossip '%s'\r\n", argument );
-        for ( d = descriptor_list; d != NULL; d = d->next )
-        {
-            CHAR_DATA              *victim;
-
-            victim = d->original ? d->original : d->character;
-
-            if ( d->connected == CON_PLAYING &&
-                 d->character != ch &&
-                 !IS_SET( victim->comm, COMM_NOGOSSIP ) &&
-                 !IS_SET( victim->comm, COMM_QUIET ) )
-            {
-                act_new( "$n gossips '$t'",
-                         ch, argument, d->character, TO_VICT, POS_SLEEPING );
-            }
-        }
+        channel_speech( CHAN_GOSSIP, ch, argument, NULL );
     }
 }
 
 void do_grats( CHAR_DATA *ch, const char *argument )
 {
-    DESCRIPTOR_DATA        *d = NULL;
 
     if ( argument[0] == '\0' )
     {
@@ -405,28 +374,12 @@ void do_grats( CHAR_DATA *ch, const char
 
         REMOVE_BIT( ch->comm, COMM_NOGRATS );
 
-        ch_printf( ch, "You grats '%s'\r\n", argument );
-        for ( d = descriptor_list; d != NULL; d = d->next )
-        {
-            CHAR_DATA              *victim;
-
-            victim = d->original ? d->original : d->character;
-
-            if ( d->connected == CON_PLAYING &&
-                 d->character != ch &&
-                 !IS_SET( victim->comm, COMM_NOGRATS ) &&
-                 !IS_SET( victim->comm, COMM_QUIET ) )
-            {
-                act_new( "$n grats '$t'",
-                         ch, argument, d->character, TO_VICT, POS_SLEEPING );
-            }
-        }
+        channel_speech( CHAN_GRATS, ch, argument, NULL );
     }
 }
 
 void do_quote( CHAR_DATA *ch, const char *argument )
 {
-    DESCRIPTOR_DATA        *d = NULL;
 
     if ( argument[0] == '\0' )
     {
@@ -461,29 +414,13 @@ void do_quote( CHAR_DATA *ch, const char
 
         REMOVE_BIT( ch->comm, COMM_NOQUOTE );
 
-        ch_printf( ch, "You quote '%s'\r\n", argument );
-        for ( d = descriptor_list; d != NULL; d = d->next )
-        {
-            CHAR_DATA              *victim;
-
-            victim = d->original ? d->original : d->character;
-
-            if ( d->connected == CON_PLAYING &&
-                 d->character != ch &&
-                 !IS_SET( victim->comm, COMM_NOQUOTE ) &&
-                 !IS_SET( victim->comm, COMM_QUIET ) )
-            {
-                act_new( "$n quotes '$t'",
-                         ch, argument, d->character, TO_VICT, POS_SLEEPING );
-            }
-        }
+        channel_speech( CHAN_QUOTE, ch, argument, NULL );
     }
 }
 
 /* RT question channel */
 void do_question( CHAR_DATA *ch, const char *argument )
 {
-    DESCRIPTOR_DATA        *d = NULL;
 
     if ( argument[0] == '\0' )
     {
@@ -517,29 +454,13 @@ void do_question( CHAR_DATA *ch, const c
 
         REMOVE_BIT( ch->comm, COMM_NOQUESTION );
 
-        ch_printf( ch, "You question '%s'\r\n", argument );
-        for ( d = descriptor_list; d != NULL; d = d->next )
-        {
-            CHAR_DATA              *victim = NULL;
-
-            victim = d->original ? d->original : d->character;
-
-            if ( d->connected == CON_PLAYING &&
-                 d->character != ch &&
-                 !IS_SET( victim->comm, COMM_NOQUESTION ) &&
-                 !IS_SET( victim->comm, COMM_QUIET ) )
-            {
-                act_new( "$n questions '$t'",
-                         ch, argument, d->character, TO_VICT, POS_SLEEPING );
-            }
-        }
+        channel_speech( CHAN_QUESTION, ch, argument, NULL );
     }
 }
 
 /* RT answer channel - uses same line as questions */
 void do_answer( CHAR_DATA *ch, const char *argument )
 {
-    DESCRIPTOR_DATA        *d = NULL;
 
     if ( argument[0] == '\0' )
     {
@@ -573,29 +494,13 @@ void do_answer( CHAR_DATA *ch, const cha
 
         REMOVE_BIT( ch->comm, COMM_NOQUESTION );
 
-        ch_printf( ch, "You answer '%s'\r\n", argument );
-        for ( d = descriptor_list; d != NULL; d = d->next )
-        {
-            CHAR_DATA              *victim = NULL;
-
-            victim = d->original ? d->original : d->character;
-
-            if ( d->connected == CON_PLAYING &&
-                 d->character != ch &&
-                 !IS_SET( victim->comm, COMM_NOQUESTION ) &&
-                 !IS_SET( victim->comm, COMM_QUIET ) )
-            {
-                act_new( "$n answers '$t'",
-                         ch, argument, d->character, TO_VICT, POS_SLEEPING );
-            }
-        }
+        channel_speech( CHAN_ANSWER, ch, argument, NULL );
     }
 }
 
 /* clan channels */
 void do_clantalk( CHAR_DATA *ch, const char *argument )
 {
-    DESCRIPTOR_DATA        *d = NULL;
 
     if ( !is_clan( ch ) || clan_table[ch->clan].independent )
     {
@@ -625,25 +530,12 @@ void do_clantalk( CHAR_DATA *ch, const c
 
     REMOVE_BIT( ch->comm, COMM_NOCLAN );
 
-    ch_printf( ch, "You clan '%s'\r\n", argument );
-    for ( d = descriptor_list; d != NULL; d = d->next )
-    {
-        if ( d->connected == CON_PLAYING &&
-             d->character != ch &&
-             is_same_clan( ch, d->character ) &&
-             !IS_SET( d->character->comm, COMM_NOCLAN ) &&
-             !IS_SET( d->character->comm, COMM_QUIET ) )
-        {
-            act_new( "$n clans '$t'", ch, argument, d->character, TO_VICT, POS_DEAD );
-        }
-    }
-
+    channel_speech( CHAN_CLAN, ch, argument, NULL );
     return;
 }
 
 void do_immtalk( CHAR_DATA *ch, const char *argument )
 {
-    DESCRIPTOR_DATA        *d = NULL;
 
     if ( argument[0] == '\0' )
     {
@@ -662,16 +554,7 @@ void do_immtalk( CHAR_DATA *ch, const ch
 
     REMOVE_BIT( ch->comm, COMM_NOWIZ );
 
-    act_new( "$n: $t", ch, argument, NULL, TO_CHAR, POS_DEAD );
-    for ( d = descriptor_list; d != NULL; d = d->next )
-    {
-        if ( d->connected == CON_PLAYING &&
-             IS_IMMORTAL( d->character ) && !IS_SET( d->character->comm, COMM_NOWIZ ) )
-        {
-            act_new( "$n: $t", ch, argument, d->character, TO_VICT, POS_DEAD );
-        }
-    }
-
+    channel_speech( CHAN_WIZ, ch, argument, NULL );
     return;
 }
 
@@ -683,8 +566,7 @@ void do_say( CHAR_DATA *ch, const char *
         return;
     }
 
-    act( "$n says '$T'", ch, NULL, argument, TO_ROOM );
-    act( "You say '$T'", ch, NULL, argument, TO_CHAR );
+    channel_speech( CHAN_SAY, ch, argument, NULL );
 
     if ( !IS_NPC( ch ) )
     {
@@ -704,7 +586,6 @@ void do_say( CHAR_DATA *ch, const char *
 
 void do_shout( CHAR_DATA *ch, const char *argument )
 {
-    DESCRIPTOR_DATA        *d = NULL;
 
     if ( argument[0] == '\0' )
     {
@@ -731,22 +612,7 @@ void do_shout( CHAR_DATA *ch, const char
 
     WAIT_STATE( ch, 12 );
 
-    act( "You shout '$T'", ch, NULL, argument, TO_CHAR );
-    for ( d = descriptor_list; d != NULL; d = d->next )
-    {
-        CHAR_DATA              *victim = NULL;
-
-        victim = d->original ? d->original : d->character;
-
-        if ( d->connected == CON_PLAYING &&
-             d->character != ch &&
-             !IS_SET( victim->comm, COMM_SHOUTSOFF ) &&
-             !IS_SET( victim->comm, COMM_QUIET ) )
-        {
-            act( "$n shouts '$t'", ch, argument, d->character, TO_VICT );
-        }
-    }
-
+    channel_speech( CHAN_SHOUT, ch, argument, NULL );
     return;
 }
 
@@ -832,8 +698,7 @@ void do_tell( CHAR_DATA *ch, const char 
         return;
     }
 
-    act( "You tell $N '$t'", ch, argument, victim, TO_CHAR );
-    act_new( "$n tells you '$t'", ch, argument, victim, TO_VICT, POS_DEAD );
+    channel_speech( CHAN_TELL, ch, argument, victim );
     victim->reply = ch;
 
     if ( !IS_NPC( ch ) && IS_NPC( victim ) && HAS_TRIGGER( victim, TRIG_SPEECH ) )
@@ -904,9 +769,8 @@ void do_reply( CHAR_DATA *ch, const char
         add_buf( victim->pcdata->buffer, buf );
         return;
     }
-
-    act_new( "You tell $N '$t'", ch, argument, victim, TO_CHAR, POS_DEAD );
-    act_new( "$n tells you '$t'", ch, argument, victim, TO_VICT, POS_DEAD );
+    
+    channel_speech( CHAN_REPLY, ch, argument, victim );
     victim->reply = ch;
 
     return;
@@ -914,7 +778,6 @@ void do_reply( CHAR_DATA *ch, const char
 
 void do_yell( CHAR_DATA *ch, const char *argument )
 {
-    DESCRIPTOR_DATA        *d = NULL;
 
     if ( IS_SET( ch->comm, COMM_NOSHOUT ) )
     {
@@ -928,19 +791,7 @@ void do_yell( CHAR_DATA *ch, const char 
         return;
     }
 
-    act( "You yell '$t'", ch, argument, NULL, TO_CHAR );
-    for ( d = descriptor_list; d != NULL; d = d->next )
-    {
-        if ( d->connected == CON_PLAYING
-             && d->character != ch
-             && d->character->in_room != NULL
-             && d->character->in_room->area == ch->in_room->area
-             && !IS_SET( d->character->comm, COMM_QUIET ) )
-        {
-            act( "$n yells '$t'", ch, argument, d->character, TO_VICT );
-        }
-    }
-
+    channel_speech( CHAN_YELL, ch, argument, NULL );
     return;
 }
 
@@ -1811,7 +1662,6 @@ void do_split( CHAR_DATA *ch, const char
 
 void do_gtell( CHAR_DATA *ch, const char *argument )
 {
-    CHAR_DATA              *gch = NULL;
 
     if ( argument[0] == '\0' )
     {
@@ -1825,14 +1675,38 @@ void do_gtell( CHAR_DATA *ch, const char
         return;
     }
 
-    for ( gch = char_list; gch != NULL; gch = gch->next )
+    channel_speech( CHAN_GROUP, ch, argument, NULL );
+    return;
+}
+
+void do_speak( CHAR_DATA *ch, const char *argument )
+{
+
+    char                    arg[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
+    int                     lang;
+
+    one_argument( argument, arg );
+
+    if ( arg[0] == '\0' )
     {
-        if ( is_same_group( gch, ch ) )
-            act_new( "$n tells the group '$t'",
-                     ch, argument, gch, TO_VICT, POS_SLEEPING );
+        ch_printf( ch, "Speak which language?\r\n" );
+        return;
     }
 
-    return;
+    //TODO: this needs to be a skill lookup
+    lang = language_lookup( arg );
+
+    if ( lang == -1 )
+    {
+        ch_printf( ch, "You don't know how to speak in that language.\r\n" );
+    }
+    else
+    {
+        ch->speaking = language_table[lang].language;
+        ch_printf( ch, "You now speak in %s.\r\n", language_table[lang].name );
+    }
+
+    return;    
 }
 
 /*
@@ -1852,3 +1726,301 @@ bool is_same_group( const CHAR_DATA *ach
         bch = bch->leader;
     return ach == bch;
 }
+
+const char *slur_words(const char *speech, int cond_drunk)
+{
+    static char buf[MAX_INPUT_LENGTH];
+    char temp0, temp1;
+    int inlength = strlen(speech);
+    int outpos = 0;
+    int i, idx, randomnum;
+
+
+    for( i=0; i<inlength; i++ )
+    {
+        temp0 = UPPER(speech[i]);
+        if(temp0 >= 'A' && temp0 <= 'Z')
+        {
+            temp1 = temp0 - 'A';
+            idx = temp1;
+            if(cond_drunk > drunken_slur_table[idx].min_drunk)
+            {
+                randomnum = number_range( 0, drunken_slur_table[idx].rep_count);
+                strcpy(&buf[outpos], drunken_slur_table[idx].replacement[randomnum]);
+                outpos += strlen(drunken_slur_table[idx].replacement[randomnum]);
+            }
+            else
+            {
+                buf[outpos] = speech[i];
+                outpos++;
+            }
+
+        }
+        else if(temp0 >= '0' && temp0 <= '9')
+        {
+            if(cond_drunk > 4)
+            {
+                temp1 = '0' + number_range(0, 9);
+                buf[outpos] = temp1;
+                outpos++;
+            }
+            else
+            {
+                buf[outpos] = speech[i];
+                outpos++;
+            }
+        }
+        else
+        {
+            buf[outpos] = speech[i];
+            outpos++;
+
+        }
+
+    }
+    
+    buf[outpos] = '\0';          /* Mark end of the string... */
+    return ( char * )buf;
+}
+
+const char *language_convert(const char *speech, CHAR_DATA *ch, CHAR_DATA *vch)
+{
+    static char buf[MAX_INPUT_LENGTH];
+    char word[MAX_STRING_LENGTH];
+    int lang;
+    int inlength = strlen(speech);
+    int outpos = 0;
+    int i, j, k, l, m;
+    int chance, comprehension, sn;
+    int len, len_sub;
+    bool word_translated, word_matched;
+    bool full_caps;
+    buf[outpos] = '\0';
+    word[0] = '\0';
+
+    if ( ch == NULL || vch == NULL )
+    {
+        log_error("NULL character data sent to %s.", __FUNCTION__ );
+        return "";
+    }
+
+    lang = ch->speaking;
+
+    if ( lang < LANG_COMMON || lang > LANG_UNKNOWN )
+    {
+        log_error("Invalid language %i passed to language_convert.", lang);
+        return "";
+    }
+
+    if ( lang == LANG_COMMON )
+    {
+        strcpy( buf, speech );
+        return buf;
+    }
+    
+    sprintf( word, "%s comprehension", language_table[language_lookup( ch->speaking )].name );
+
+    if ( ( sn = skill_lookup( word ) ) == -1 )
+    {
+        log_error( "Can't find the \"%s\" skill in %s?", word, __FUNCTION__ );
+        return "";
+    }
+
+    comprehension = get_skill( vch, sn );
+    
+    chance = comprehension + 7;
+
+    for( i = 0, j = 0; i <= inlength; i++ )
+    {
+        if( LOWER(speech[i]) >= 'a' && LOWER(speech[i]) <= 'z' )
+        {
+            word[j] = speech[i];
+            j++;
+
+        }
+        else
+        {
+
+            word[j] = '\0';
+            word_translated = chance < number_percent( );
+            check_improve( vch, sn, !word_translated, 2 );
+
+            if ( strlen( word ) > 0 )
+            {
+                if ( !word_translated )
+                {
+	            strcat( buf, word );
+                    outpos += strlen( word );
+                }
+                else
+                {
+                    word_matched = false;
+                    for ( k = 0; lang_word_table[lang][k].word != NULL; k++ )
+                    {
+                        if ( LOWER( word[0] ) == lang_word_table[lang][k].word[0]
+                             && !str_cmp( word, lang_word_table[lang][k].word) )
+                        {
+                            word_matched = true;
+                            
+                            if ( word[0] == UPPER( word[0] ) )
+                            {
+                                len = strlen( word );
+                                for ( full_caps = true, l = 0; l < len; l++ )
+                                {
+                                    if ( word[l] != UPPER ( word[l] ) )
+                                        full_caps = false;
+                                }
+    
+                                strcpy( word, lang_word_table[lang][k].foreign_word );
+                                
+                                if ( full_caps )
+                                {
+                                    len = strlen( word );
+                                    for ( l = 0; l < len; l++ )
+                                    {
+                                        word[l] = UPPER( word[l] );
+                                    }
+                                }
+                                else
+                                {
+                                    word[0] = UPPER( word[0] );
+                                }
+
+                                strcat( buf, word );
+                            }
+                            else
+                            {
+                                strcat( buf, lang_word_table[lang][k].foreign_word );
+                            }
+                            outpos += strlen( lang_word_table[lang][k].foreign_word );
+                            break;
+                        }   
+                    }
+
+                    if ( !word_matched )
+                    {
+                        len = strlen( word );
+                        for ( k = 0; k < len; k++ )
+                        {
+                            for ( l = 0; lang_letter_table[lang][l].letter != NULL; l++ )
+                            {
+                                if ( LOWER( word[k] ) == lang_letter_table[lang][l].letter[0] )
+                                {
+                                    strcat( buf, lang_letter_table[lang][l].foreign_letter );
+                                    if ( word[k] == UPPER( word[k] ) )
+                                    {   
+                                        len_sub = strlen ( lang_letter_table[lang][l].foreign_letter );
+                                        if ( len_sub > 1 && ( word[k + 1] == UPPER( word[k + 1] )
+                                                              || word[k + 1] == '\0' ) )
+                                        {
+                                           for( m = 0; m < len_sub; m++ )
+                                           {
+                                               buf[outpos + m] = UPPER( buf[outpos + m] );
+                                           }
+                                        }
+                                        else
+                                        {
+                                            buf[outpos] = UPPER( buf[outpos] );
+                                        }
+                                    }
+                                    outpos += strlen( lang_letter_table[lang][l].foreign_letter );
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+                j = 0;
+                
+            }
+            
+            buf[outpos] = speech[i];
+            outpos++;
+            buf[outpos] = '\0';  /* strcat needs this */
+
+        }
+    }
+
+    buf[outpos] = '\0';          /* Mark end of the string... */
+    return ( char * )buf;
+}
+
+
+void channel_speech(int channel, CHAR_DATA *ch, const char *argument, CHAR_DATA *vch)
+{
+    char                    buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
+    DESCRIPTOR_DATA        *d = NULL;
+    bool                    receipt = false;
+    int                     chanidx = channel_lookup( channel );
+
+    if ( channel == CHAN_TELL || channel == CHAN_REPLY )
+    {
+        if ( vch == NULL )
+        {
+            log_error( "NULL victim char passed to channel_speech with channel = %i", channel );
+            return;
+        }
+        strcpy( buf, vch->name );
+        strcat( buf, " ");
+        buf[0] = UPPER( buf[0] );
+    }
+
+    ch_printf( ch, "You %s %s'%s'\r\n", 
+               channel_table[chanidx].outgoing_verb, buf,
+               slur_words( argument, ch->pcdata->condition[COND_DRUNK] ) );
+
+
+    for ( d = descriptor_list; d != NULL; d = d->next )
+    {
+        CHAR_DATA              *victim;
+
+        if ( channel == CHAN_TELL || channel == CHAN_REPLY )
+            victim = vch;
+        else
+            victim = d->original ? d->original : d->character;
+
+        receipt = d->connected == CON_PLAYING && victim != ch;
+
+        /* Immortals speak through all blocking flags */
+	if ( channel_table[chanidx].blocking_flag != -1 )
+            receipt = receipt && ( !IS_SET( victim->comm, 
+                                          channel_table[chanidx].blocking_flag)
+                                   || IS_IMMORTAL(ch) );
+
+        if ( channel != CHAN_WIZ && channel != CHAN_SAY && channel != CHAN_GROUP )
+            receipt = receipt && ( !IS_SET( victim->comm, COMM_QUIET ) 
+                                   || IS_IMMORTAL(ch) );
+
+
+        if ( channel == CHAN_CLAN )
+            receipt = receipt && is_same_clan( ch, victim );
+        else if ( channel == CHAN_GROUP )
+            receipt = receipt && is_same_group( victim, ch );
+	else if ( channel == CHAN_YELL )
+            receipt = receipt && victim->in_room != NULL 
+                              && victim->in_room->area == ch->in_room->area;
+        else if ( channel == CHAN_WIZ )
+            receipt = receipt && IS_IMMORTAL( victim );
+        else if ( channel == CHAN_SAY )
+            receipt = receipt && victim->in_room != NULL
+                              && victim->in_room == ch->in_room;
+        else if ( channel == CHAN_TELL || channel == CHAN_REPLY )
+            receipt = true; /* victim already located */
+
+        if ( receipt )
+        {
+
+            act_printf( "$n %s '$t'", ch, 
+                        slur_words( language_convert(argument, ch, victim),
+                                    ch->pcdata->condition[COND_DRUNK] ),
+                        victim, TO_VICT, channel_table[chanidx].min_pos, false, 
+                        channel_table[chanidx].incoming_verb );
+            
+            
+            
+            if ( channel == CHAN_TELL || channel == CHAN_REPLY )
+                return;
+        }       
+    }
+
+}
diff -upN ./SVN_Comp01/Fire/src/act.h ./SVN_Comp/Fire/src/act.h
--- ./SVN_Comp01/Fire/src/act.h	2009-01-11 23:13:16.000000000 -0500
+++ ./SVN_Comp/Fire/src/act.h	2009-01-09 17:14:09.000000000 -0500
@@ -55,6 +55,8 @@ void                    stop_follower( C
 void                    nuke_pets( CHAR_DATA *ch );
 void                    die_follower( CHAR_DATA *ch );
 bool                    is_same_group( const CHAR_DATA *ach, const CHAR_DATA *bch );
+void                    channel_speech( int channel, CHAR_DATA *ch, const char *argument, 
+                                        CHAR_DATA *vch );
 
 /* act_info.c */
 char                   *format_obj_to_char( OBJ_DATA *obj, CHAR_DATA *ch, bool fShort );
diff -upN ./SVN_Comp01/Fire/src/act_info.c ./SVN_Comp/Fire/src/act_info.c
--- ./SVN_Comp01/Fire/src/act_info.c	2009-01-11 23:13:16.000000000 -0500
+++ ./SVN_Comp/Fire/src/act_info.c	2009-01-11 02:02:44.000000000 -0500
@@ -1578,6 +1578,9 @@ void do_score( CHAR_DATA *ch, const char
     else
         ch_printf( ch, "satanic.\r\n" );
 
+    ch_printf( ch, "You speak in %s.\r\n",
+               language_table[language_lookup(ch->speaking)].name );
+
     if ( IS_SET( ch->comm, COMM_SHOW_AFFECTS ) )
         do_function( ch, &do_affects, "" );
 }
diff -upN ./SVN_Comp01/Fire/src/act_wiz.c ./SVN_Comp/Fire/src/act_wiz.c
--- ./SVN_Comp01/Fire/src/act_wiz.c	2009-01-11 23:13:16.000000000 -0500
+++ ./SVN_Comp/Fire/src/act_wiz.c	2009-01-09 17:14:09.000000000 -0500
@@ -3145,7 +3145,7 @@ void do_mset( CHAR_DATA *ch, const char 
         ch_printf( ch, "    str int wis dex con sex class level\r\n" );
         ch_printf( ch, "    race group gold silver hp mana move prac\r\n" );
         ch_printf( ch, "    align train thirst hunger drunk full\r\n" );
-        ch_printf( ch, "    security\r\n" );
+        ch_printf( ch, "    security speaking\r\n" );
         return;
     }
 
@@ -3513,6 +3513,30 @@ void do_mset( CHAR_DATA *ch, const char 
         return;
     }
 
+    if ( !str_cmp( arg2, "speaking" ) )                /* language */
+    {
+        if ( IS_NPC( ch ) )
+        {
+            ch_printf( ch, "Yeah, sure.\r\n" );
+            return;
+        }
+
+        if ( IS_NPC( victim ) )
+        {
+            ch_printf( ch, "Not on NPC's.\r\n" );
+            return;
+        }
+
+        if ( value < LANG_COMMON || value > LANG_UNKNOWN )
+        {
+            ch_printf( ch, "Invalid language.\r\n" );
+            return;
+        }
+
+        victim->speaking = value;
+        return;
+    }
+
     /*
      * Generate usage message.
      */
diff -upN ./SVN_Comp01/Fire/src/comm.c ./SVN_Comp/Fire/src/comm.c
--- ./SVN_Comp01/Fire/src/comm.c	2009-01-11 23:13:16.000000000 -0500
+++ ./SVN_Comp/Fire/src/comm.c	2009-01-11 21:59:14.000000000 -0500
@@ -1310,6 +1308,14 @@ void nanny( DESCRIPTOR_DATA *d, const ch
             ch->pcdata->points = pc_race_table[race].points;
             ch->size = pc_race_table[race].size;
 
+            /*
+             * add language comprehensions
+             */
+            ch->pcdata->learned[skill_lookup( "common comprehension" )] = 100;
+            sprintf( local_argument, "%s comprehension", 
+                     language_table[language_lookup( pc_race_table[race].lang )].name);
+            ch->pcdata->learned[skill_lookup( local_argument )] = 100;
+
             desc_printf( d, "What is your sex (M/F)? " );
             d->connected = CON_GET_NEW_SEX;
             break;
@@ -2312,8 +2318,6 @@ void act_printf( const char *format, CHA
             continue;
         if ( to->position < min_pos )
             continue;
-        if ( !IS_AWAKE( to ) )
-            continue;
         if ( !can_see( to, ch ) && hide_invis )
             continue;
         if ( type == TO_CHAR && to != ch )
diff -upN ./SVN_Comp01/Fire/src/interp.c ./SVN_Comp/Fire/src/interp.c
--- ./SVN_Comp01/Fire/src/interp.c	2009-01-11 23:13:16.000000000 -0500
+++ ./SVN_Comp/Fire/src/interp.c	2009-01-11 02:02:47.000000000 -0500
@@ -195,6 +195,7 @@ const struct cmd_type   cmd_table[] = {
     {"shout", do_shout, POS_RESTING, 3, LOG_NORMAL, 1},
     {"unread", do_unread, POS_SLEEPING, 0, LOG_NORMAL, 1},
     {"yell", do_yell, POS_RESTING, 0, LOG_NORMAL, 1},
+    {"speak", do_speak, POS_SLEEPING, 0, LOG_NORMAL, 1},
 
     /*
      * Object manipulation commands.
diff -upN ./SVN_Comp01/Fire/src/interp.h ./SVN_Comp/Fire/src/interp.h
--- ./SVN_Comp01/Fire/src/interp.h	2009-01-11 23:13:16.000000000 -0500
+++ ./SVN_Comp/Fire/src/interp.h	2009-01-11 01:30:04.000000000 -0500
@@ -117,6 +117,7 @@ void                    do_order( CHAR_D
 void                    do_group( CHAR_DATA *ch, const char *argument );
 void                    do_split( CHAR_DATA *ch, const char *argument );
 void                    do_gtell( CHAR_DATA *ch, const char *argument );
+void                    do_speak( CHAR_DATA *ch, const char *argument );
 
 /* act_info.c */
 void                    do_scroll( CHAR_DATA *ch, const char *argument );
diff -upN ./SVN_Comp01/Fire/src/merc.h ./SVN_Comp/Fire/src/merc.h
--- ./SVN_Comp01/Fire/src/merc.h	2009-01-11 23:13:16.000000000 -0500
+++ ./SVN_Comp/Fire/src/merc.h	2009-01-11 21:49:37.000000000 -0500
@@ -115,6 +116,7 @@ typedef void SPELL_FUN  ( int sn, int le
 #define MAX_ALIAS                                      5
 #define MAX_CLASS                                      4
 #define MAX_PC_RACE                                    5
+#define MAX_LANG_WORDS                               512
 #define MAX_CLAN                                       3
 #define MAX_DAMAGE_MESSAGE                            41
 #define MAX_LEVEL                                     60
@@ -177,6 +199,33 @@ struct weather_data
 };
 
 /*
+ * Channel types.
+ */
+#define CHAN_GOSSIP               0
+#define CHAN_AUCTION              1
+#define CHAN_QUESTION             2
+#define CHAN_ANSWER               3
+#define CHAN_QUOTE                4
+#define CHAN_GRATS                5
+#define CHAN_WIZ                  6
+#define CHAN_SHOUT                7
+#define CHAN_TELL                 8
+#define CHAN_REPLY                9
+#define CHAN_SAY                 10
+#define CHAN_GROUP               11
+#define CHAN_CLAN                12
+#define CHAN_YELL                13
+
+/*
+ * Languages. LANG_COMMON must be first, and LANG_UNKNOWN last.
+ */
+#define LANG_COMMON               0
+#define LANG_ELVEN                1
+#define LANG_DWARVEN              2
+#define LANG_GIANT                3
+#define LANG_UNKNOWN              4
+
+/*
  * Connected state for a channel.
  */
 #define CON_PLAYING               0
@@ -385,6 +434,7 @@ struct pc_race_type                     
     int                     stats[MAX_STATS];          /* starting stats */
     int                     max_stats[MAX_STATS];      /* maximum stats */
     int                     size;                      /* aff bits for the race */
+    int                     lang;                      /* default language for race */
 };
 
 /*
@@ -1349,6 +1399,7 @@ struct char_data
     int                     sex;
     int                     iclass;
     int                     race;
+    int                     speaking;                  /* current language */
     int                     level;
     int                     trust;
     int                     played;
@@ -1883,6 +1934,16 @@ struct social_type
 };
 
 /*
+ * Drunk struct
+ */
+struct drunken_slur_type
+{
+    int                     min_drunk;
+    int	                    rep_count;
+    const char	           *replacement[11];
+};
+
+/*
  * We've switched from crypt() to sha256_crypt() to avoid
  * issues with some systems having crypt, and others not having
  * it.  Rather than fight silly US export laws, we'll just use
diff -upN ./SVN_Comp01/Fire/src/tables.c ./SVN_Comp/Fire/src/tables.c
--- ./SVN_Comp01/Fire/src/tables.c	2009-01-11 23:13:16.000000000 -0500
+++ ./SVN_Comp/Fire/src/tables.c	2009-01-11 21:59:06.000000000 -0500
@@ -65,6 +65,447 @@ const struct clan_type  clan_table[MAX_C
     {"rom", "[  ROM  ] ", ROOM_VNUM_ALTAR, false}
 };
 
+/* for channels */
+const struct channel_type channel_table[] = {
+/* channel, outgoing, incoming, min position, blocking flag */
+    {CHAN_GOSSIP, "gossip", "gossip", "gossips", POS_SLEEPING, COMM_NOGOSSIP},
+    {CHAN_AUCTION, "auction", "auction", "auctions", POS_DEAD, COMM_NOAUCTION},
+    {CHAN_QUESTION, "question", "question", "questions", POS_SLEEPING, COMM_NOQUESTION},
+    {CHAN_ANSWER, "answer", "answer", "answers", POS_SLEEPING, COMM_NOQUESTION},
+    {CHAN_QUOTE, "quote", "quote", "quotes", POS_SLEEPING, COMM_NOQUOTE},
+    {CHAN_GRATS, "grats", "grats", "grats", POS_SLEEPING, COMM_NOGRATS},
+    {CHAN_WIZ, "immtell", "godspeak", "godspeaks", POS_DEAD, COMM_NOWIZ},
+    {CHAN_SHOUT, "shout", "shout", "shouts", POS_RESTING, COMM_SHOUTSOFF},
+    {CHAN_TELL, "tell", "tell", "tells you", POS_DEAD, COMM_DEAF},
+    {CHAN_REPLY, "reply", "tell", "tells you", POS_DEAD, COMM_DEAF},
+    {CHAN_SAY, "say", "say", "says", POS_RESTING, -1},
+    {CHAN_GROUP, "gtell", "tell your group", "tells the group", POS_SLEEPING, -1},
+    {CHAN_CLAN, "clan", "clan", "clans", POS_DEAD, COMM_NOCLAN},
+    {CHAN_YELL, "yell", "yell", "yells", POS_RESTING, -1},
+    {0, NULL, NULL, NULL, 0, -1}
+};
+
+const struct lang_word_type lang_word_table[LANG_UNKNOWN][MAX_LANG_WORDS] = {
+    {
+    {NULL, NULL}
+    },
+    
+    {
+    {"above", "ar"},
+    {"adamantine", "atamar"},
+    {"after", "deshu"},
+    {"air", "drii"},
+    {"ale", "irasku"},
+    {"and", "ent"},
+    {"animal", "tarine"},
+    {"armor", "hithar"},
+    {"arrow", "elandi"},
+    {"axe", "shaalth"},
+    {"bag", "esk"},
+    {"battle", "enyor"},
+    {"beautiful", "lani"},
+    {"before", "kesha"},
+    {"behind", "lothos"},
+    {"below", "saaden"},
+    {"beside", "ausa"},
+    {"big", "ary"},
+    {"black", "cerlyn"},
+    {"blossom", "ilphu"},
+    {"blue", "tha"},
+    {"bow", "athel"},
+    {"branch", "kathan"},
+    {"bread", "kulaa"},
+    {"breeze", "nai"},
+    {"bribe", "kukisha"},
+    {"brook", "sain"},
+    {"but", "ieha"},
+    {"cave", "sanerek"},
+    {"celestial", "surinya"},
+    {"city", "benerel"},
+    {"cleric", "surnar"},
+    {"clothing", "tenya"},
+    {"courage", "arranaseer"},
+    {"bravery", "arranaseer"},
+    {"cowardice", "reloseer"},
+    {"dance", "quar"},
+    {"danger", "daquin"},
+    {"dark", "nevae"},
+    {"darkvision", "nevaedarn"},
+    {"day", "noresh"},
+    {"deity", "arsurinya"},
+    {"demon", "karask"},
+    {"dew", "holi"},
+    {"diamond", "mion"},
+    {"die", "mor"},
+    {"dragon", "hakarmaskannar"},
+    {"dwarf", "erkatam"},
+    {"earth", "erek"},
+    {"elf", "kesir"},
+    {"enemy", "hakar"},
+    {"evil", "vaarn"},
+    {"far", "noarun"},
+    {"few", "ennamar"},
+    {"fire", "maskan"},
+    {"flee", "sekkar"},
+    {"flower", "ama"},
+    {"food", "klatha"},
+    {"for", "nesh"},
+    {"forest", "ravan"},
+    {"friend", "revanthas"},
+    {"frond", "lia"},
+    {"gem", "kiir"},
+    {"give", "yewl"},
+    {"gnome", "sharatam"},
+    {"go", "shan"},
+    {"gold", "scient"},
+    {"good", "thar"},
+    {"green", "chas"},
+    {"halfling", "sherekir"},
+    {"hate", "drag"},
+    {"heal", "faenya"},
+    {"heel", "meli"},
+    {"home", "enial"},
+    {"horse", "heriryar"},
+    {"human", "bhen"},
+    {"in", "aul"},
+    {"inn", "scennal"},
+    {"iron", "mault"},
+    {"king", "cor"},
+    {"leather", "anharad"},
+    {"light", "lvae"},
+    {"luck", "staleen"},
+    {"magic", "lerret"},
+    {"many", "rell"},
+    {"meat", "klathmor"},
+    {"mithral", "mithral"},
+    {"mithril", "mithril"},
+    {"moon", "nodel"},
+    {"mountain", "silath"},
+    {"name", "lahr"},
+    {"near", "tham"},
+    {"night", "lo"},
+    {"no", "neh"},
+    {"nor", "nars"},
+    {"oak", "amne"},
+    {"on", "arta"},
+    {"one", "enna"},
+    {"or", "quin"},
+    {"orc", "hakavarn"},
+    {"peace", "adon"},
+    {"petal", "xilo"},
+    {"rain", "alushtasa"},
+    {"red", "harsan"},
+    {"rest", "revar"},
+    {"rope", "jharren"},
+    {"scroll", "lersaat"},
+    {"silver", "don"},
+    {"small", "sarash"},
+    {"smart", "kekuel"},
+    {"so", "desha"},
+    {"song", "hinue"},
+    {"soul", "quarlani"},
+    {"speak", "hinual"},
+    {"star", "stacia"},
+    {"steel", "maskaulat"},
+    {"stone", "diir"},
+    {"stop", "neshanas"},
+    {"stupid", "kessuk"},
+    {"sword", "kerym"},
+    {"take", "teshuel"},
+    {"theif", "leshere"},
+    {"through", "eshaal"},
+    {"to", "nae"},
+    {"tomb", "morenial"},
+    {"tomorrow", "belath"},
+    {"travel", "sehan"},
+    {"tree", "lath"},
+    {"true", "avae"},
+    {"ugly", "biir"},
+    {"undead", "mormhaor"},
+    {"under", "ernath"},
+    {"war", "keryth"},
+    {"water", "alus"},
+    {"we", "quen"},
+    {"weapon", "kerymeth"},
+    {"whisper", "gala"},
+    {"white", "ivae"},
+    {"wine", "iasa"},
+    {"with", "faer"},
+    {"wood", "rilis"},
+    {"year", "ashanelath"},
+    {"yellow", "thuen"},
+    {"yes", "avavaen"},
+    {"yet", "aeleth"},
+    {"you", "nehel"},
+    {"midgaard", "midgaard"},
+    {"thalos", "thalos"},
+    {"ofcol", "ofcol"},
+    {"mota", "mota"},
+    {NULL, NULL}
+    },
+
+    {
+    {"behind", "abat"},
+    {"yet", "aglot"},
+    {"air", "alf"},
+    {"silver", "ang"},
+    {"mithral", "angdor"},
+    {"chest", "argul"},
+    {"water", "aun"},
+    {"gold", "aur"},
+    {"ale", "auraun"},
+    {"inn", "aurdrukar"},
+    {"night", "azan"},
+    {"you", "bak"},
+    {"red", "bar"},
+    {"above", "bel"},
+    {"demon", "braut"},
+    {"celestial", "darsam"},
+    {"mustard", "deg"},
+    {"spice", "deg"},
+    {"strong", "dek"},
+    {"evil", "der"},
+    {"on", "dews"},
+    {"near", "dog"},
+    {"beside", "dogos"},
+    {"iron", "dor"},
+    {"anvil", "dormark"},
+    {"king", "dornar"},
+    {"city", "drukafaren"},
+    {"home", "drukar"},
+    {"smart", "dug"},
+    {"shield", "dur"},
+    {"dragon", "durgarn"},
+    {"dwarf", "dwar"},
+    {"clan", "dwarkar"},
+    {"hammer", "ews"},
+    {"big", "far"},
+    {"rope", "farl"},
+    {"year", "farrenglos"},
+    {"scroll", "flos"},
+    {"leather", "frul"},
+    {"horse", "frulbraut"},
+    {"animal", "frus"},
+    {"battle", "ged"},
+    {"peace", "gelm"},
+    {"danger", "gend"},
+    {"day", "glos"},
+    {"after", "glot"},
+    {"gnome", "gnur"},
+    {"go", "gos"},
+    {"meat", "gost"},
+    {"poison", "gren"},
+    {"beard", "grim"},
+    {"steel", "grum"},
+    {"adamantine", "grumdek"},
+    {"good", "gul"},
+    {"luck", "gullend"},
+    {"heal", "gulm"},
+    {"call", "gund"},
+    {"green", "gurn"},
+    {"tree", "gurnvos"},
+    {"forest", "gurnvosen"},
+    {"halfling", "heng"},
+    {"to", "her"},
+    {"travel", "hergos"},
+    {"through", "hermot"},
+    {"take", "horlem"},
+    {"cleric", "horm"},
+    {"rain", "hren"},
+    {"few", "hrot"},
+    {"one", "hrun"},
+    {"name", "hrunnar"},
+    {"human", "hurm"},
+    {"giant", "hurmfar"},
+    {"many", "jor"},
+    {"for", "kagel"},
+    {"give", "kaglem"},
+    {"darkvision", "kanazan"},
+    {"far", "kar"},
+    {"scout", "karakan"},
+    {"tomorrow", "karglos"},
+    {"below", "kel"},
+    {"glitter", "khun"},
+    {"bright", "khun"},
+    {"bread", "klar"},
+    {"food", "klos"},
+    {"ugly", "kos"},
+    {"bag", "kurm"},
+    {"enemy", "kurn"},
+    {"war", "kurnzarn"},
+    {"in", "kurs"},
+    {"we", "lar"},
+    {"earth", "lu"},
+    {"black", "mag"},
+    {"undead", "magmornder"},
+    {"true", "mal"},
+    {"mountain", "mar"},
+    {"stop", "marn"},
+    {"rune", "marnak"},
+    {"magic", "marnarn"},
+    {"clothing", "marrur"},
+    {"friend", "mer"},
+    {"under", "mord"},
+    {"die", "morn"},
+    {"tomb", "mornludrukar"},
+    {"no", "mos"},
+    {"but", "mosk"},
+    {"stupid", "mulg"},
+    {"yes", "murg"},
+    {"stone", "nae"},
+    {"cave", "naeborn"},
+    {"bravery", "nar"},
+    {"white", "ney"},
+    {"with", "nos"},
+    {"gem", "nur"},
+    {"sword", "nus"},
+    {"axe", "nyr"},
+    {"armor", "og"},
+    {"elf", "olv"},
+    {"orc", "ork"},
+    {"speak", "rem"},
+    {"song", "remarn"},
+    {"weapon", "ros"},
+    {"spear", "rosh"},
+    {"bow", "tang"},
+    {"arrow", "tanthanus"},
+    {"fire", "tel"},
+    {"forge", "telormar"},
+    {"small", "than"},
+    {"rest", "thanamorn"},
+    {"dance", "thannergos"},
+    {"beautiful", "then"},
+    {"thief", "thos"},
+    {"greed", "thost"},
+    {"before", "toglot"},
+    {"soul", "tor"},
+    {"deity", "torfarn"},
+    {"cowardice", "valdar"},
+    {"flee", "valergos"},
+    {"bribe", "valkag"},
+    {"loyal", "var"},
+    {"so", "vas"},
+    {"and", "vel"},
+    {"nor", "velmos"},
+    {"blue", "vol"},
+    {"wood", "vos"},
+    {"yellow", "yar"},
+    {"midgaard", "midgaard"},
+    {"thalos", "thalos"},
+    {"ofcol", "ofcol"},
+    {"mota", "mota"},
+    {NULL, NULL}
+    },
+
+    {
+    {NULL, NULL}
+    }
+
+};
+
+const struct lang_letter_type lang_letter_table[LANG_UNKNOWN][26] = {
+    /* common */
+    {
+    {"a", "a"},
+    {"b", "b"},
+    {"c", "c"},
+    {"d", "d"},
+    {"e", "e"},
+    {"f", "f"},
+    {"g", "g"},
+    {"h", "h"},
+    {"i", "i"},
+    {"j", "j"},
+    {"k", "k"},
+    {"l", "l"},
+    {"m", "m"},
+    {"n", "n"},
+    {"o", "o"},
+    {"p", "p"},
+    {"q", "q"},
+    {"r", "r"},
+    {"s", "s"},
+    {"t", "t"},
+    {"u", "u"},
+    {"v", "v"},
+    {"w", "w"},
+    {"x", "x"},
+    {"y", "y"},
+    {"z", "z"}
+    },
+    /* elven */
+    {
+    {"a", "il"},
+    {"b", "f"},
+    {"c", "ny"},
+    {"d", "w"},
+    {"e", "a"},
+    {"f", "o"},
+    {"g", "v"},
+    {"h", "ir"},
+    {"i", "e"},
+    {"j", "qu"},
+    {"k", "n"},
+    {"l", "c"},
+    {"m", "s"},
+    {"n", "l"},
+    {"o", "e"},
+    {"p", "ty"},
+    {"q", "h"},
+    {"r", "m"},
+    {"s", "la"},
+    {"t", "an"},
+    {"u", "y"},
+    {"v", "el"},
+    {"w", "am"},
+    {"x", "'"},
+    {"y", "a"},
+    {"z", "j"}
+    },
+    /* dwarven */
+    {
+    {"a", "az"},
+    {"b", "po"},
+    {"c", "zi"},
+    {"d", "t"},
+    {"e", "a"},
+    {"f", "wa"},
+    {"g", "k"},
+    {"h", "'"},
+    {"i", "a"},
+    {"j", "dr"},
+    {"k", "g"},
+    {"l", "n"},
+    {"m", "l"},
+    {"n", "r"},
+    {"o", "ur"},
+    {"p", "rh"},
+    {"q", "k"},
+    {"r", "h"},
+    {"s", "th"},
+    {"t", "k"},
+    {"u", "'"},
+    {"v", "g"},
+    {"w", "zh"},
+    {"x", "q"},
+    {"y", "o"},
+    {"z", "j"}
+    },
+
+    {
+    {NULL, NULL}
+    }
+};
+
+const struct language_type language_table[] = {
+    {LANG_COMMON, "common"},
+    {LANG_ELVEN, "elven"},
+    {LANG_DWARVEN, "dwarven"},
+    {LANG_GIANT, "giant"},
+    {LANG_UNKNOWN, "unknown"},
+    {-1, NULL}
+};
+
 /* for position */
 const struct position_type position_table[] = {
     {"dead", "dead"},
@@ -641,22 +1082,22 @@ const struct pc_race_type pc_race_table[
     {
      "human", "Human", 0, {100, 100, 100, 100},
      {""},
-     {13, 13, 13, 13, 13}, {18, 18, 18, 18, 18}, SIZE_MEDIUM},
+     {13, 13, 13, 13, 13}, {18, 18, 18, 18, 18}, SIZE_MEDIUM, LANG_COMMON},
 
     {
      "elf", " Elf ", 5, {100, 125, 100, 120},
      {"sneak", "hide"},
-     {12, 14, 13, 15, 11}, {16, 20, 18, 21, 15}, SIZE_SMALL},
+     {12, 14, 13, 15, 11}, {16, 20, 18, 21, 15}, SIZE_SMALL, LANG_ELVEN},
 
     {
      "dwarf", "Dwarf", 8, {150, 100, 125, 100},
      {"berserk"},
-     {14, 12, 14, 10, 15}, {20, 16, 19, 14, 21}, SIZE_MEDIUM},
+     {14, 12, 14, 10, 15}, {20, 16, 19, 14, 21}, SIZE_MEDIUM, LANG_DWARVEN},
 
     {
      "giant", "Giant", 6, {200, 150, 150, 105},
      {"bash", "fast healing"},
-     {16, 11, 13, 11, 14}, {22, 15, 18, 15, 20}, SIZE_LARGE}
+     {16, 11, 13, 11, 14}, {22, 15, 18, 15, 20}, SIZE_LARGE, LANG_GIANT}
 };
 
 /*
@@ -1189,6 +1630,64 @@ const struct liq_type   liq_table[] = {
     {NULL, NULL, {0, 0, 0, 0, 0}}
 };
 
+const struct drunken_slur_type drunken_slur_table[] =
+  {
+    {3, 10,
+     {"a", "a", "a", "A", "aa", "ah", "Ah", "ao", "aw", "oa", "ahhhh"}},
+    {8, 5,
+     {"b", "b", "b", "B", "B", "vb"}},
+    {3, 5,
+     {"c", "c", "C", "cj", "sj", "zj"}},
+    {5, 2,
+     {"d", "d", "D"}},
+    {3, 3,
+     {"e", "e", "eh", "E"}},
+    {4, 5,
+     {"f", "f", "ff", "fff", "fFf", "F"}},
+    {8, 2,
+     {"g", "g", "G"}},
+    {9, 6,
+     {"h", "h", "hh", "hhh", "Hhh", "HhH", "H"}},
+    {7, 6,
+     {"i", "i", "Iii", "ii", "iI", "Ii", "I"}},
+    {9, 5,
+     {"j", "j", "jj", "Jj", "jJ", "J"}},
+    {7, 2,
+     {"k", "k", "K"}},
+    {3, 2,
+     {"l", "l", "L"}},
+    {5, 8,
+     {"m", "m", "mm", "mmm", "mmmm", "mmmmm", "MmM", "mM", "M"}},
+    {6, 6,
+     {"n", "n", "nn", "Nn", "nnn", "nNn", "N"}},
+    {3, 6,
+     {"o", "o", "ooo", "ao", "aOoo", "Ooo", "ooOo"}},
+    {3, 2,
+     {"p", "p", "P"}},
+    {5, 5,
+     {"q", "q", "Q", "ku", "ququ", "kukeleku"}},
+    {4, 2,
+     {"r", "r", "R"}},
+    {2, 5,
+     {"s", "ss", "zzZzssZ", "ZSssS", "sSzzsss", "sSss"}},
+    {5, 2,
+     {"t", "t", "T"}},
+    {3, 6,
+     {"u", "u", "uh", "Uh", "Uhuhhuh", "uhU", "uhhu"}},
+    {4, 2,
+     {"v", "v", "V"}},
+    {4, 2,
+     {"w", "w", "W"}},
+    {5, 6,
+     {"x", "x", "X", "ks", "iks", "kz", "xz"}},
+    {3, 2,
+     {"y", "y", "Y"}},
+    {2, 9,
+     {"z", "z", "ZzzZz", "Zzz", "Zsszzsz", "szz", "sZZz", "ZSz", "zZ", "Z"}},
+    {0, 0, {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}}
+  };
+
+
 /*
  * The skill and spell table.
  * Slot numbers must never be changed as they appear in #OBJECTS sections.
@@ -2022,12 +2528,37 @@ struct skill_type       skill_table[MAX_
      spell_null, TAR_IGNORE, POS_STANDING,
      NULL, SLOT( 133 ), 0, 12,
      "", "!Wands!", ""},
-
     {
      "recall", {1, 1, 1, 1}, {2, 2, 2, 2},
      spell_null, TAR_IGNORE, POS_STANDING,
      NULL, SLOT( 134 ), 0, 12,
-     "", "!Recall!", ""}
+     "", "!Recall!", ""},
+
+    {
+     "common comprehension", {1, 1, 1, 1}, {3, 3, 4, 4},
+     spell_null, TAR_IGNORE, POS_SLEEPING,
+     NULL, SLOT( 135 ), 0, 0,
+     "", "!Common Comprehension!", ""},
+
+    {
+     "elven comprehension", {1, 1, 1, 1}, {3, 3, 4, 4},
+     spell_null, TAR_IGNORE, POS_SLEEPING,
+     NULL, SLOT( 136 ), 0, 0,
+     "", "!Elven Comprehension!", ""},
+
+    {
+     "dwarven comprehension", {1, 1, 1, 1}, {3, 3, 5, 5},
+     spell_null, TAR_IGNORE, POS_SLEEPING,
+     NULL, SLOT( 137 ), 0, 0,
+     "", "!Dwarven Comprehension!", ""},
+
+    {
+     "giant comprehension", {1, 1, 1, 1}, {3, 3, 5, 5},
+     spell_null, TAR_IGNORE, POS_SLEEPING,
+     NULL, SLOT( 138 ), 0, 0,
+     "", "!Giant Comprehension!", ""},
+
+    
 };
 
 const struct group_type group_table[MAX_GROUP] = {
@@ -2899,6 +3430,61 @@ int clan_lookup( const char *name )
     return 0;
 }
 
+int channel_lookup( int channel )
+{
+    int                     chanidx = 0;
+
+    for ( chanidx = 0; channel_table[chanidx].name != NULL; chanidx++ )
+    {
+        if ( channel == channel_table[chanidx].channel )
+            return chanidx;
+    }
+
+    return -1;
+}
+
+int channel_lookup( const char *name )
+{
+    int                     chanidx = 0;
+
+    for ( chanidx = 0; channel_table[chanidx].name != NULL; chanidx++ )
+    {
+        if ( LOWER( name[0] ) == LOWER( channel_table[chanidx].name[0] )
+             && !str_prefix( name, channel_table[chanidx].name ) )
+            return chanidx;
+    }
+
+    return -1;
+}
+
+int language_lookup( int language )
+{
+    int                     langidx = 0;
+
+    for ( langidx = 0; language_table[langidx].name != NULL; langidx++ )
+    {
+        if ( language == language_table[langidx].language )
+            return langidx;
+    }
+
+    return -1;
+}
+
+int language_lookup( const char *name )
+{
+    int                     langidx = 0;
+
+    for ( langidx = 0; language_table[langidx].name != NULL; langidx++ )
+    {
+        if ( LOWER( name[0] ) == LOWER( language_table[langidx].name[0] )
+             && !str_prefix( name, language_table[langidx].name ) )
+            return langidx;
+    }
+
+    return -1;
+}
+
+
 int position_lookup( const char *name )
 {
     int                     pos = 0;
diff -upN ./SVN_Comp01/Fire/src/tables.h ./SVN_Comp/Fire/src/tables.h
--- ./SVN_Comp01/Fire/src/tables.h	2009-01-11 23:13:16.000000000 -0500
+++ ./SVN_Comp/Fire/src/tables.h	2009-01-11 02:05:48.000000000 -0500
@@ -44,6 +44,34 @@ struct clan_type
     bool                    independent;               /* true for loners */
 };
 
+struct channel_type
+{
+    int                     channel; // CHAN_ defines in merc.h
+    const char             *name;
+    const char             *outgoing_verb;
+    const char             *incoming_verb;
+    int                     min_pos;
+    int                     blocking_flag;
+};
+
+struct lang_word_type
+{
+    const char *word;
+    const char *foreign_word;
+};
+
+struct lang_letter_type
+{
+    const char *letter;
+    const char *foreign_letter;
+};
+
+struct language_type
+{
+    int language;
+    const char *name;
+};
+
 struct position_type
 {
     const char             *name;
@@ -74,6 +102,8 @@ struct bit_type
 
 /* game tables */
 extern const struct clan_type clan_table[MAX_CLAN];
+extern const struct channel_type channel_table[];
+extern const struct language_type language_table[];
 extern const struct position_type position_table[];
 extern const struct sex_type sex_table[];
 extern const struct size_type size_table[];
@@ -116,6 +146,9 @@ extern const struct liq_type liq_table[]
 extern struct skill_type skill_table[MAX_SKILL];
 extern const struct group_type group_table[MAX_GROUP];
 extern const char      *title_table[MAX_CLASS][MAX_LEVEL + 1][2];
+extern const struct drunken_slur_type drunken_slur_table[];
+extern const struct lang_word_type lang_word_table[LANG_UNKNOWN][MAX_LANG_WORDS];
+extern const struct lang_letter_type lang_letter_table[LANG_UNKNOWN][26];
 
 /* This is for OLC */
 extern const struct flag_stat_type flag_stat_table[];
@@ -142,6 +175,10 @@ extern const struct bit_type bitvector_t
 int                     flag_lookup( const char *name,
                                      const struct flag_type *flag_table );
 int                     clan_lookup( const char *name );
+int                     channel_lookup( int channel );
+int                     channel_lookup( const char *name );
+int                     language_lookup( int language );
+int                     language_lookup( const char *name );
 int                     position_lookup( const char *name );
 int                     sex_lookup( const char *name );
 int                     size_lookup( const char *name );