diff --git a/Docs/manual.texi b/Docs/manual.texi
index 0a1215ec791e7bdd346626dab937b1ad95aad738..13df8e1eda4404db4b85bd6c01d748a3cac3ce6a 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -1826,7 +1826,7 @@ Apart from the following links, you can find and download a lot of
 @strong{MySQL} programs, tools and APIs from the
 @uref{http://www.mysql.com/Contrib/, Contrib directory}.
 
-@subheading Tutorials
+@subheading Tutorials and manuals
 @itemize @bullet
 
 @c just forwards to the devshed link below.. (jcole)
@@ -1839,6 +1839,8 @@ Beginners @strong{MySQL} Tutorial on how to install and set up
 
 @item @uref{http://www.devshed.com/Server_Side/MySQL/, A lot of @strong{MySQL} tutorials}
 
+@item @uref{http://mysql.hitstar.com/, MySQL manual in Chinise}.
+
 @item @uref{http://www.linuxplanet.com/linuxplanet/tutorials/1046/1/,
 Setting Up a @strong{MySQL}-Based Website}
 
@@ -1925,6 +1927,9 @@ A Win32 GUI client by David Ecker.
 @uref{http://www.icaap.org/software/kiosk/, Kiosk; a @strong{MySQL} client for
 database management}. Written in Perl. Will be a part of Bazaar.
 @item
+@uref{http://home.skif.net/~voland/zeos/eng/index.html, Zeos client}
+A client that supports @strong{MySQL}, Interbase and PostgreSQL.
+@item
 @uref{http://www.geocities.com/SiliconValley/Ridge/4280/GenericReportWriter/grwhome.html, A free report writer in Java}
 @item
 @uref{http://www.javaframework.de,MySQLExport}
@@ -2461,7 +2466,7 @@ carefully and make sure that all the information described here is included
 in your report.
 
 If you can make a test case which clearly shows the bug, you should post
-it to the @email{bugs@@list.mysql.com} list. Note that on this list you
+it to the @email{bugs@@lists.mysql.com} list. Note that on this list you
 should only post a full, repeatable bug report, using the @code{mysqlbug}
 script (if you are running on Windows, you should include a
 description of the operating system and the @strong{MySQL} version).
@@ -5477,6 +5482,22 @@ you are probably using @code{gcc} (or using an old binary compiled with
 /usr/bin/perl: can't resolve symbol '__divdi3'
 @end example
 
+If you get the following error from @code{Msql-Mysql-modules},
+when you run the tests:
+
+@example
+t/00base............install_driver(mysql) failed: Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.
+@end example
+
+it means that you need to include the compression library, -lz, to the
+link line. This can be done by changing the line:
+$sysliblist .= " -lm";
+to
+$sysliblist .= " -lm -lz";
+in file lib/DBD/mysql/Install.pm in the Msql-Mysql-modules directory.
+After this, you MUST run 'make realclean' and then proceed with the
+installation from the beginning.
+
 Add @code{-L/usr/lib/gcc-lib/... -lgcc} to the link command when the
 @file{mysql.so} library gets built (check the output from @code{make} for
 @file{mysql.so} when you compile the Perl client).  The @code{-L} option
@@ -11618,7 +11639,7 @@ to restart @code{mysqld} with @code{--skip-grant-tables} to be able to run
 * DROP TABLE::                  @code{DROP TABLE} syntax
 * OPTIMIZE TABLE::              @code{OPTIMIZE TABLE} syntax
 * CHECK TABLE::                 @code{CHECK TABLE} syntax
-* ANALYZE TABLE::               
+* ANALYZE TABLE::               @code{ANALYZE TABLE} syntax
 * REPAIR TABLE::                @code{REPAIR TABLE} syntax
 * DELETE::                      @code{DELETE} syntax
 * SELECT::                      @code{SELECT} syntax
@@ -16856,6 +16877,9 @@ The command returns a table with the following columns:
 You can check the stored key distribution with the @code{SHOW INDEX} command.
 @xref{SHOW DATABASE INFO}.
 
+If the table hasn't changed since the last @code{ANALYZE TABLE} command,
+the table will not be analyzed again.
+
 @findex REPAIR TABLE
 @node REPAIR TABLE, DELETE, ANALYZE TABLE, Reference
 @section @code{REPAIR TABLE} syntax
@@ -34517,7 +34541,7 @@ Python module with caching. By @email{gandalf@@rosmail.com}.
 @item @uref{http://www.mysql.com/Downloads/Contrib/MySQLmodule-1.4.tar.gz, MySQLmodule-1.4.tar.gz}
 Python interface for @strong{MySQL}. By Joseph Skinner @email{joe@@earthlight.co.nz};  Modified by Joerg Senekowitsch @email{senekow@@ibm.net}
 
-@item @uref{http://www.mysql.com/Downloads/Contrib/mysql_mex_1_1.tar.gz, mysql_mex_1_1.tar.gz}
+@item @uref{http://www.mysql.com/Downloads/Contrib/mysql_mex_1_1b.tar.gz, mysql_mex_1_1b.tar.gz}
 An interface program for the Matlab program by MathWorks.  The interface
 is done by Kimmo Uutela and John Fisher (not by Mathworks).
 Check @uref{http://boojum.hut.fi/~kuutela/mysqlmex.html,mysqlmex.html}
@@ -34594,7 +34618,7 @@ have still some bugs. you can test the program with all features. Please
 send bugs and hints to Marco Suess @email{ms@@it-netservice.de}. Original
 URL @url{http://www.it-netservice.de/pages/software/index.html}.
 
-@item @uref{http://www.mysql.com/Downloads/Win32/admin13.exe,Atronic's @strong{MySQL} client for Win32 1.3.0.0} and @uref{http://www.mysql.com/Downloads/Win32/admin13.readme,Atronic's @strong{MySQL} client readme}.
+@item @uref{http://www.mysql.com/Downloads/Win32/ARTADMIN201.EXE,Atronic's @strong{MySQL} client for Win32 2.0.1.0}.
 Home page for this can be found at: @uref{http://www.artronic.hr}.
 @item @uref{http://www.mysql.com/Downloads/Win32/W9xstop.zip,Utility from Artronic to stop MySQL on win9x}
 
@@ -34620,7 +34644,7 @@ A query tool for @strong{MySQL} and PostgreSQL.
 A query tool written in Perl. Uses DBI and Tk.
 @item @uref{http://www.mysql.com/Downloads/Contrib/mascon1.exe, mascon1.exe}
 You can get the newest one from
-@uref{http://www.SciBit.com,http://www.SciBit.com}.
+@uref{http://www.scibit.com/Products/Software/Utils/Mascon.asp,Mascon.asp}.
 @item @uref{http://www.virtualbeer.net/dbui/,DBUI}
 DBUI is a Gtk graphical database editor.
 @end itemize
@@ -35352,6 +35376,12 @@ Fixed that BDB tables work on part keys.
 @item
 Check table now updates key statistics for the table.
 @item
+@code{ANALYZE TABLE} will now only update tables that has been changed
+since last @code{ANALYZE}. Note that this is a new feature and tables
+will not be marked to be analyzed until they are updated in any way with
+3.23.23 or newer.  For older tables, you have to do @code{CHECK TABLE}
+to update the key distribution.
+@item
 Added @code{CHANGE MASTER TO} command
 @item
 Added @code{FAST}, @code{QUICK} @code{EXTENDED} check types to
diff --git a/myisam/ft_eval.c b/myisam/ft_eval.c
index 6739e631d8cd62321f317255cb37fa7c4b1ab1b2..d094f128ba4783ee6bbdba1c9096602f7ef1c842 100644
--- a/myisam/ft_eval.c
+++ b/myisam/ft_eval.c
@@ -1,15 +1,12 @@
 /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
-
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
-
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
diff --git a/myisam/mi_locking.c b/myisam/mi_locking.c
index 24a23bda7e2d1efc30e7f5771c59e9f0df85e498..c6fc8736145968a825db1c867d5e7dee2b858d50 100644
--- a/myisam/mi_locking.c
+++ b/myisam/mi_locking.c
@@ -407,9 +407,10 @@ int _mi_mark_file_changed(MI_INFO *info)
 {
   char buff[3];
   register MYISAM_SHARE *share=info->s;
-  if (!share->state.changed || ! share->global_changed)
+  if (!(share->state.changed & STATE_CHANGED) || ! share->global_changed)
   {
-    share->state.changed|=1;
+    share->state.changed|=(STATE_CHANGED | STATE_NOT_ANALYZED |
+			   STATE_NOT_OPTIMIZED_KEYS);
     if (!share->global_changed)
     {
       share->global_changed=1;
diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h
index e1263c89ff5cf6277bdd8d47eae758b152de7a58..bd100437c3572ceca88023566cc54630990224bc 100644
--- a/myisam/myisamdef.h
+++ b/myisam/myisamdef.h
@@ -78,7 +78,7 @@ typedef struct st_mi_state_info
   time_t check_time;			/* Time for last check */
   uint	sortkey;			/* sorted by this key  (not used) */
   uint open_count;
-  bool changed;				/* Changed since isamchk */
+  uint8 changed;			/* Changed since myisamchk */
   my_off_t rec_per_key_rows;		/* Rows when calculating rec_per_key */
   ulong *rec_per_key_part;
 
@@ -279,14 +279,24 @@ struct st_myisam_info {
 #define WRITEINFO_UPDATE_KEYFILE	1
 #define WRITEINFO_NO_UNLOCK		2
 
+	/* bits in state.changed */
+
+#define STATE_CHANGED		1
+#define STATE_CRASHED		2
+#define STATE_CRASHED_ON_REPAIR 4 
+#define STATE_NOT_ANALYZED	8
+#define STATE_NOT_OPTIMIZED_KEYS 16
+#define STATE_NOT_SORTED_PAGES	32
+
+
 #define mi_getint(x)	((uint) mi_uint2korr(x) & 32767)
 #define mi_putint(x,y,nod) { uint16 boh=(nod ? (uint16) 32768 : 0) + (uint16) (y);\
 			  mi_int2store(x,boh); }
 #define mi_test_if_nod(x) (x[0] & 128 ? info->s->base.key_reflength : 0)
-#define mi_mark_crashed(x) (x)->s->state.changed|=2
-#define mi_mark_crashed_on_repair(x) (x)->s->state.changed|=4+2
-#define mi_is_crashed(x) ((x)->s->state.changed & 2)
-#define mi_is_crashed_on_repair(x) ((x)->s->state.changed & 4)
+#define mi_mark_crashed(x) (x)->s->state.changed|=STATE_CRASHED
+#define mi_mark_crashed_on_repair(x) (x)->s->state.changed|=STATE_CRASHED|STATE_CRASHED_ON_REPAIR
+#define mi_is_crashed(x) ((x)->s->state.changed & STATE_CRASHED)
+#define mi_is_crashed_on_repair(x) ((x)->s->state.changed & STATE_CRASHED_ON_REPAIR)
 
 /* Functions to store length of space packed keys, VARCHAR or BLOB keys */
 
diff --git a/myisam/myisampack.c b/myisam/myisampack.c
index 23d7f4949940d61cdf0d865db957d79f1401cc03..fbb543152f8f87cd4d504dc8c23b60b978a74b8c 100644
--- a/myisam/myisampack.c
+++ b/myisam/myisampack.c
@@ -2078,7 +2078,7 @@ static int save_state_mrg(File file,MRG_INFO *mrg,my_off_t new_length,
   state.checksum=crc;
   if (isam_file->s->base.keys)
     isamchk_neaded=1;
-  state.changed=1;				/* Force one check of table */
+  state.changed=STATE_CHANGED | STATE_NOT_ANALYZED; /* Force check of table */
   DBUG_RETURN (mi_state_info_write(file,&state,1+2));
 }