diff -uprN -x *.o ../src/.cvsignore.orig ./.cvsignore.orig
--- ../src/.cvsignore.orig	Tue Oct 28 23:16:17 1997
+++ ./.cvsignore.orig	Wed Dec 31 18:00:00 1969
@@ -1,3 +0,0 @@
-conf.h
-.accepted
-Makefile
diff -uprN -x *.o ../src/act.informative.c ./act.informative.c
--- ../src/act.informative.c	Mon Dec 29 12:55:19 1997
+++ ./act.informative.c	Mon Dec 29 21:36:24 1997
@@ -495,7 +495,7 @@ char *find_exdesc(char *word, struct ext
  */
 void look_at_target(struct char_data * ch, char *arg, int read)
 {
-  int bits, found = 0, j, msg;
+  int bits, found = 0, j, msg=1;
   struct char_data *found_char = NULL;
   struct obj_data *obj = NULL, *found_obj = NULL;
   char *desc;
@@ -531,7 +531,12 @@ void look_at_target(struct char_data * c
       if (isname(number, "board bulletin")) {
         Board_show_board(GET_OBJ_VNUM(obj), ch);
       }
-      else if (!isdigit(*number) || (!(msg = atoi(number)))) {
+       /* Okay, here i'm faced with the fact that the person could be
+	entering in something like 'read 5' or 'read 4.mail' .. so, whats the
+	difference between the two?  Well, there's a period in the second,
+	so, we'll just stick with that basic difference */
+      else if ((!isdigit(*number) || (!(msg = atoi(number)))) ||
+		(strchr(number,'.'))) {
         sprintf(arg,"%s %s", number,arg);
         look_at_target(ch, arg, 0);
       }
diff -uprN -x *.o ../src/boards.c ./boards.c
--- ../src/boards.c	Mon Dec 29 12:55:19 1997
+++ ./boards.c	Mon Dec 29 21:36:24 1997
@@ -38,9 +38,10 @@ void Board_init_boards(void) {
        }
 
 struct board_info_type * create_new_board(int board_vnum) {
-           extern struct board_info_type *board_info; 
+           extern struct board_info_type *board_info;
+           struct board_msg_info *bmsg;
 
-           int boards=0, t_messages=0, error=0, t[4], mnum, poster,timestamp;
+           int boards=0, t_messages=0, error=0, t[4], mnum, poster,timestamp,sflag;
            char buf[512];
            FILE *fl;
            struct board_info_type *temp_board=NULL, *old_board;
@@ -97,6 +98,10 @@ struct board_info_type * create_new_boar
                  sprintf(buf, "Erasing non-existant board file: %d",
 								board_vnum);
                  log(buf);
+		 sprintf(buf,"%s/%d",BOARD_DIRECTORY,board_vnum);
+                 unlink(buf);
+                 if(temp_board) 
+  		   free(temp_board);
                  return NULL;    /* realize why I do this yes? */
                }
                obj = read_object(real_object(board_vnum),REAL);
@@ -106,7 +111,9 @@ struct board_info_type * create_new_boar
                  REMOVE_LVL(temp_board)=GET_OBJ_VAL(obj, 2);	
 		 BOARD_MNUM(temp_board)=t[0];
                  BOARD_NEXT(temp_board)=NULL;
-               BOARD_MESSAGES(temp_board)=NULL;
+                 BOARD_MESSAGES(temp_board)=NULL;
+                 extract_obj(obj);
+
                if (error) {
                  sprintf(buf,"Parse error in board %d - attempting to continue\n",
   		   BOARD_VNUM(temp_board));
@@ -135,19 +142,45 @@ struct board_info_type * create_new_boar
                    /* this is the loop that reads the messages 
 			and also the message read info stuff */
                    if (*buf == 'S') {
+	/* Note, we assume that all messages are read in before the hash
+					memory lists */
                      sscanf(buf,"S %d %d %d ", &mnum, &poster, &timestamp);
                      CREATE(memboard, struct board_memory_type, 1);
                      MEMORY_READER(memboard)=poster;
                      MEMORY_TIMESTAMP(memboard)=timestamp;
-                     if(BOARD_MEMORY(temp_board,mnum)) {
-                       list=BOARD_MEMORY(temp_board,mnum);
-                       BOARD_MEMORY(temp_board,mnum)=memboard;
-                       MEMORY_NEXT(memboard)=list;
-                     }
-                     else {
-                       BOARD_MEMORY(temp_board,mnum)=memboard;
-                       MEMORY_NEXT(memboard)=NULL;
+
+		     bmsg=BOARD_MESSAGES(temp_board);
+		     sflag=0;
+			/* check and see if memory is still valid */
+
+		     while(bmsg && !sflag) {
+
+ 		       if(MESG_TIMESTAMP(bmsg) ==MEMORY_TIMESTAMP(memboard)
+			&& (mnum == ((MESG_TIMESTAMP(bmsg)%301 +
+				MESG_POSTER(bmsg)%301)%301))) {
+			   sflag=1;
+			  /* probably ought to put a flag saying that
+			     memory should be deleted because the reader
+			     no longer exists on the mud, but it will
+			     figure it out in a few iterations. Let it be 
+			     happy, and let me be lazy */
+		       }
+		       bmsg=MESG_NEXT(bmsg);
                      }
+	             if(sflag) {
+                       if(BOARD_MEMORY(temp_board,mnum)) {
+                         list=BOARD_MEMORY(temp_board,mnum);
+                         BOARD_MEMORY(temp_board,mnum)=memboard;
+                         MEMORY_NEXT(memboard)=list;
+                       }
+                       else {
+                         BOARD_MEMORY(temp_board,mnum)=memboard;
+                         MEMORY_NEXT(memboard)=NULL;
+                       }
+                    } else {
+		/* memory no longer in use */
+			free(memboard);
+	             }
                    } else if (*buf == '#') {
                      t_messages++;
                      parse_message(fl, temp_board);
@@ -325,7 +358,7 @@ int Board_display_msg(int board_vnum, st
   struct board_info_type *thisboard=board_info;
   struct board_msg_info *message;
   char *tmstr;
-  int msgcount,mem;
+  int msgcount,mem,sflag;
   char name[127];
   struct board_memory_type *mboard_type, *list;
  
@@ -376,10 +409,28 @@ int Board_display_msg(int board_vnum, st
   MEMORY_TIMESTAMP(mboard_type)=MESG_TIMESTAMP(message);
   MEMORY_NEXT(mboard_type)=NULL;
 
-  /* make sure that the slot is open, free */
+  /* Let's make sure that we don't already have this memory recorded */
+
   list=BOARD_MEMORY(thisboard,mem);
-  BOARD_MEMORY(thisboard,mem) = mboard_type;
-  MEMORY_NEXT(mboard_type)=list;
+  sflag=1;
+  while(list && sflag) {
+    if (MEMORY_READER(list) == MEMORY_READER(mboard_type) &&
+	MEMORY_TIMESTAMP(list) == MEMORY_TIMESTAMP(mboard_type)) {
+     /* nope, slot, reader, and timestamp equal, so already saved */
+      sflag=0;
+    }
+    list=MEMORY_NEXT(list);
+  }
+
+  if(sflag) {
+    list=BOARD_MEMORY(thisboard,mem);
+    BOARD_MEMORY(thisboard,mem) = mboard_type;
+    MEMORY_NEXT(mboard_type)=list;
+  }
+  else {
+    if(mboard_type) 
+      free(mboard_type);
+  }
        
 /* before we print out the message, we may as well restore a human
 				readable timestamp. */
@@ -507,15 +558,6 @@ int Board_save_board(int board_vnum) {
    /* now we write out the basic stats of the board */
 
   fprintf(fl,"Board File\n%d\n",BOARD_MNUM(thisboard));
-  /* now write out the saved info.. */
-  for(counter=0;counter!=301;counter++) {
-    memboard=BOARD_MEMORY(thisboard,counter);
-    while(memboard) {
-      fprintf(fl,"S%d %d %d\n",counter, MEMORY_READER(memboard), 
-		MEMORY_TIMESTAMP(memboard));
-      memboard=MEMORY_NEXT(memboard);
-    }
-  }
 
   for(message=BOARD_MESSAGES(thisboard);message;message=MESG_NEXT(message))
   {
@@ -523,12 +565,21 @@ int Board_save_board(int board_vnum) {
                "%ld\n"
                "%ld\n"
                "%s\n"
-               "%s\n"
-               "~\n",
+               "%s~\n",
                i, MESG_POSTER(message), MESG_TIMESTAMP(message),
                MESG_SUBJECT(message), MESG_DATA(message));  
     i++;
   }
+  /* now write out the saved info.. */
+  for(counter=0;counter!=301;counter++) {
+    memboard=BOARD_MEMORY(thisboard,counter);
+    while(memboard) {
+      fprintf(fl,"S%d %d %d\n",counter, MEMORY_READER(memboard), 
+		MEMORY_TIMESTAMP(memboard));
+      memboard=MEMORY_NEXT(memboard);
+    }
+  }
+
   fclose(fl);
   return 1;
 }
@@ -555,6 +606,9 @@ void Board_write_message(int board_vnum,
     return;
   }
 
+  if(!*arg || !arg)
+    sprintf(arg,"No Subject");
+  
   skip_spaces(&arg);
   delete_doubledollar(arg);
 
