diff --git a/modules/system/system.install b/modules/system/system.install
index f9d62e0c1525f3a165a61e87f1c7f2b5ca2434ac..fc83907fa192f0acb1b30005495b87525d7ee320 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -3289,72 +3289,6 @@ function system_update_1008() {
   return $ret;
 }
 
-function system_update_1009() {
- $ret = array();
- switch ($GLOBALS['db_type']) {
-   case 'mysql':
-   case 'mysqli':
-     $ret[] = update_sql("CREATE TABLE {cache_filter} (
-       cid varchar(255) NOT NULL default '',
-       data longblob,
-       expire int NOT NULL default '0',
-       created int NOT NULL default '0',
-       headers text,
-       PRIMARY KEY (cid),
-       INDEX expire (expire)
-     ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-     $ret[] = update_sql("CREATE TABLE {cache_menu} (
-       cid varchar(255) NOT NULL default '',
-       data longblob,
-       expire int NOT NULL default '0',
-       created int NOT NULL default '0',
-       headers text,
-       PRIMARY KEY (cid),
-       INDEX expire (expire)
-     ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-     $ret[] = update_sql("CREATE TABLE {cache_page} (
-       cid varchar(255) NOT NULL default '',
-       data longblob,
-       expire int NOT NULL default '0',
-       created int NOT NULL default '0',
-       headers text,
-       PRIMARY KEY (cid),
-       INDEX expire (expire)
-     ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-     break;
-   case 'pgsql':
-     $ret[] = update_sql("CREATE TABLE {cache_filter} (
-       cid varchar(255) NOT NULL default '',
-       data bytea,
-       expire int NOT NULL default '0',
-       created int NOT NULL default '0',
-       headers text,
-       PRIMARY KEY (cid)
-     )");
-     $ret[] = update_sql("CREATE TABLE {cache_menu} (
-       cid varchar(255) NOT NULL default '',
-       data bytea,
-       expire int NOT NULL default '0',
-       created int NOT NULL default '0',
-       headers text,
-       PRIMARY KEY (cid)
-     )");
-     $ret[] = update_sql("CREATE TABLE {cache_page} (
-       cid varchar(255) NOT NULL default '',
-       data bytea,
-       expire int NOT NULL default '0',
-       created int NOT NULL default '0',
-       headers text,
-       PRIMARY KEY (cid)
-     )");
-     $ret[] = update_sql("CREATE INDEX {cache_filter}_expire_idx ON {cache_filter} (expire)");
-     $ret[] = update_sql("CREATE INDEX {cache_menu}_expire_idx ON {cache_menu} (expire)");
-     $ret[] = update_sql("CREATE INDEX {cache_page}_expire_idx ON {cache_page} (expire)");
-     break;
- }
- return $ret;
-}
-
 function system_update_1010() {
   $ret = array();
 
diff --git a/update.php b/update.php
index d43c7845a62ed9802eb3f956caaafcb3c18892f8..3f18b26892780a45369a38770194dd8cf722166d 100644
--- a/update.php
+++ b/update.php
@@ -678,6 +678,83 @@ function update_convert_table_utf8($table) {
   return $ret;
 }
 
+/**
+ * Create tables for the split cache.
+ *
+ * This is part of the Drupal 4.7 to 5.0 migration.
+ */
+function update_create_cache_tables() {
+
+  // If cache_filter exists, update is not necessary
+  if (db_table_exists('cache_filter')) {
+    return;
+  }
+
+  $ret = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql("CREATE TABLE {cache_filter} (
+        cid varchar(255) NOT NULL default '',
+        data longblob,
+        expire int NOT NULL default '0',
+        created int NOT NULL default '0',
+        headers text,
+        PRIMARY KEY (cid),
+        INDEX expire (expire)
+      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
+      $ret[] = update_sql("CREATE TABLE {cache_menu} (
+        cid varchar(255) NOT NULL default '',
+        data longblob,
+        expire int NOT NULL default '0',
+        created int NOT NULL default '0',
+        headers text,
+        PRIMARY KEY (cid),
+        INDEX expire (expire)
+      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
+      $ret[] = update_sql("CREATE TABLE {cache_page} (
+        cid varchar(255) NOT NULL default '',
+        data longblob,
+        expire int NOT NULL default '0',
+         created int NOT NULL default '0',
+        headers text,
+        PRIMARY KEY (cid),
+        INDEX expire (expire)
+      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
+      break;
+    case 'pgsql':
+      $ret[] = update_sql("CREATE TABLE {cache_filter} (
+        cid varchar(255) NOT NULL default '',
+        data bytea,
+        expire int NOT NULL default '0',
+        created int NOT NULL default '0',
+        headers text,
+        PRIMARY KEY (cid)
+     )");
+     $ret[] = update_sql("CREATE TABLE {cache_menu} (
+       cid varchar(255) NOT NULL default '',
+       data bytea,
+       expire int NOT NULL default '0',
+       created int NOT NULL default '0',
+       headers text,
+       PRIMARY KEY (cid)
+     )");
+     $ret[] = update_sql("CREATE TABLE {cache_page} (
+       cid varchar(255) NOT NULL default '',
+       data bytea,
+       expire int NOT NULL default '0',
+       created int NOT NULL default '0',
+       headers text,
+       PRIMARY KEY (cid)
+     )");
+     $ret[] = update_sql("CREATE INDEX {cache_filter}_expire_idx ON {cache_filter} (expire)");
+     $ret[] = update_sql("CREATE INDEX {cache_menu}_expire_idx ON {cache_menu} (expire)");
+     $ret[] = update_sql("CREATE INDEX {cache_page}_expire_idx ON {cache_page} (expire)");
+     break;
+  }
+  return $ret;
+}
+
 // Some unavoidable errors happen because the database is not yet up-to-date.
 // Our custom error handler is not yet installed, so we just suppress them.
 ini_set('display_errors', FALSE);
@@ -691,6 +768,7 @@ function update_convert_table_utf8($table) {
 // This must happen *after* drupal_bootstrap(), since it calls
 // variable_(get|set), which only works after a full bootstrap.
 update_fix_access_table();
+update_create_cache_tables();
 
 // Turn error reporting back on. From now on, only fatal errors (which are
 // not passed through the error handler) will cause a message to be printed.