diff --git a/database/database.pgsql b/database/database.pgsql
index 58649530cab3c1e8a0abb63b2d117ee92c9e72a8..317324bd80ca2b4919f9a3e16a46c95321d75502 100644
--- a/database/database.pgsql
+++ b/database/database.pgsql
@@ -86,17 +86,75 @@ CREATE TABLE boxes (
 );
 
 --
--- Table structure for bundle
+-- Table structure for table 'aggregator_category'
 --
 
-CREATE TABLE bundle (
-  bid SERIAL,
+CREATE TABLE aggregator_category (
+  cid serial,
   title varchar(255) NOT NULL default '',
-  attributes varchar(255) NOT NULL default '',
-  PRIMARY KEY  (bid),
+  description text NOT NULL,
+  block smallint NOT NULL default '0',
+  PRIMARY KEY  (cid),
+  UNIQUE (title)
+);
+
+--
+-- Table structure for table 'aggregator_category_feed'
+--
+
+CREATE TABLE aggregator_category_feed (
+  fid integer NOT NULL default '0',
+  cid integer NOT NULL default '0',
+  PRIMARY KEY  (fid,cid)
+);
+
+--
+-- Table structure for table 'aggregator_category_item'
+--
+
+CREATE TABLE aggregator_category_item (
+  iid integer NOT NULL default '0',
+  cid integer NOT NULL default '0',
+  PRIMARY KEY  (iid,cid)
+);
+
+--
+-- Table structure for table 'aggregator_feed'
+--
+
+CREATE TABLE aggregator_feed (
+  fid serial,
+  title varchar(255) NOT NULL default '',
+  url varchar(255) NOT NULL default '',
+  refresh integer NOT NULL default '0',
+  checked integer NOT NULL default '0',
+  link varchar(255) NOT NULL default '',
+  description text NOT NULL,
+  image text NOT NULL,
+  etag varchar(255) NOT NULL default '',
+  modified integer NOT NULL default '0',
+  block smallint NOT NULL default '0',
+  PRIMARY KEY  (fid),
+  UNIQUE (url),
   UNIQUE (title)
 );
 
+--
+-- Table structure for table 'aggregator_item'
+--
+
+CREATE TABLE aggregator_item (
+  iid integer NOT NULL auto_increment,
+  fid integer NOT NULL default '0',
+  title varchar(255) NOT NULL default '',
+  link varchar(255) NOT NULL default '',
+  author varchar(255) NOT NULL default '',
+  description text NOT NULL,
+  timestamp integer default NULL,
+  PRIMARY KEY  (iid)
+);
+
+
 --
 -- Table structure for cache
 --
@@ -145,27 +203,6 @@ CREATE TABLE directory (
   PRIMARY KEY  (link)
 );
 
---
--- Table structure for feed
---
-
-CREATE TABLE feed (
-  fid SERIAL,
-  title varchar(255) NOT NULL default '',
-  url varchar(255) NOT NULL default '',
-  refresh integer NOT NULL default '0',
-  checked integer NOT NULL default '0',
-  attributes varchar(255) NOT NULL default '',
-  link varchar(255) NOT NULL default '',
-  description text NOT NULL default '',
-  image text NOT NULL default '',
-  etag varchar(255) NOT NULL default '',
-  modified integer NOT NULL default '0',
-  PRIMARY KEY  (fid),
-  UNIQUE (title),
-  UNIQUE (url)
-);
-
 --
 -- Table structure for table 'filters'
 --
@@ -199,22 +236,6 @@ CREATE TABLE history (
   PRIMARY KEY  (uid,nid)
 );
 
---
--- Table structure for item
---
-
-CREATE TABLE item (
-  iid SERIAL,
-  fid integer NOT NULL default '0',
-  title varchar(255) NOT NULL default '',
-  link varchar(255) NOT NULL default '',
-  author varchar(255) NOT NULL default '',
-  description text NOT NULL default '',
-  timestamp integer NOT NULL default '0',
-  attributes varchar(255) NOT NULL default '',
-  PRIMARY KEY  (iid)
-);
-
 --
 -- Table structure for locales
 --
@@ -234,6 +255,21 @@ CREATE TABLE locales (
   PRIMARY KEY  (lid)
 );
 
+--
+-- Table structure for table 'menu'
+--
+
+CREATE TABLE menu (
+  mid integer NOT NULL default '0',
+  pid integer NOT NULL default '0',
+  path varchar(255) NOT NULL default '',
+  title varchar(255) NOT NULL default '',
+  weight smallint NOT NULL default '0',
+  visibility smallint NOT NULL default '0',
+  status smallint NOT NULL default '0',
+  PRIMARY KEY  (mid)
+);
+
 --
 -- Table structure for table 'moderation_filters'
 --
@@ -331,6 +367,35 @@ CREATE INDEX page_nid_idx ON page(nid);
 -- Table structure for table 'url_alias'
 --
 
+CREATE TABLE profile_fields (
+  fid serial,
+  title varchar(255) default NULL,
+  name varchar(128) default NULL,
+  explanation TEXT default NULL,
+  category varchar(255) default NULL,
+  page varchar(255) default NULL,
+  type varchar(128) default NULL,
+  weight smallint DEFAULT '0' NOT NULL,
+  required smallint DEFAULT '0' NOT NULL,
+  overview smallint DEFAULT '0' NOT NULL,
+  options text,
+  UNIQUE (name),
+  PRIMARY KEY (fid)
+);
+CREATE INDEX profile_fields_category ON profile_fields (category);
+
+--
+-- Table structure for table 'profile_values'
+--
+
+CREATE TABLE profile_values (
+  fid integer default '0',
+  uid integer default '0',
+  value text
+);
+CREATE INDEX profile_values_uid ON profile_values (uid);
+CREATE INDEX profile_values_fid ON profile_values (fid);
+
 CREATE TABLE url_alias (
   pid serial,
   dst varchar(128) NOT NULL default '',
diff --git a/database/updates.inc b/database/updates.inc
index e19ed3813253168d08bc90817346e8b86a10abb5..b96d298637c0a2e481890d3cb74d74f14033b63e 100644
--- a/database/updates.inc
+++ b/database/updates.inc
@@ -772,42 +772,17 @@ function update_79() {
 
 function update_80() {
 
-  // Add a 'created' field to the users table:
-  $ret[] = update_sql('ALTER TABLE {users} ADD created INT(11) NOT NULL');
-  $ret[] = update_sql('ALTER TABLE {users} CHANGE timestamp changed INT(11) NOT NULL');
 
-  // Add some indices to speed up the update process:
-  $ret[] = update_sql('ALTER TABLE {comments} ADD index (timestamp)');
-  $ret[] = update_sql('ALTER TABLE {node} ADD index (created)');
-
-  // Assign everyone a created timestamp to begin with:
-  $ret[] = update_sql("UPDATE {users} SET created = changed WHERE created = ''");
-
-  // Print a status message:"
-  print '<p>Note: this might take a while ...</p>';
-
-  // Try updating the user records using the comment table:
-  $result = db_query('SELECT DISTINCT(u.uid) FROM {comments} c LEFT JOIN {users} u ON c.uid = u.uid WHERE c.timestamp < u.created');
-  while ($account = db_fetch_object($result)) {
-    // Retrieve the proper timestamp:
-    $timestamp = db_result(db_query('SELECT MIN(timestamp) FROM {comments} WHERE uid = %d', $account->uid));
 
-    // Update this user record as well as older records with an older timestamp:
-    db_query('UPDATE {users} SET created = %d WHERE created > %d AND uid <= %d', $timestamp, $timestamp, $account->uid);
-  }
+  if ($GLOBALS["db_type"] == "mysql") {
+    // Add a 'created' field to the users table:
+    $ret[] = update_sql('ALTER TABLE {users} ADD created INT(11) NOT NULL');
+    $ret[] = update_sql('ALTER TABLE {users} CHANGE timestamp changed INT(11) NOT NULL');
 
-  // Try updating the user records using the node table:
-  $result = db_query('SELECT DISTINCT(u.uid) FROM {node} n LEFT JOIN {users} u ON n.uid = u.uid WHERE n.created < u.created');
-  while ($account = db_fetch_object($result)) {
-    // Retrieve the proper timestamp:
-    $timestamp = db_result(db_query('SELECT MIN(created) FROM {node} WHERE uid = %d', $account->uid));
 
-    // Update this user record as well as older records with an older timestamp:
-    db_query('UPDATE {users} SET created = %d WHERE created > %d AND uid <= %d', $timestamp, $timestamp, $account->uid);
-  }
 
-  // Add profile module related tables:
-  $ret[] = update_sql("CREATE TABLE {profile_fields} (
+    // Add profile module related tables:
+    $ret[] = update_sql("CREATE TABLE {profile_fields} (
     fid int(10) NOT NULL auto_increment,
     title varchar(255) default NULL,
     name varchar(128) default NULL,
@@ -822,84 +797,175 @@ function update_80() {
     PRIMARY KEY (fid)
    );");
 
-  $ret[] = update_sql("CREATE TABLE {profile_values} (
+    $ret[] = update_sql("CREATE TABLE {profile_values} (
     fid int(11) unsigned default '0',
     uid int(11) unsigned default '0',
     value text,
     KEY uid (uid),
     KEY fid (fid)
    );");
+    // Add some indices to speed up the update process:
+    $ret[] = update_sql('ALTER TABLE {comments} ADD index (timestamp)');
+    $ret[] = update_sql('ALTER TABLE {node} ADD index (created)');
+    // Assign everyone a created timestamp to begin with:
+    $ret[] = update_sql("UPDATE {users} SET created = changed WHERE created = ''");
+
+   }
+  else {// pgsql
+
+    $ret[] = update_sql('ALTER TABLE {users} RENAME timestamp TO changed');
+    $ret[] = update_sql('ALTER TABLE {users} ADD created integer');
+    $ret[] = update_sql('UPDATE {users} SET created = 0');
+    $ret[] = update_sql('ALTER TABLE {users} ALTER COLUMN created SET NOT NULL');
+    $ret[] = update_sql('ALTER TABLE {users} ALTER COLUMN created SET DEFAULT 0');
+    // Add profile module related tables:
+    $ret[] = update_sql("CREATE TABLE {profile_fields} (
+    fid serial,
+    title varchar(255) default NULL,
+    name varchar(128) default NULL,
+    explanation TEXT default NULL,
+    category varchar(255) default NULL,
+    type varchar(128) default NULL,
+    weight smallint DEFAULT '0' NOT NULL,
+    overview smallint DEFAULT '0' NOT NULL,
+    options text,
+    UNIQUE (name),
+    PRIMARY KEY (fid)
+  );");
+    $ret[] = update_sql("CREATE INDEX profile_fields_category ON {profile_fields} (category);");
+    $ret[] = update_sql("CREATE TABLE {profile_values} (
+    fid integer default '0',
+    uid integer default '0',
+    value text
+  );");
+    $ret[] = update_sql("CREATE INDEX profile_values_uid ON profile_values (uid);");
+    $ret[] = update_sql("CREATE INDEX profile_values_fid ON profile_values (fid);");
+
+  // Add some indices to speed up the update process:
+    $ret[] = update_sql('CREATE INDEX comments_timestamp ON {comments} (timestamp)');
+    $ret[] = update_sql('CREATE INDEX node_created on {node} (created)');
+    // Assign everyone a created timestamp to begin with:
+    $ret[] = update_sql("UPDATE {users} SET created = changed WHERE created = 0");
+
+  }
 
-  // Migrate the old profile data to the new scheme:
-  $fields = array(
-    array("Name", "realname", "textfield", NULL, 0),
-    array("Address", "address", "textfield", NULL, 0),
-    array("City", "city", "textfield", NULL, 0),
-    array("State, province or region", "state", "textfield", NULL, 0),
-    array("Zip or postal code", "zip", "textfield", NULL, 0),
-    array("Country", "country", "textfield", NULL, 1),
-    array("Gender", "gender", "selection", "male\nfemale", 1),
-    array("Job title", "job", "textfield", NULL, 0),
-    array("ICQ messenger ID", "icq", "textfield", NULL, 0),
-    array("MSN messenger ID", "msn", "textfield", NULL, 0),
-    array("Yahoo messenger ID", "yahoo", "textfield", NULL, 0),
-    array("AIM messenger ID", "aim", "textfield", NULL, 0),
-    array("URL of homepage", "homepage", "url", NULL, 1),
-    array("Biography", "biography", "textarea", NULL, 0),
-    array("Interests", "interests", "textarea", NULL, 0),
-    array("Public key", "publickey", "textarea", NULL, 0)
-  );
-
-  // Remove existing data (debug mode):
-  db_query('DELETE FROM {profile_fields}');
-  db_query('DELETE FROM {profile_values}');
-
-  foreach ($fields as $field) {
-    db_query("INSERT INTO {profile_fields} (title, name, type, category, options, overview) VALUES ('%s', '%s', '%s', 'Personal information', '%s', %d)", $field[0], $field[1], $field[2], $field[3], $field[4]);
-  }
-  db_query("ALTER TABLE {users} ADD picture varchar(255) NOT NULL DEFAULT ''");
-
-  $result = db_query("SELECT uid FROM {users}");
+
+  // Print a status message:"
+  print '<p>Note: this might take a while ...</p>';
+
+  // Try updating the user records using the comment table:
+  $result = db_query('SELECT DISTINCT(u.uid) FROM {comments} c LEFT JOIN {users} u ON c.uid = u.uid WHERE c.timestamp < u.created');
   while ($account = db_fetch_object($result)) {
-    // Load the user record:
-    $account = user_load(array('uid' => $account->uid));
-    $edit = array();
+    // Retrieve the proper timestamp:
+    $timestamp = db_result(db_query('SELECT MIN(timestamp) FROM {comments} WHERE uid = %d', $account->uid));
+    // Try updating the user records using the node table:
+    $result = db_query('SELECT DISTINCT(u.uid) FROM {node} n LEFT JOIN {users} u ON n.uid = u.uid WHERE n.created < u.created');
+    while ($account = db_fetch_object($result)) {
+      // Retrieve the proper timestamp:
+      $timestamp = db_result(db_query('SELECT MIN(created) FROM {node} WHERE uid = %d', $account->uid));
+
+      // Update this user record as well as older records with an older timestamp:
+      db_query('UPDATE {users} SET created = %d WHERE created > %d AND uid <= %d', $timestamp, $timestamp, $account->uid);
+    }
 
-    // Modify the user record:
-    foreach ($fields as $field) {
-      $old = "profile_". $field[1];
-      $new = $field[1];
-      if ($account->$old) {
-        $edit[$new] = $account->$old;
-      }
-      unset($account->$old);
+      // Update this user record as well as older records with an older timestamp:
+      db_query('UPDATE {users} SET created = %d WHERE created > %d AND uid <= %d', $timestamp, $timestamp, $account->uid);
     }
 
-    // Gender specific changes:
-    if ($edit['gender'] == 'f') $edit['gender'] = 'female';
-    if ($edit['gender'] == 'm') $edit['gender'] = 'male';
 
-    // Avatar specific changes:
-    if ($account->profile_avatar) {
-      $edit['picture'] = $account->profile_avatar;
+   // Migrate the old profile data to the new scheme:
+    $fields = array(
+        array("Name", "realname", "textfield", NULL, 0),
+        array("Address", "address", "textfield", NULL, 0),
+        array("City", "city", "textfield", NULL, 0),
+        array("State, province or region", "state", "textfield", NULL, 0),
+        array("Zip or postal code", "zip", "textfield", NULL, 0),
+        array("Country", "country", "textfield", NULL, 1),
+        array("Gender", "gender", "selection", "male\nfemale", 1),
+        array("Job title", "job", "textfield", NULL, 0),
+        array("ICQ messenger ID", "icq", "textfield", NULL, 0),
+        array("MSN messenger ID", "msn", "textfield", NULL, 0),
+        array("Yahoo messenger ID", "yahoo", "textfield", NULL, 0),
+        array("AIM messenger ID", "aim", "textfield", NULL, 0),
+        array("URL of homepage", "homepage", "url", NULL, 1),
+        array("Biography", "biography", "textarea", NULL, 0),
+        array("Interests", "interests", "textarea", NULL, 0),
+        array("Public key", "publickey", "textarea", NULL, 0)
+        );
+
+    // Remove existing data (debug mode):
+    db_query('DELETE FROM {profile_fields}');
+    db_query('DELETE FROM {profile_values}');
+
+    foreach ($fields as $field) {
+      db_query("INSERT INTO {profile_fields} (title, name, type, category, options, overview) VALUES ('%s', '%s', '%s', 'Personal information', '%s', %d)", $field[0], $field[1], $field[2], $field[3], $field[4]);
+    }
+    if ($GLOBALS["db_type"] == "mysql") {
+
+      db_query("ALTER TABLE {users} ADD picture varchar(255) NOT NULL DEFAULT ''");
+    }
+    else {
+      db_query("ALTER TABLE {users} ADD picture varchar(255)");
+      db_query("UPDATE {users} SET picture = ''");
+      db_query("ALTER TABLE {users} ALTER COLUMN picture SET NOT NULL");
+      db_query("ALTER TABLE {users} ALTER COLUMN picture SET DEFAULT ''");
     }
-    unset($account->profile_avatar);
 
-    // Save the update record:
-    user_save($account, $edit);
+    $result = db_query("SELECT uid FROM {users}");
+    while ($account = db_fetch_object($result)) {
+      // Load the user record:
+      $account = user_load(array('uid' => $account->uid));
+      $edit = array();
+
+      // Modify the user record:
+      foreach ($fields as $field) {
+  $old = "profile_". $field[1];
+  $new = $field[1];
+  if ($account->$old) {
+    $edit[$new] = $account->$old;
   }
+  unset($account->$old);
+      }
+
+      // Gender specific changes:
+      if ($edit['gender'] == 'f') $edit['gender'] = 'female';
+      if ($edit['gender'] == 'm') $edit['gender'] = 'male';
+
+      // Avatar specific changes:
+      if ($account->profile_avatar) {
+  $edit['picture'] = $account->profile_avatar;
+      }
+      unset($account->profile_avatar);
+
+      // Save the update record:
+      user_save($account, $edit);
+    }
 
   return $ret;
 }
 
 function update_81() {
-  $ret[] = update_sql('ALTER TABLE {profile_fields} ADD page varchar(255) default NULL');
+  if ($GLOBALS['db_type'] == 'mysql') {
+    $ret[] = update_sql('ALTER TABLE {profile_fields} ADD page varchar(255) default NULL');
+  }
+  else {
+    $ret[] = update_sql('ALTER TABLE {profile_fields} ADD page varchar(255)');
+    $ret[] = update_sql('ALTER TABLE {profile_fields} ALTER COLUMN page SET default NULL');
+  }
   $ret[] = update_sql("UPDATE {profile_fields} SET type = 'url' WHERE name = 'homepage'");
   return $ret;
 }
 
 function update_82() {
-  $ret[] = update_sql("ALTER TABLE {profile_fields} ADD required tinyint(1) DEFAULT '0' NOT NULL");
+  if ($GLOBALS['db_type'] == 'mysql') {
+    $ret[] = update_sql("ALTER TABLE {profile_fields} ADD required tinyint(1) DEFAULT '0' NOT NULL");
+  }
+  else {
+    $ret[] = update_sql("ALTER TABLE {profile_fields} ADD required smallint");
+    $ret[] = update_sql("ALTER TABLE {profile_fields} ALTER COLUMN required SET DEFAULT '0'");
+    $ret[] = update_sql("UPDATE {profile_fields} SET required = '0'");
+    $ret[] = update_sql("ALTER TABLE {profile_fields} ALTER COLUMN required SET NOT NULL");
+  }
   return $ret;
 }
 
@@ -916,10 +982,20 @@ function update_83() {
       status int(1) unsigned NOT NULL default '0',
       PRIMARY KEY  (mid)
      );");
-    $ret[] = update_sql("INSERT INTO sequences (name, id) VALUES ('menu_mid', 1)");
+    $ret[] = update_sql("INSERT INTO {sequences} (name, id) VALUES ('menu_mid', 1)");
   }
   else {
-    /* Needs PostgreSQL equivalent */
+    $ret[] = update_sql("CREATE TABLE menu (
+  mid integer NOT NULL default '0',
+  pid integer NOT NULL default '0',
+  path varchar(255) NOT NULL default '',
+  title varchar(255) NOT NULL default '',
+  weight smallint NOT NULL default '0',
+  visibility smallint NOT NULL default '0',
+  status smallint NOT NULL default '0',
+  PRIMARY KEY  (mid)
+);");
+
   }
   return $ret;
 }
@@ -927,10 +1003,13 @@ function update_83() {
 function update_84() {
   $ret = array();
   if ($GLOBALS["db_type"] == "mysql") {
-    $ret[] = update_sql("ALTER TABLE vocabulary ADD help VARCHAR(255) NOT NULL DEFAULT '' AFTER description;");
+    $ret[] = update_sql("ALTER TABLE {vocabulary} ADD help VARCHAR(255) NOT NULL DEFAULT '' AFTER description;");
   }
   else {
-    /* Needs PostgreSQL equivalent */
+    $ret[] = update_sql("ALTER TABLE {vocabulary} ADD help VARCHAR(255)");
+    $ret[] = update_sql("ALTER TABLE {vocabulary} ALTER help SET DEFAULT ''");
+    $ret[] = update_sql("UPDATE {vocabulary} SET help = ''");
+    $ret[] = update_sql("ALTER TABLE {vocabulary} ALTER help SET NOT NULL");
   }
   return $ret;
 }
@@ -966,7 +1045,32 @@ function update_85() {
      )");
   }
   else {
-    /* Needs PostgreSQL equivalent */
+    $ret[] = update_sql("ALTER TABLE {bundle} RENAME TO {aggregator_category}");
+    $ret[] = update_sql("ALTER TABLE {aggregator_category} DROP attributes");
+    $ret[] = update_sql("ALTER TABLE {aggregator_category} RENAME bid TO cid");
+    $ret[] = update_sql("ALTER TABLE {aggregator_category} ADD description text");
+    $ret[] = update_sql("UPDATE {aggregator_category} SET description = ''");
+    $ret[] = update_sql("ALTER TABLE {aggregator_category} ALTER COLUMN description SET NOT NULL");
+    $ret[] = update_sql("ALTER TABLE {feed} RENAME TO {aggregator_feed}");
+    $ret[] = update_sql("ALTER TABLE {aggregator_feed} DROP attributes");
+    $ret[] = update_sql("ALTER TABLE {aggregator_feed} ADD block smallint");
+    $ret[] = update_sql("UPDATE {aggregator_feed} SET block = 0");
+    $ret[] = update_sql("ALTER TABLE {aggregator_feed} ALTER COLUMN block SET NOT NULL");
+    $ret[] = update_sql("ALTER TABLE {aggregator_category} ADD block smallint");
+    $ret[] = update_sql("UPDATE {aggregator_category} SET block = 0");
+    $ret[] = update_sql("ALTER TABLE {aggregator_category} ALTER COLUMN block SET NOT NULL");
+    $ret[] = update_sql("ALTER TABLE {item} RENAME TO {aggregator_item}");
+    $ret[] = update_sql("ALTER TABLE {aggregator_item} DROP attributes");
+    $ret[] = update_sql("CREATE TABLE {aggregator_category_feed} (
+      fid integer NOT NULL default '0',
+      cid integer NOT NULL default '0',
+      PRIMARY KEY  (fid,cid)
+    );");
+    $ret[] = update_sql("CREATE TABLE {aggregator_category_item} (
+      iid integer NOT NULL default '0',
+      cid integer NOT NULL default '0',
+      PRIMARY KEY  (iid,cid)
+     )");
   }
   return $ret;
 }