diff --git a/sql/examples/ha_archive.cc b/sql/examples/ha_archive.cc
index 851044050243419d077d8d1089c89c4d28ab6fd7..7a0c957e5c3c22de03ead1814d83b9705ae36010 100644
--- a/sql/examples/ha_archive.cc
+++ b/sql/examples/ha_archive.cc
@@ -136,7 +136,7 @@ static HASH archive_open_tables;
 #define ARCHIVE_CHECK_HEADER 254 // The number we use to determine corruption
 
 /* dummy handlerton - only to have something to return from archive_db_init */
-static handlerton archive_hton = {
+handlerton archive_hton = {
   "archive",
   0,       /* slot */
   0,       /* savepoint size. */
diff --git a/sql/examples/ha_example.cc b/sql/examples/ha_example.cc
index dfc2fa7a2601a0e9d594b95dfb2af1c12d52de00..cc4ad3eb535db8d9aa41b3fec85420b3a35a7901 100644
--- a/sql/examples/ha_example.cc
+++ b/sql/examples/ha_example.cc
@@ -73,7 +73,7 @@
 #include "ha_example.h"
 
 
-static handlerton example_hton= {
+handlerton example_hton= {
   "CSV",
   0,       /* slot */
   0,       /* savepoint size. */
diff --git a/sql/examples/ha_tina.cc b/sql/examples/ha_tina.cc
index 5c3cbdcf2ca82fdbf50c3eba914a616de16e432e..e01cc7cc980292bf194fd845fd874e4cc8c57233 100644
--- a/sql/examples/ha_tina.cc
+++ b/sql/examples/ha_tina.cc
@@ -54,7 +54,7 @@ pthread_mutex_t tina_mutex;
 static HASH tina_open_tables;
 static int tina_init= 0;
 
-static handlerton tina_hton= {
+handlerton tina_hton= {
   "CSV",
   0,       /* slot */
   0,       /* savepoint size. */
diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc
index b8a779c08cf319a30c21c207f538addd32882f7b..2f47b03de9d92371d36ff3875c80caad76b1d16c 100644
--- a/sql/ha_berkeley.cc
+++ b/sql/ha_berkeley.cc
@@ -107,7 +107,7 @@ static int berkeley_close_connection(THD *thd);
 static int berkeley_commit(THD *thd, bool all);
 static int berkeley_rollback(THD *thd, bool all);
 
-static handlerton berkeley_hton = {
+handlerton berkeley_hton = {
   "BerkeleyDB",
   0, /* slot */
   0, /* savepoint size */
diff --git a/sql/ha_blackhole.cc b/sql/ha_blackhole.cc
index a287d6e446bd1805136d48556a5edff9e1fcebf9..f089b67d678e88b44938679a8b693277cad1026a 100644
--- a/sql/ha_blackhole.cc
+++ b/sql/ha_blackhole.cc
@@ -26,7 +26,7 @@
 
 /* Blackhole storage engine handlerton */
 
-static handlerton blackhole_hton= {
+handlerton blackhole_hton= {
   "BLACKHOLE",
   0,       /* slot */
   0,       /* savepoint size. */
diff --git a/sql/ha_federated.cc b/sql/ha_federated.cc
index 2590e7881a4ac86bbc81a2fdb43335a4cf136c77..d83b047d75a30573e01154b65005acce45871c38 100644
--- a/sql/ha_federated.cc
+++ b/sql/ha_federated.cc
@@ -693,7 +693,7 @@ error:
 
 /* Federated storage engine handlerton */
 
-static handlerton federated_hton= {
+handlerton federated_hton= {
   "FEDERATED",
   0,       /* slot */
   0,       /* savepoint size. */
diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc
index 94ee3f8e6567dfec94db237c8edc1d866c80a8e3..fafd597e858c172a23798e71d856c941663f4236 100644
--- a/sql/ha_heap.cc
+++ b/sql/ha_heap.cc
@@ -23,7 +23,7 @@
 #include <myisampack.h>
 #include "ha_heap.h"
 
-static handlerton heap_hton= {
+handlerton heap_hton= {
   "MEMORY",
   0,       /* slot */
   0,       /* savepoint size. */
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index 4ed5fadb60333bcd764102744e5206fb8a2c81d8..491aaf5a226aaa877fb5c6e9cc16183d3c5d9715 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -206,7 +206,7 @@ static int innobase_rollback_to_savepoint(THD* thd, void *savepoint);
 static int innobase_savepoint(THD* thd, void *savepoint);
 static int innobase_release_savepoint(THD* thd, void *savepoint);
 
-static handlerton innobase_hton = {
+handlerton innobase_hton = {
   "InnoDB",
   0,				/* slot */
   sizeof(trx_named_savept_t),	/* savepoint size. TODO: use it */
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc
index 8f3970d69e6f7325f67000b6d22d1adaae6ea99e..bd4717eb02fbe4a25b1c4bdf6787c64f01e71da7 100644
--- a/sql/ha_myisam.cc
+++ b/sql/ha_myisam.cc
@@ -46,7 +46,7 @@ TYPELIB myisam_recover_typelib= {array_elements(myisam_recover_names)-1,"",
 
 /* MyISAM handlerton */
 
-static handlerton myisam_hton= {
+handlerton myisam_hton= {
   "MyISAM",
   0,       /* slot */
   0,       /* savepoint size. */
diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc
index f92717e11eb02ce31647fd252f5725de98ab4720..8347dcdaa3e11f288e2a12da2a344991e3f581cc 100644
--- a/sql/ha_myisammrg.cc
+++ b/sql/ha_myisammrg.cc
@@ -34,8 +34,8 @@
 
 /* MyISAM MERGE handlerton */
 
-static handlerton myisammrg_hton= {
-  "MRG_MyISAM",
+handlerton myisammrg_hton= {
+  "MRG_MYISAM",
   0,       /* slot */
   0,       /* savepoint size. */
   NULL,    /* close_connection */
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index ff631ac9db8aa643b621f964fdd59e75d22c778d..f069db09382cac38942e3085bd1cbdc03e7baf10 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -49,7 +49,7 @@ static int ndbcluster_close_connection(THD *thd);
 static int ndbcluster_commit(THD *thd, bool all);
 static int ndbcluster_rollback(THD *thd, bool all);
 
-static handlerton ndbcluster_hton = {
+handlerton ndbcluster_hton = {
   "ndbcluster",
   0, /* slot */
   0, /* savepoint size */
diff --git a/sql/handler.cc b/sql/handler.cc
index b3754891d05aef1bb2092cafb9f4fa12eb176927..543d4a5877cdbcd44896dac09c63c91510830cc3 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -27,31 +27,44 @@
 #include "ha_myisammrg.h"
 #ifdef HAVE_BERKELEY_DB
 #include "ha_berkeley.h"
+extern handlerton berkeley_hton;
 #endif
 #ifdef HAVE_BLACKHOLE_DB
 #include "ha_blackhole.h"
+extern handlerton blackhole_hton;
 #endif
 #ifdef HAVE_EXAMPLE_DB
 #include "examples/ha_example.h"
+extern handlerton example_hton;
 #endif
 #ifdef HAVE_ARCHIVE_DB
 #include "examples/ha_archive.h"
+extern handlerton archive_hton;
 #endif
 #ifdef HAVE_CSV_DB
 #include "examples/ha_tina.h"
+extern handlerton tina_hton;
 #endif
 #ifdef HAVE_INNOBASE_DB
 #include "ha_innodb.h"
+extern handlerton innobase_hton;
 #endif
 #ifdef HAVE_NDBCLUSTER_DB
 #include "ha_ndbcluster.h"
+extern handlerton ndbcluster_hton;
 #endif
 #ifdef HAVE_FEDERATED_DB
 #include "ha_federated.h"
+extern handlerton federated_hton;
 #endif
 #include <myisampack.h>
 #include <errno.h>
 
+extern handlerton myisam_hton;
+extern handlerton myisammrg_hton;
+extern handlerton heap_hton;
+
+
 	/* static functions defined in this file */
 
 static SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES;
@@ -66,46 +79,53 @@ ulong total_ha_2pc;
 /* size of savepoint storage area (see ha_init) */
 ulong savepoint_alloc_size;
 
+/*
+  This structure will go away with loadable storeage engines, we will instead
+  build it dynamically from the configure script.
+*/
 struct show_table_type_st sys_table_types[]=
 {
   {"MyISAM",	&have_yes,
-   "Default engine as of MySQL 3.23 with great performance", DB_TYPE_MYISAM},
+   "Default engine as of MySQL 3.23 with great performance", DB_TYPE_MYISAM,
+   NULL},
   {"MEMORY",	&have_yes,
-   "Hash based, stored in memory, useful for temporary tables", DB_TYPE_HEAP},
-  {"HEAP",	&have_yes,
-   "Alias for MEMORY", DB_TYPE_HEAP},
-  {"MERGE",	&have_yes,
-   "Collection of identical MyISAM tables", DB_TYPE_MRG_MYISAM},
-  {"MRG_MYISAM",&have_yes,
-   "Alias for MERGE", DB_TYPE_MRG_MYISAM},
+   "Hash based, stored in memory, useful for temporary tables", DB_TYPE_HEAP,
+   NULL},
+  {"MRG_MYISAM",	&have_yes,
+   "Collection of identical MyISAM tables", DB_TYPE_MRG_MYISAM, NULL},
   {"ISAM",	&have_isam,
-   "Obsolete storage engine, now replaced by MyISAM", DB_TYPE_ISAM},
+   "Obsolete storage engine, now replaced by MyISAM", DB_TYPE_ISAM, NULL},
   {"MRG_ISAM",  &have_isam,
-   "Obsolete storage engine, now replaced by MERGE", DB_TYPE_MRG_ISAM},
+   "Obsolete storage engine, now replaced by MERGE", DB_TYPE_MRG_ISAM, NULL},
   {"InnoDB",	&have_innodb,
-   "Supports transactions, row-level locking, and foreign keys", DB_TYPE_INNODB},
-  {"INNOBASE",	&have_innodb,
-   "Alias for INNODB", DB_TYPE_INNODB},
-  {"BDB",	&have_berkeley_db,
-   "Supports transactions and page-level locking", DB_TYPE_BERKELEY_DB},
-  {"BERKELEYDB",&have_berkeley_db,
-   "Alias for BDB", DB_TYPE_BERKELEY_DB},
+   "Supports transactions, row-level locking, and foreign keys", DB_TYPE_INNODB,
+   NULL},
+  {"BERKELEYDB",	&have_berkeley_db,
+   "Supports transactions and page-level locking", DB_TYPE_BERKELEY_DB, NULL},
   {"NDBCLUSTER", &have_ndbcluster,
-   "Clustered, fault-tolerant, memory-based tables", DB_TYPE_NDBCLUSTER},
-  {"NDB", &have_ndbcluster,
-   "Alias for NDBCLUSTER", DB_TYPE_NDBCLUSTER},
+   "Clustered, fault-tolerant, memory-based tables", DB_TYPE_NDBCLUSTER, NULL},
   {"EXAMPLE",&have_example_db,
-   "Example storage engine", DB_TYPE_EXAMPLE_DB},
+   "Example storage engine", DB_TYPE_EXAMPLE_DB, NULL},
   {"ARCHIVE",&have_archive_db,
-   "Archive storage engine", DB_TYPE_ARCHIVE_DB},
+   "Archive storage engine", DB_TYPE_ARCHIVE_DB, NULL},
   {"CSV",&have_csv_db,
-   "CSV storage engine", DB_TYPE_CSV_DB},
+   "CSV storage engine", DB_TYPE_CSV_DB, NULL},
   {"FEDERATED",&have_federated_db,
-   "Federated MySQL storage engine", DB_TYPE_FEDERATED_DB},
+   "Federated MySQL storage engine", DB_TYPE_FEDERATED_DB, NULL},
   {"BLACKHOLE",&have_blackhole_db,
    "/dev/null storage engine (anything you write to it disappears)",
-   DB_TYPE_BLACKHOLE_DB},
-  {NullS, NULL, NullS, DB_TYPE_UNKNOWN}
+   DB_TYPE_BLACKHOLE_DB, NULL},
+  {NullS, NULL, NullS, DB_TYPE_UNKNOWN, NULL}
+};
+
+struct show_table_alias_st sys_table_aliases[]=
+{
+  {"INNOBASE",	"InnoDB", NULL },
+  {"NDB", "NDBCLUSTER", NULL},
+  {"BDB", "BERKELEYDB", NULL},
+  {"HEAP", "MEMORY", NULL},
+  {"MERGE", "MRG_MYISAM", NULL},
+  {NullS, NullS, NULL}
 };
 
 const char *ha_row_type[] = {
@@ -124,16 +144,27 @@ uint known_extensions_id= 0;
 enum db_type ha_resolve_by_name(const char *name, uint namelen)
 {
   THD *thd= current_thd;
+  show_table_alias_st *table_alias;
+  show_table_type_st *types;
+
   if (thd && !my_strcasecmp(&my_charset_latin1, name, "DEFAULT")) {
     return (enum db_type) thd->variables.table_type;
   }
 
-  show_table_type_st *types;
   for (types= sys_table_types; types->type; types++)
   {
     if (!my_strcasecmp(&my_charset_latin1, name, types->type))
       return (enum db_type) types->db_type;
   }
+
+  /*
+    We check for the historical aliases next.
+  */
+  for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
+  {
+    if (!my_strcasecmp(&my_charset_latin1, name, table_alias->alias) && table_alias->st)
+      return (enum db_type) table_alias->st->db_type;
+  }
   return DB_TYPE_UNKNOWN;
 }
 
@@ -361,80 +392,165 @@ int ha_init()
 {
   int error= 0;
   handlerton **ht= handlertons;
+  show_table_type_st *types;
+  show_table_alias_st *table_alias;
   total_ha= savepoint_alloc_size= 0;
 
   if (ha_init_errors())
     return 1;
 
-  if (opt_bin_log)
+  for (types= sys_table_types; types->type; types++)
   {
-    if (!(*ht= binlog_init()))                  // Always succeed
-    {
-      mysql_bin_log.close(LOG_CLOSE_INDEX);     // Never used
-      opt_bin_log= 0;                           // Never used
-      error= 1;                                 // Never used
-    }
-    else
-      ha_was_inited_ok(ht++);
-  }
+    switch (types->db_type) {
+    case DB_TYPE_HEAP:
+      types->ht= &heap_hton;
+      for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
+      {
+        if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
+          table_alias->st= types;
+      }
+      break;
+    case DB_TYPE_MYISAM:
+      types->ht= &myisam_hton;
+      break;
+    case DB_TYPE_MRG_MYISAM:
+      types->ht= &myisammrg_hton;
+      for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
+      {
+        if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
+          table_alias->st= types;
+      }
+      break;
 #ifdef HAVE_BERKELEY_DB
-  if (have_berkeley_db == SHOW_OPTION_YES)
-  {
-    if (!(*ht= berkeley_init()))
-    {
-      have_berkeley_db= SHOW_OPTION_DISABLED;	// If we couldn't use handler
-      error= 1;
-    }
-    else
-      ha_was_inited_ok(ht++);
-  }
+    case DB_TYPE_BERKELEY_DB:
+      if (have_berkeley_db == SHOW_OPTION_YES)
+      {
+        if (!(*ht= berkeley_init()))
+        {
+          have_berkeley_db= SHOW_OPTION_DISABLED;	// If we couldn't use handler
+          error= 1;
+        }
+        else
+        {
+          types->ht= &berkeley_hton;
+          for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
+          {
+            if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
+              table_alias->st= types;
+          }
+          ha_was_inited_ok(ht++);
+        }
+      }
+      break;
 #endif
 #ifdef HAVE_INNOBASE_DB
-  if (have_innodb == SHOW_OPTION_YES)
-  {
-    if (!(*ht= innobase_init()))
-    {
-      have_innodb= SHOW_OPTION_DISABLED;	// If we couldn't use handler
-      error= 1;
-    }
-    else
-      ha_was_inited_ok(ht++);
-  }
+    case DB_TYPE_INNODB:
+      if (have_innodb == SHOW_OPTION_YES)
+      {
+        if (!(*ht= innobase_init()))
+        {
+          have_innodb= SHOW_OPTION_DISABLED;	// If we couldn't use handler
+          error= 1;
+        }
+        else
+        {
+          ha_was_inited_ok(ht++);
+          types->ht= &innobase_hton;
+          for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
+          {
+            if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
+              table_alias->st= types;
+          }
+        }
+      }
+      break;
 #endif
 #ifdef HAVE_NDBCLUSTER_DB
-  if (have_ndbcluster == SHOW_OPTION_YES)
-  {
-    if (!(*ht= ndbcluster_init()))
-    {
-      have_ndbcluster= SHOW_OPTION_DISABLED;
-      error= 1;
-    }
-    else
-      ha_was_inited_ok(ht++);
-  }
+    case DB_TYPE_NDBCLUSTER:
+      if (have_ndbcluster == SHOW_OPTION_YES)
+      {
+        if (!(*ht= ndbcluster_init()))
+        {
+          have_ndbcluster= SHOW_OPTION_DISABLED;
+          error= 1;
+        }
+        else
+        {
+          ha_was_inited_ok(ht++);
+          types->ht= &ndbcluster_hton;
+          for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
+          {
+            if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
+              table_alias->st= types;
+          }
+        }
+      }
+      break;
+#endif
+#ifdef HAVE_EXAMPLE_DB
+    case DB_TYPE_EXAMPLE_DB:
+      types->ht= &example_hton;
+      break;
+#endif
+#ifdef HAVE_ARCHIVE_DB
+    case DB_TYPE_ARCHIVE_DB:
+      if (have_archive_db == SHOW_OPTION_YES)
+      {
+        if (!(*ht= archive_db_init()))
+        {
+          have_archive_db= SHOW_OPTION_DISABLED;
+          error= 1;
+        }
+        else
+        {
+          ha_was_inited_ok(ht++);
+          types->ht= &archive_hton;
+        }
+      }
+      break;
+#endif
+#ifdef HAVE_CSV_DB
+    case DB_TYPE_CSV_DB,:
+      types->ht= &tina_hton;
+      break;
 #endif
 #ifdef HAVE_FEDERATED_DB
-  if (have_federated_db == SHOW_OPTION_YES)
-  {
-    if (federated_db_init())
-    {
-      have_federated_db= SHOW_OPTION_DISABLED;
-      error= 1;
+    case DB_TYPE_FEDERATED_DB:
+      if (have_federated_db == SHOW_OPTION_YES)
+      {
+        if (federated_db_init())
+        {
+          have_federated_db= SHOW_OPTION_DISABLED;
+          error= 1;
+        }
+        else 
+        {
+          types->ht= &federated_hton;
+        }
+      }
+      break;
+#endif
+#ifdef HAVE_BLACKHOLE_DB
+    case DB_TYPE_BLACKHOLE_DB:
+      types->ht= &blackhole_hton;
+      break;
+#endif
+    default:
+      types->ht= NULL;
     }
   }
-#endif
-#ifdef HAVE_ARCHIVE_DB
-  if (have_archive_db == SHOW_OPTION_YES)
+
+  if (opt_bin_log)
   {
-    if (!(*ht= archive_db_init()))
+    if (!(*ht= binlog_init()))                  // Always succeed
     {
-      have_archive_db= SHOW_OPTION_DISABLED;
-      error= 1;
+      mysql_bin_log.close(LOG_CLOSE_INDEX);     // Never used
+      opt_bin_log= 0;                           // Never used
+      error= 1;                                 // Never used
     }
     else
       ha_was_inited_ok(ht++);
   }
-#endif
   DBUG_ASSERT(total_ha < MAX_HA);
   /*
     Check if there is a transaction-capable storage engine besides the
diff --git a/sql/handler.h b/sql/handler.h
index f1f9ab904d1b19866c64c5faae0de4bcdec51d2e..bd558894a27e425d117b3df1a934f96fcf765099 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -177,13 +177,6 @@ enum db_type
   DB_TYPE_DEFAULT // Must be last
 };
 
-struct show_table_type_st {
-  const char *type;
-  SHOW_COMP_OPTION *value;
-  const char *comment;
-  enum db_type db_type;
-};
-
 enum row_type { ROW_TYPE_NOT_USED=-1, ROW_TYPE_DEFAULT, ROW_TYPE_FIXED,
 		ROW_TYPE_DYNAMIC, ROW_TYPE_COMPRESSED,
 		ROW_TYPE_REDUNDANT, ROW_TYPE_COMPACT };
@@ -363,6 +356,20 @@ typedef struct
    uint32 flags;                                /* global handler flags */
 } handlerton;
 
+struct show_table_type_st {
+  const char *type;
+  SHOW_COMP_OPTION *value;
+  const char *comment;
+  enum db_type db_type;
+  handlerton *ht;
+};
+
+struct show_table_alias_st {
+  const char *alias;
+  const char *type;
+  show_table_type_st *st;
+};
+
 /* Possible flags of a handlerton */
 #define HTON_NO_FLAGS 0
 #define HTON_CLOSE_CURSORS_AT_COMMIT 1