diff --git a/includes/comment.inc b/includes/comment.inc
index f7bea9ac6e4b830ce57f4ae6a329d2327edaddfd..0a8ea9e12205547db19f9feb0e97238d786b6b97 100644
--- a/includes/comment.inc
+++ b/includes/comment.inc
@@ -54,7 +54,10 @@ function comment_reply($pid, $id) {
     $item = db_fetch_object(db_query("SELECT comments.*, users.userid FROM comments LEFT JOIN users ON comments.author = users.id WHERE comments.cid = '$pid'"));
     comment_view(new Comment($item->userid, $item->subject, $item->comment, $item->timestamp, $item->url, $item->fake_email, comment_score($comment), $comment->votes, $item->cid, $item->lid), t("reply to this comment"));
   }
-  else $pid = 0;
+  else {
+    node_view(node_get_object(array("nid" => $id)));
+    $pid = 0;
+  }
 
   // Build reply form:
   $output .= "<FORM ACTION=\"$REQUEST_URI\" METHOD=\"post\">\n";
diff --git a/includes/common.inc b/includes/common.inc
index 581ab3558da2c634aa6534a904eec034c067d54a..a60ca32362c0089d2548693208027bf087767fdc 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -258,7 +258,6 @@ function page_footer() {
 $conf = conf_init();
 
 include_once "includes/$conf.php";
-include_once "includes/structure.inc";
 include_once "includes/database.inc";
 include_once "includes/variable.inc";
 include_once "includes/comment.inc";
diff --git a/includes/node.inc b/includes/node.inc
index 155ba3f00374f5141959b943a66ebaecdfea4dde..38dd79a855b69c9e220ff3179fb3fc65b3e5c3e9 100644
--- a/includes/node.inc
+++ b/includes/node.inc
@@ -211,8 +211,12 @@ function node_preview($node) {
   return $node;
 }
 
+function node_index($string) {
+  return $string ? implode(" / ", node_attributes_view($string)) : "&nbsp;";
+}
+
 function node_attributes_edit($edit) {
-  return index_collection_form("section", ($edit[section] ? $edit[section] : "section:". field_get($edit[attribute], "section")));
+  return index_collection_form("section", ($edit[section] ? $edit[section] : "section:". field_get($edit[attribute], "section") .";"));
 }
 
 function node_attributes_save($edit) {
@@ -224,6 +228,16 @@ function node_attributes_save($edit) {
   }
 }
 
+function node_attributes_view($string) {
+  foreach (explode(";", $string) as $data) {
+    $entry = explode(":", $data);
+    if (in_array($entry[0], array("section"))) {
+      $array[] = "<a href=\"?$entry[0]=$entry[1]\">$entry[1]</a>";
+    }
+  }
+  return $array ? $array : array();
+}
+
 function node_visible($node) {
   global $user, $status;
   return ($node->status == $status[posted]) || ($node->status == $status[queued] && $user->id) || user_access($user, $node->type) || user_access($user, "node");
diff --git a/includes/structure.inc b/includes/structure.inc
deleted file mode 100644
index fdac8e8119e23be087d5babf5e2576eda9598041..0000000000000000000000000000000000000000
--- a/includes/structure.inc
+++ /dev/null
@@ -1,157 +0,0 @@
-<?php
-
-// ----- category -----
-
-function _category_get($field, $value) {
-  return db_query("SELECT * FROM category WHERE $field = '$value'");
-}
-
-// returns the category object where $field = $value:
-function category_get_object($field, $value) {
-  return db_fetch_object(_category_get($field, $value));
-}
-
-// returns the category array where $field = $value:
-function category_get_array($field, $value) {
-  return db_fetch_array(_category_get($field, $value));
-}
-
-// save a category:
-function category_save($edit) {
-  if (!$edit[cid]) $edit[cid] = db_insert_id(db_query("INSERT INTO category (name) VALUES ('". check_query($edit[name])."')"));
-  foreach ($edit as $key=>$value) db_query("UPDATE category SET $key = '". check_query($value) ."' WHERE cid = '$edit[cid]'");
-}
-
-
-// delete category $cid:
-function category_del($cid) {
-  db_query("DELETE FROM category WHERE cid = '". check_query($cid) ."'");
-  db_query("UPDATE node SET cid = 0 WHERE cid = '". check_query($cid) ."'");
-}
-
-// return post threshold:
-function category_post_threshold($cid) {
-  $category = db_fetch_object(db_query("SELECT post AS threshold FROM category WHERE cid = '". check_query($cid) ."'"));
-  return $category->threshold;
-}
-
-// return dump threshold:
-function category_dump_threshold($cid) {
-  $category = db_fetch_object(db_query("SELECT dump AS threshold FROM category WHERE cid = '". check_query($cid) ."'"));
-  return $category->threshold;
-}
-
-// return expiration threshold:
-function category_expire_threshold($cid) {
-  $category = db_fetch_object(db_query("SELECT expire AS threshold FROM category WHERE cid = '". check_query($cid) ."'"));
-  return $category->threshold;
-}
-
-// return default comment status of category $cid:
-function category_comment($cid) {
-  $category = category_get_object("cid", $cid);
-  return $category->comment ? $category->comment : 0;
-}
-
-// return default promote status of category $cid:
-function category_promote($cid) {
-  $category = category_get_object("cid", $cid);
-  return $category->promote ? $category->promote : 0;
-}
-
-// return default submission status of category $cid:
-function category_submission($cid) {
-  $category = category_get_object("cid", $cid);
-  return $category->submission ? $category->submission : 0;
-}
-
-// return linked string with name of category $cid:
-function category_name($cid) {
-  $category = category_get_object("cid", $cid);
-  return ($category) ? "<A HREF=\"index.php?category=$category->cid\">$category->name</A>" : "";
-}
-
-function category_form_select($type, $edit = array(), $size = 1) {
-  $result = db_query("SELECT * FROM category WHERE type = '$type'");
-  while ($category = db_fetch_object($result)) {
-    $options .= "<OPTION VALUE=\"$category->cid\"". ($edit[cid] == $category->cid ? "SELECTED" : "") .">". check_form($category->name) ."</OPTION>";
-  }
-  return "<SELECT NAME=\"edit[cid]\" SIZE=\"$size\"". ($size > 1 ? "MULTIPLE" : "") .">$options</SELECT>\n";
-}
-
-// ----- topic -----
-
-function _topic_get($field, $value) {
-  return db_query("SELECT * FROM topic WHERE $field = '$value'");
-}
-
-// returns the topic object where $field = $value:
-function topic_get_object($field, $value) {
-  return db_fetch_object(_topic_get($field, $value));
-}
-
-// returns the topic array where $field = $value:
-function topic_get_array($field, $value) {
-  return db_fetch_array(_topic_get($field, $value));
-}
-
-// save a topic:
-function topic_save($edit) {
-  if (!$edit[tid]) $edit[tid] = db_insert_id(db_query("INSERT INTO topic (name) VALUES ('". check_query($edit[name])."')"));
-  foreach ($edit as $key=>$value) db_query("UPDATE topic SET $key = '". check_query($value) ."' WHERE tid = '$edit[tid]'");
-}
-
-// returns a sorted tree-representation of all topics:
-function topic_tree($parent = 0, $name = "", $tree = array()) {
-  $result = db_query("SELECT * FROM topic WHERE pid = '$parent' ORDER BY name");
-  while ($topic = db_fetch_object($result)) {
-    $tree[$topic->tid] = ($name ? "$name - $topic->name" : $topic->name);
-    $tree = topic_tree($topic->tid, $tree[$topic->tid], $tree);
-  }
-  return $tree;
-}
-
-// delete topic $tid:
-function topic_del($tid) {
-  db_query("DELETE FROM topic WHERE tid = '". check_query($tid) ."'");
-  db_query("UPDATE node SET tid = 0 WHERE tid = '". check_query($tid) ."'");
-}
-
-// return linked string with name of topic $tid:
-function topic_name($tid, $name = 0) {
-  $topic = topic_get_object("tid", $tid);
-  $name = $name ? "<A HREF=\"index.php?topic=$topic->tid\">$topic->name</A> - $name" : "<A HREF=\"index.php?topic=$topic->tid\">$topic->name</A>";
-  return ($topic->pid) ? topic_name($topic->pid, $name) : $name;
-}
-
-// return moderators for topic $tid:
-function topic_moderate($tid) {
-  $topic = topic_get_object("tid", $tid);
-  return $topic->moderate;
-}
-
-// renders a HTML form to select one or more topics:
-function topic_form_select($edit = array(), $size = 1) {
-  foreach (topic_tree() as $tid=>$name) {
-    $options .= "<OPTION VALUE=\"$tid\"". ($edit[tid] == $tid ? "SELECTED" : "") .">". check_form($name) ."</OPTION>";
-  }
-  return "<SELECT NAME=\"edit[tid]\" SIZE=\"$size\"". ($size > 1 ? "MULTIPLE" : "") .">$options</SELECT>\n";
-}
-
-// ----- structure -----
-
-// add node $nid to category $cid and topic $tid:
-function structure_save($nid, $cid, $tid) {
-  category_node($nid, $cid);
-  topic_node($nid, $tid);
-}
-
-// render a HMTL selection form:
-function structure_form($type, $edit = array(), $size = 1) {
-  $output .= "<B>Category and topic:</B><BR>\n";
-  $output .= category_form_select($type, $edit, $size) ." ". topic_form_select($edit, $size) ."<BR>";
-  $output .= "<SMALL><I>". t("Select the category and the topic this submission belongs in.") ."</I></SMALL><P>";
-  return $output;
-}
-
-?>
\ No newline at end of file
diff --git a/includes/theme.inc b/includes/theme.inc
index 7cb07bfc959703e81d1f835be134636422844a1f..4bc6e57ea8da7f0edfde4ad1b8973b7ea78e71a6 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -1,15 +1,17 @@
 <?php
 
 class BaseTheme {
-    function links($links = array(), $status = 0, $node = 0) {
-      if ($status == 1)
-        $links = array_merge(theme_morelink($node), $links);
-      foreach ($links as $link) {
-        $_links[] = count($link) == 2 ? "<A HREF=\"$link[0]\"><FONT COLOR=\"$theme->link\">". t($link[1]) ."</FONT></A>" : t($link[0]);
-      }
-      if ($status == 2) return ($_links ? implode(" | ", $_links) : "");
-      else return ($_links ? "[ ". implode(" | ", $_links) ." ]" : "");
+  function links($links = array(), $status = 0, $node = 0) {
+    if ($status == 1)
+      $links = array_merge(theme_morelink($node), $links);
+
+    foreach ($links as $link) {
+      $_links[] = count($link) == 2 ? "<A HREF=\"$link[0]\"><FONT COLOR=\"$theme->link\">". t($link[1]) ."</FONT></A>" : t($link[0]);
     }
+
+    if ($status == 2) return ($_links ? implode(" | ", $_links) : "");
+    else return ($_links ? "[ ". implode(" | ", $_links) ." ]" : "");
+  }
 }
 
 function theme_init() {
diff --git a/index.php b/index.php
index c8ea0b1438157ed4909a12d1ebc2dfd86c28fdcb..eb80ef99ae01e14a5643318828055229b6d637d6 100644
--- a/index.php
+++ b/index.php
@@ -4,16 +4,13 @@
 
 page_header();
 
-if ($category) {
-  $c = "AND cid = '". check_input($category) ."'";
+foreach(explode("&", $QUERY_STRING) as $attribute) {
+  if ($attribute) $query .= "attribute LIKE '%". check_input(strtr($attribute, "=", ":")) ."%' AND ";
 }
 
-if ($topic) {
-  foreach (topic_tree($topic) as $key=>$value) $t .= "tid = '$key' OR ";
-  $t = "AND ($t tid = '". check_input($topic) ."')";
-}
+$query = !$date ? $query : "";
 
-$result = db_query("SELECT nid, type FROM node WHERE promote = '1' AND status = '". node_status("posted") ."' AND timestamp <= '". ($date > 0 ? check_input($date) : time()) ."' $c $t ORDER BY timestamp DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get(default_nodes_main, 10)));
+$result = db_query("SELECT nid, type FROM node WHERE $query promote = '1' AND status = '". node_status("posted") ."' AND timestamp <= '". ($date > 0 ? check_input($date) : time()) ."' ORDER BY timestamp DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get(default_nodes_main, 10)));
 
 $theme->header();
 while ($node = db_fetch_object($result)) {
diff --git a/modules/book.module b/modules/book.module
index 319165c972cddd964117599422260c70c89d6298..522dcdeffa8edd6501d53469c9b8400edc6a5144 100644
--- a/modules/book.module
+++ b/modules/book.module
@@ -108,10 +108,13 @@ function book_toc($parent = "", $indent = "", $toc = array()) {
 function book_form($edit = array()) {
   global $REQUEST_URI, $user;
 
+  if ($edit[title]) {
+    $form .= book_view(new Book(node_preview($edit)));
+  }
+
   $form .= form_item(t("Author"), format_username(($edit[userid] ? $edit[userid] : $user->userid)));
   $form .= form_hidden(userid, $edit[userid]);
   $form .= form_textfield(t("Subject"), "title", $edit[title], 50, 64);
-  $form .= form_item(t("Category"), category_form_select("book", $edit));
 
   if ($edit[pid]) {
     $node = node_get_object(array("nid" => $edit[pid]));
@@ -122,8 +125,8 @@ function book_form($edit = array()) {
     $form .= form_select(t("Parent"), "parent", $edit[parent], book_toc(), t("The parent subject or category the page belongs in."));
   }
 
-  $form .= form_textarea(t("Content"), "body", $edit[body], 50, 10, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
-  $form .= form_textarea(t("Log message"), "log", $edit[log], 50, 5, t("An explanation of the additions or updates being made to help the group understand your motivations."));
+  $form .= form_textarea(t("Content"), "body", $edit[body], 70, 20, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
+  $form .= form_textarea(t("Log message"), "log", $edit[log], 70, 5, t("An explanation of the additions or updates being made to help the group understand your motivations."));
 
   if (user_access($user, "book")) {
     $form .= form_select(t("Weight"), "weight", $edit[weight], array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30), t("The heavier nodes will sink and the lighter nodes will be positioned nearer the top."));
@@ -134,10 +137,7 @@ function book_form($edit = array()) {
     $form .= form_hidden("nid", $edit[nid]);
   }
 
-  if (!$edit) {
-    $form .= form_submit(t("Preview"));
-  }
-  else if (!$edit[title]) {
+  if (!$edit[title]) {
     $form .= "<FONT COLOR=\"red\">". t("Warning: you did not supply a title.") ."</FONT><P>\n";
     $form .= form_submit(t("Preview"));
   }
@@ -153,10 +153,10 @@ function book_save($edit) {
   global $status, $user;
 
   if (!$edit[nid]) {
-    node_save($edit, array(author => $user->id, body, cid, comment => variable_get("book_comment", 0), log, moderate => variable_get("book_moderate", ""), parent, promote => variable_get("book_promote", 0), score => 0, status => variable_get("book_status", $status[queued]), tid, timestamp => time(), title, type => "book", votes => 0, weight));
+    node_save($edit, array(author => $user->id, body, comment => variable_get("book_comment", 0), log, moderate => variable_get("book_moderate", ""), parent, promote => variable_get("book_promote", 0), score => 0, status => variable_get("book_status", $status[queued]), timestamp => time(), title, type => "book", votes => 0, weight));
   }
   else if (user_access($user)) {
-    node_save($edit, array(body, cid, log, parent, tid, title, type => "book", weight));
+    node_save($edit, array(body, log, parent, title, type => "book", weight));
   }
 }
 
@@ -232,7 +232,6 @@ function book_user() {
       $theme->box($title, book_update($id));
       break;
     case t("Preview"):
-      book_view(new Book(node_preview($edit)));
       $theme->box($title, book_form($edit));
       break;
     case t("Submit"):
diff --git a/modules/book/book.module b/modules/book/book.module
index 319165c972cddd964117599422260c70c89d6298..522dcdeffa8edd6501d53469c9b8400edc6a5144 100644
--- a/modules/book/book.module
+++ b/modules/book/book.module
@@ -108,10 +108,13 @@ function book_toc($parent = "", $indent = "", $toc = array()) {
 function book_form($edit = array()) {
   global $REQUEST_URI, $user;
 
+  if ($edit[title]) {
+    $form .= book_view(new Book(node_preview($edit)));
+  }
+
   $form .= form_item(t("Author"), format_username(($edit[userid] ? $edit[userid] : $user->userid)));
   $form .= form_hidden(userid, $edit[userid]);
   $form .= form_textfield(t("Subject"), "title", $edit[title], 50, 64);
-  $form .= form_item(t("Category"), category_form_select("book", $edit));
 
   if ($edit[pid]) {
     $node = node_get_object(array("nid" => $edit[pid]));
@@ -122,8 +125,8 @@ function book_form($edit = array()) {
     $form .= form_select(t("Parent"), "parent", $edit[parent], book_toc(), t("The parent subject or category the page belongs in."));
   }
 
-  $form .= form_textarea(t("Content"), "body", $edit[body], 50, 10, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
-  $form .= form_textarea(t("Log message"), "log", $edit[log], 50, 5, t("An explanation of the additions or updates being made to help the group understand your motivations."));
+  $form .= form_textarea(t("Content"), "body", $edit[body], 70, 20, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
+  $form .= form_textarea(t("Log message"), "log", $edit[log], 70, 5, t("An explanation of the additions or updates being made to help the group understand your motivations."));
 
   if (user_access($user, "book")) {
     $form .= form_select(t("Weight"), "weight", $edit[weight], array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30), t("The heavier nodes will sink and the lighter nodes will be positioned nearer the top."));
@@ -134,10 +137,7 @@ function book_form($edit = array()) {
     $form .= form_hidden("nid", $edit[nid]);
   }
 
-  if (!$edit) {
-    $form .= form_submit(t("Preview"));
-  }
-  else if (!$edit[title]) {
+  if (!$edit[title]) {
     $form .= "<FONT COLOR=\"red\">". t("Warning: you did not supply a title.") ."</FONT><P>\n";
     $form .= form_submit(t("Preview"));
   }
@@ -153,10 +153,10 @@ function book_save($edit) {
   global $status, $user;
 
   if (!$edit[nid]) {
-    node_save($edit, array(author => $user->id, body, cid, comment => variable_get("book_comment", 0), log, moderate => variable_get("book_moderate", ""), parent, promote => variable_get("book_promote", 0), score => 0, status => variable_get("book_status", $status[queued]), tid, timestamp => time(), title, type => "book", votes => 0, weight));
+    node_save($edit, array(author => $user->id, body, comment => variable_get("book_comment", 0), log, moderate => variable_get("book_moderate", ""), parent, promote => variable_get("book_promote", 0), score => 0, status => variable_get("book_status", $status[queued]), timestamp => time(), title, type => "book", votes => 0, weight));
   }
   else if (user_access($user)) {
-    node_save($edit, array(body, cid, log, parent, tid, title, type => "book", weight));
+    node_save($edit, array(body, log, parent, title, type => "book", weight));
   }
 }
 
@@ -232,7 +232,6 @@ function book_user() {
       $theme->box($title, book_update($id));
       break;
     case t("Preview"):
-      book_view(new Book(node_preview($edit)));
       $theme->box($title, book_form($edit));
       break;
     case t("Submit"):
diff --git a/modules/forum.module b/modules/forum.module
index 194979ccd44e4d767ad138716003856c814796c8..61d05f56104b5fba66b0b5fb1d54008261e9f51b 100644
--- a/modules/forum.module
+++ b/modules/forum.module
@@ -14,8 +14,7 @@ function forum_form($edit = array()) {
   global $REQUEST_URI;
 
   $form .= form_textfield("Subject", "title", $edit[title], 50, 64);
-  $form .= structure_form("forum", $edit);
-  $form .= form_textarea("Body", "body", $edit[body], 50, 10);
+  $form .= form_textarea("Body", "body", $edit[body], 70, 10);
   $form .= form_hidden("nid", $edit[nid]);
   $form .= form_submit("Submit");
 
@@ -26,7 +25,7 @@ function forum_save($edit) {
   global $user, $status;
 
   if (user_access($user)) {
-    node_save($edit, array(author => $user->id, body, cid, comment => variable_get("forum_comment", 0), moderate => variable_get("forum_moderate", ""), promote => variable_get("forum_promote", 0), score => 0, status => $status[posted], tid, timestamp => time(), title, type => "forum", votes => 0));
+    node_save($edit, array(author => $user->id, body, comment => variable_get("forum_comment", 0), moderate => variable_get("forum_moderate", ""), promote => variable_get("forum_promote", 0), score => 0, status => $status[posted], timestamp => time(), title, type => "forum", votes => 0));
   }
 }
 
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index 194979ccd44e4d767ad138716003856c814796c8..61d05f56104b5fba66b0b5fb1d54008261e9f51b 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -14,8 +14,7 @@ function forum_form($edit = array()) {
   global $REQUEST_URI;
 
   $form .= form_textfield("Subject", "title", $edit[title], 50, 64);
-  $form .= structure_form("forum", $edit);
-  $form .= form_textarea("Body", "body", $edit[body], 50, 10);
+  $form .= form_textarea("Body", "body", $edit[body], 70, 10);
   $form .= form_hidden("nid", $edit[nid]);
   $form .= form_submit("Submit");
 
@@ -26,7 +25,7 @@ function forum_save($edit) {
   global $user, $status;
 
   if (user_access($user)) {
-    node_save($edit, array(author => $user->id, body, cid, comment => variable_get("forum_comment", 0), moderate => variable_get("forum_moderate", ""), promote => variable_get("forum_promote", 0), score => 0, status => $status[posted], tid, timestamp => time(), title, type => "forum", votes => 0));
+    node_save($edit, array(author => $user->id, body, comment => variable_get("forum_comment", 0), moderate => variable_get("forum_moderate", ""), promote => variable_get("forum_promote", 0), score => 0, status => $status[posted], timestamp => time(), title, type => "forum", votes => 0));
   }
 }
 
diff --git a/modules/index.module b/modules/index.module
index 592eca038147ecacaefedf8258a7c5731e46740f..0d06a7b22c4ea7df330d786fad7128741f5ca2c8 100644
--- a/modules/index.module
+++ b/modules/index.module
@@ -7,13 +7,13 @@ function index_get_array($id) {
   return db_fetch_array(db_query("SELECT * FROM entry WHERE eid = '". check_input($id) ."'"));
 }
 
-function index_collection_form($name) {
+function index_collection_form($name, $selected = "") {
   $result = db_query("SELECT * FROM entry WHERE collection = '$name'");
   while ($entry = db_fetch_object($result)) {
     $options[$entry->keyword] = $entry->name;
   }
 
-  return form_select($name, $name, "", $options);
+  return form_select(ucfirst($name), $name, $selected, $options);
 }
 
 function index_collection_link($name) {
diff --git a/modules/locale.module b/modules/locale.module
index b4f254cc0f05776c2d921da88c66c1aee3361952..065468e9c55dce6dde4c83b21edc47d6f9f56a63 100644
--- a/modules/locale.module
+++ b/modules/locale.module
@@ -66,7 +66,7 @@ function locale_languages($translation) {
 function locale_overview() {
   if (variable_get("locale", 0)) {
     $result = db_query("SELECT * FROM locales ORDER BY string");
-    
+
     $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
     $output .= " <TR><TH>string</TH><TH>languages</TH><TH COLSPAN=\"2\">operations</TH><TR>\n";
     while ($locale = db_fetch_object($result)) {
@@ -74,10 +74,12 @@ function locale_overview() {
       $output .= " <TR><TD>". check_output($locale->string) ."<BR><SMALL><I>$locale->location</I></SMALL></TD><TD ALIGN=\"center\">$languages</TD><TD><A HREF=\"admin.php?mod=locale&op=edit&id=$locale->id\">edit</A></TD><TD><A HREF=\"admin.php?mod=locale&op=delete&id=$locale->id\">delete</A></TD></TR>";
     }
     $output .= "</TABLE>\n";
-    
+
     return $output;
   }
-  return "Locale disabled.";
+  else {
+    return status("locale disabled.");
+  }
 }
 
 function locale_admin() {
diff --git a/modules/locale/locale.module b/modules/locale/locale.module
index b4f254cc0f05776c2d921da88c66c1aee3361952..065468e9c55dce6dde4c83b21edc47d6f9f56a63 100644
--- a/modules/locale/locale.module
+++ b/modules/locale/locale.module
@@ -66,7 +66,7 @@ function locale_languages($translation) {
 function locale_overview() {
   if (variable_get("locale", 0)) {
     $result = db_query("SELECT * FROM locales ORDER BY string");
-    
+
     $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
     $output .= " <TR><TH>string</TH><TH>languages</TH><TH COLSPAN=\"2\">operations</TH><TR>\n";
     while ($locale = db_fetch_object($result)) {
@@ -74,10 +74,12 @@ function locale_overview() {
       $output .= " <TR><TD>". check_output($locale->string) ."<BR><SMALL><I>$locale->location</I></SMALL></TD><TD ALIGN=\"center\">$languages</TD><TD><A HREF=\"admin.php?mod=locale&op=edit&id=$locale->id\">edit</A></TD><TD><A HREF=\"admin.php?mod=locale&op=delete&id=$locale->id\">delete</A></TD></TR>";
     }
     $output .= "</TABLE>\n";
-    
+
     return $output;
   }
-  return "Locale disabled.";
+  else {
+    return status("locale disabled.");
+  }
 }
 
 function locale_admin() {
diff --git a/modules/moderate.module b/modules/moderate.module
index ceef124e5cb644d469ca53395848fd31f0cb4488..c3db8abab134c0fd4884a0a32d8e9054caa4690d 100644
--- a/modules/moderate.module
+++ b/modules/moderate.module
@@ -12,11 +12,11 @@ function moderate_overview($query = array()) {
 
   $output .= status($query[0]);
   $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
-  $output .= " <TR><TH>node</TH><TH>category / topic</TH><TH>status</TH><TH>author</TH><TH>date</TH><TH>operations</TH></TR>\n";
+  $output .= " <TR><TH>node</TH><TH>type</TH><TH>status</TH><TH>author</TH><TH>date</TH><TH>operations</TH></TR>\n";
 
   $r1 = db_query("SELECT n.*, u.userid FROM node n LEFT JOIN users u ON n.author = u.id WHERE n.moderate LIKE '%$user->userid%' ORDER BY n.timestamp DESC LIMIT 30");
   while ($node = db_fetch_object($r1)) {
-    $output .= " <TR><TD><A HREF=\"node.php?id=$node->nid\">". check_output($node->title) ."</A></TD><TD>". category_name($node->cid) ." / ". topic_name($node->tid) ."</TD><TD>". node_status($node->status) ."</TD><TD>". format_username($node->userid) ."</TD><TD>". format_date($node->timestamp, "small") ."</TD><TD><A HREF=\"admin.php?mod=moderate&type=node&op=edit&id=$node->nid\">edit $node->type</A></TD></TR>\n";
+    $output .= " <TR><TD><A HREF=\"node.php?id=$node->nid\">". check_output($node->title) ."</A></TD><TD>$node->type</TD><TD>". node_status($node->status) ."</TD><TD>". format_username($node->userid) ."</TD><TD>". format_date($node->timestamp, "small") ."</TD><TD><A HREF=\"admin.php?mod=moderate&type=node&op=edit&id=$node->nid\">edit $node->type</A></TD></TR>\n";
 
     $r2 = db_query("SELECT c.*, u.userid FROM comments c LEFT JOIN users u ON c.author = u.id WHERE c.lid = '$node->nid' ORDER BY c.timestamp DESC");
     while ($comment = db_fetch_object($r2)) {
diff --git a/modules/node.module b/modules/node.module
index 959ddff19a57cd2968ed220bcf3f78271b2f52e9..6b1df2c8297dbcb65ce82eb1bc5d5e371c947d32 100644
--- a/modules/node.module
+++ b/modules/node.module
@@ -5,9 +5,8 @@ function Node($node) {
     global $user;
     $this->userid = $node[userid] ? $node[userid] : $user->userid;
     $this->title = $node[title];
+    $this->timestamp = $node[attribute];
     $this->timestamp = $node[timestamp] ? $node[timestamp] : time();
-    $this->cid = $node[cid];
-    $this->tid = $node[tid];
   }
 }
 
@@ -67,7 +66,7 @@ function node_overview($query) {
   $color = array("#ffdc9b", "#dedec4");
   $query = node_query($query ? $query : 0);
 
-  $result = db_query("SELECT n.*, u.userid, c.name AS category FROM node n LEFT JOIN users u ON n.author = u.id LEFT JOIN category c ON n.cid = c.cid $query[1] LIMIT 50");
+  $result = db_query("SELECT n.*, u.userid FROM node n LEFT JOIN users u ON n.author = u.id $query[1] LIMIT 50");
 
   $output .= status($query[0]);
   $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
diff --git a/modules/node/node.module b/modules/node/node.module
index 959ddff19a57cd2968ed220bcf3f78271b2f52e9..6b1df2c8297dbcb65ce82eb1bc5d5e371c947d32 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -5,9 +5,8 @@ function Node($node) {
     global $user;
     $this->userid = $node[userid] ? $node[userid] : $user->userid;
     $this->title = $node[title];
+    $this->timestamp = $node[attribute];
     $this->timestamp = $node[timestamp] ? $node[timestamp] : time();
-    $this->cid = $node[cid];
-    $this->tid = $node[tid];
   }
 }
 
@@ -67,7 +66,7 @@ function node_overview($query) {
   $color = array("#ffdc9b", "#dedec4");
   $query = node_query($query ? $query : 0);
 
-  $result = db_query("SELECT n.*, u.userid, c.name AS category FROM node n LEFT JOIN users u ON n.author = u.id LEFT JOIN category c ON n.cid = c.cid $query[1] LIMIT 50");
+  $result = db_query("SELECT n.*, u.userid FROM node n LEFT JOIN users u ON n.author = u.id $query[1] LIMIT 50");
 
   $output .= status($query[0]);
   $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
diff --git a/modules/page.module b/modules/page.module
index 946798d1bc0977fc33048a3fcee0128067846c22..88739cbb4933b3339d16d588f93b08a8ab27da82 100644
--- a/modules/page.module
+++ b/modules/page.module
@@ -2,8 +2,16 @@
 
 $GLOBALS[format] = array(0 => "HTML", 1 => "PHP", 2 => "text");
 
+class Page {
+  function Page($page) {
+    $this = new Node($page);
+    $this->body = $page[body];
+    $this->format = $page[format];
+  }
+}
+
 function page_view($node, $main = 0) {
-  global $format, $theme;
+  global $format;
 
   switch ($format[$node->format]) {
     case "PHP":
@@ -24,13 +32,24 @@ function page_status() {
 }
 
 function page_form($edit = array()) {
-  global $format, $REQUEST_URI;
+  global $REQUEST_URI, $format;
+
+  if ($edit[title]) {
+    $form = page_view(new Page(node_preview($edit)));
+  }
 
   $form .= form_textfield("Subject", "title", $edit[title], 50, 64);
-  $form .= form_textarea("Body", "body", $edit[body], 80, 30);
+  $form .= form_textarea("Body", "body", $edit[body], 70, 30);
   $form .= form_select("Type", "format", $edit[format], $format);
   $form .= form_hidden("nid", $edit[nid]);
-  $form .= form_submit("Submit");
+
+  if ($edit[title]) {
+    $form .= form_submit(t("Preview"));
+    $form .= form_submit("Submit");
+  }
+  else {
+    $form .= form_submit(t("Preview"));
+  }
 
   return form($REQUEST_URI, $form);
 }
diff --git a/modules/page/page.module b/modules/page/page.module
index 946798d1bc0977fc33048a3fcee0128067846c22..88739cbb4933b3339d16d588f93b08a8ab27da82 100644
--- a/modules/page/page.module
+++ b/modules/page/page.module
@@ -2,8 +2,16 @@
 
 $GLOBALS[format] = array(0 => "HTML", 1 => "PHP", 2 => "text");
 
+class Page {
+  function Page($page) {
+    $this = new Node($page);
+    $this->body = $page[body];
+    $this->format = $page[format];
+  }
+}
+
 function page_view($node, $main = 0) {
-  global $format, $theme;
+  global $format;
 
   switch ($format[$node->format]) {
     case "PHP":
@@ -24,13 +32,24 @@ function page_status() {
 }
 
 function page_form($edit = array()) {
-  global $format, $REQUEST_URI;
+  global $REQUEST_URI, $format;
+
+  if ($edit[title]) {
+    $form = page_view(new Page(node_preview($edit)));
+  }
 
   $form .= form_textfield("Subject", "title", $edit[title], 50, 64);
-  $form .= form_textarea("Body", "body", $edit[body], 80, 30);
+  $form .= form_textarea("Body", "body", $edit[body], 70, 30);
   $form .= form_select("Type", "format", $edit[format], $format);
   $form .= form_hidden("nid", $edit[nid]);
-  $form .= form_submit("Submit");
+
+  if ($edit[title]) {
+    $form .= form_submit(t("Preview"));
+    $form .= form_submit("Submit");
+  }
+  else {
+    $form .= form_submit(t("Preview"));
+  }
 
   return form($REQUEST_URI, $form);
 }
diff --git a/modules/poll.module b/modules/poll.module
index ba6a0250a6095e26a4a2a060e3af98da23583f0e..cd9e0e306a4aa728736bab1bd8675c1dc0f5b2c0 100644
--- a/modules/poll.module
+++ b/modules/poll.module
@@ -28,7 +28,7 @@ function poll_delete($node) {
   if ($node->nid)
   {
     db_query("DELETE FROM poll_choices WHERE nid='" . $node->nid . "'");
-  }  
+  }
 }
 
 function poll_get_choices_array($poll) {
@@ -87,7 +87,7 @@ function poll_help() {
  ?>
    <p>Poll.module allows you to run simple multiple choice polls on your site. After creating the necessary categories, you can add a poll through this administration interface.</p>
    <p>The poll.module also has a block to show the latest poll. If you combine it with a poll category that doesn't promote to the mainpage, you'll get a side-block only poll system.</p>
-   <p>If you want to set a limit on the duration of a poll, use the <i>Poll Duration</i> setting. After the specified interval, the poll will automatically be closed, preventing anymore voting.</p> 
+   <p>If you want to set a limit on the duration of a poll, use the <i>Poll Duration</i> setting. After the specified interval, the poll will automatically be closed, preventing anymore voting.</p>
  <?php
 }
 
@@ -175,9 +175,13 @@ function poll_form($edit = array(), $nocheck = 0) {
                     10713600 => t("4 months"), 31536000 => t("1 year"));
 
   $active = array(0 => "Closed", 1 => "Active");
-  
+
   $admin = ($edit[nid] && user_access($user,"poll")) ? 1 : 0;
-  
+
+  if ($edit[title]) {
+    $form .= poll_view(new Poll(node_preview($edit)));
+  }
+
   if ($admin && !is_array($edit[choices])) $edit = poll_get_choices_array($edit);
 
   /* Mini-form for number of choiceboxes */
@@ -198,15 +202,14 @@ function poll_form($edit = array(), $nocheck = 0) {
 
   $form .= form_select(t("Poll duration"), "runtime", $edit[runtime] ? $edit[runtime] : t("1 week"), $duration, t("After this period, the poll will automatically be closed."));
   if ($admin) $form .= form_select(t("Poll status"), "active", $edit[active], $active);
-  $form .= structure_form("poll", $edit);
-
+  $form .= node_attributes_edit($edit);
 
   // hidden fields:
   if ($edit[nid] > 0) {
     $form .= form_hidden("nid", $edit[nid]);
   }
 
-  if ((!$edit) || ($nocheck)) {
+  if ($nocheck) {
     $form .= form_submit(t("Preview"));
   }
   else if (!$edit[title]) {
@@ -229,10 +232,10 @@ function poll_save($edit) {
   global $status, $user;
 
   if (!$edit[nid]) {
-    $nid = node_save($edit, array(active => 1, author => $user->id, cid, comment => variable_get("poll_comment", 0), moderate => variable_get("poll_moderate", ""), promote => variable_get("poll_promote", 0), runtime, score => 0, status => variable_get("poll_status", $status[queued]), tid, timestamp => time(), title, type => "poll", votes => 0, voters => ""));
+    $nid = node_save($edit, array(active => 1, attribute => node_attributes_save($edit), author => $user->id, cid, comment => variable_get("poll_comment", 0), moderate => variable_get("poll_moderate", ""), promote => variable_get("poll_promote", 0), runtime, score => 0, status => variable_get("poll_status", $status[queued]), tid, timestamp => time(), title, type => "poll", votes => 0, voters => ""));
   }
   else if (user_access($user)) {
-    $nid = node_save($edit, array(active, cid, tid, runtime, title, type => "poll"));
+    $nid = node_save($edit, array(active, attribute => node_attributes_save($edit), cid, tid, runtime, title, type => "poll"));
     db_query("DELETE FROM poll_choices WHERE nid='" . $nid . "'");
   }
   if ($nid) {
@@ -270,7 +273,6 @@ function poll_user() {
     case t("Refresh"):
       $refresh = 1;
     case t("Preview"):
-      poll_view(new Poll(node_preview($edit)));
       $theme->box(t("Submit"), poll_form($edit, $refresh));
       break;
     case t("Submit"):
diff --git a/modules/poll/poll.module b/modules/poll/poll.module
index ba6a0250a6095e26a4a2a060e3af98da23583f0e..cd9e0e306a4aa728736bab1bd8675c1dc0f5b2c0 100644
--- a/modules/poll/poll.module
+++ b/modules/poll/poll.module
@@ -28,7 +28,7 @@ function poll_delete($node) {
   if ($node->nid)
   {
     db_query("DELETE FROM poll_choices WHERE nid='" . $node->nid . "'");
-  }  
+  }
 }
 
 function poll_get_choices_array($poll) {
@@ -87,7 +87,7 @@ function poll_help() {
  ?>
    <p>Poll.module allows you to run simple multiple choice polls on your site. After creating the necessary categories, you can add a poll through this administration interface.</p>
    <p>The poll.module also has a block to show the latest poll. If you combine it with a poll category that doesn't promote to the mainpage, you'll get a side-block only poll system.</p>
-   <p>If you want to set a limit on the duration of a poll, use the <i>Poll Duration</i> setting. After the specified interval, the poll will automatically be closed, preventing anymore voting.</p> 
+   <p>If you want to set a limit on the duration of a poll, use the <i>Poll Duration</i> setting. After the specified interval, the poll will automatically be closed, preventing anymore voting.</p>
  <?php
 }
 
@@ -175,9 +175,13 @@ function poll_form($edit = array(), $nocheck = 0) {
                     10713600 => t("4 months"), 31536000 => t("1 year"));
 
   $active = array(0 => "Closed", 1 => "Active");
-  
+
   $admin = ($edit[nid] && user_access($user,"poll")) ? 1 : 0;
-  
+
+  if ($edit[title]) {
+    $form .= poll_view(new Poll(node_preview($edit)));
+  }
+
   if ($admin && !is_array($edit[choices])) $edit = poll_get_choices_array($edit);
 
   /* Mini-form for number of choiceboxes */
@@ -198,15 +202,14 @@ function poll_form($edit = array(), $nocheck = 0) {
 
   $form .= form_select(t("Poll duration"), "runtime", $edit[runtime] ? $edit[runtime] : t("1 week"), $duration, t("After this period, the poll will automatically be closed."));
   if ($admin) $form .= form_select(t("Poll status"), "active", $edit[active], $active);
-  $form .= structure_form("poll", $edit);
-
+  $form .= node_attributes_edit($edit);
 
   // hidden fields:
   if ($edit[nid] > 0) {
     $form .= form_hidden("nid", $edit[nid]);
   }
 
-  if ((!$edit) || ($nocheck)) {
+  if ($nocheck) {
     $form .= form_submit(t("Preview"));
   }
   else if (!$edit[title]) {
@@ -229,10 +232,10 @@ function poll_save($edit) {
   global $status, $user;
 
   if (!$edit[nid]) {
-    $nid = node_save($edit, array(active => 1, author => $user->id, cid, comment => variable_get("poll_comment", 0), moderate => variable_get("poll_moderate", ""), promote => variable_get("poll_promote", 0), runtime, score => 0, status => variable_get("poll_status", $status[queued]), tid, timestamp => time(), title, type => "poll", votes => 0, voters => ""));
+    $nid = node_save($edit, array(active => 1, attribute => node_attributes_save($edit), author => $user->id, cid, comment => variable_get("poll_comment", 0), moderate => variable_get("poll_moderate", ""), promote => variable_get("poll_promote", 0), runtime, score => 0, status => variable_get("poll_status", $status[queued]), tid, timestamp => time(), title, type => "poll", votes => 0, voters => ""));
   }
   else if (user_access($user)) {
-    $nid = node_save($edit, array(active, cid, tid, runtime, title, type => "poll"));
+    $nid = node_save($edit, array(active, attribute => node_attributes_save($edit), cid, tid, runtime, title, type => "poll"));
     db_query("DELETE FROM poll_choices WHERE nid='" . $nid . "'");
   }
   if ($nid) {
@@ -270,7 +273,6 @@ function poll_user() {
     case t("Refresh"):
       $refresh = 1;
     case t("Preview"):
-      poll_view(new Poll(node_preview($edit)));
       $theme->box(t("Submit"), poll_form($edit, $refresh));
       break;
     case t("Submit"):
diff --git a/modules/story.module b/modules/story.module
index 5bb61851b4182442e58a947c9f619d5f08becb5f..3e6f428ce65db3939612e682ee5be19b9f07bc5b 100644
--- a/modules/story.module
+++ b/modules/story.module
@@ -38,21 +38,22 @@ function story_view($node, $main = 0) {
 function story_form($edit = array()) {
   global $REQUEST_URI, $user;
 
+  if ($edit[title]) {
+    story_view(new Story(node_preview($edit)));
+  }
+
   $form .= form_item(t("Your name"), format_username(($edit[userid] ? $edit[userid] : $user->userid)));
   $form .= form_hidden("userid", $edit[userid]);
   $form .= form_textfield(t("Subject"), "title", $edit[title], 50, 64);
-  $form .= structure_form("story", $edit);
-  $form .= form_textarea(t("Abstract"), "abstract", $edit[abstract], 50, 10, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
-  $form .= form_textarea(t("Body"), "body", $edit[body], 50, 15, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
+  $form .= node_attributes_edit($edit);
+  $form .= form_textarea(t("Abstract"), "abstract", $edit[abstract], 70, 10, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
+  $form .= form_textarea(t("Body"), "body", $edit[body], 70, 20, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
 
   if ($edit[nid] > 0) {
     $form .= form_hidden("nid", $edit[nid]);
   }
 
-  if (!$edit) {
-    $form .= form_submit(t("Preview"));
-  }
-  else if (!$edit[title]) {
+  if (!$edit[title]) {
     $form .= "<FONT COLOR=\"red\">". t("Warning: you did not supply a subject.") ."</FONT><P>\n";
     $form .= form_submit(t("Preview"));
   }
@@ -72,10 +73,10 @@ function story_save($edit) {
   global $status, $user;
 
   if (!$edit[nid]) {
-    node_save($edit, array(abstract, author => $user->id, body, cid, comment => variable_get("story_comment", 0), moderate => variable_get("story_moderate", ""), promote => variable_get("story_promote", 0), score => 0, status => variable_get("story_status", $status[queued]), tid, timestamp => time(), title, type => "story", votes => 0));
+    node_save($edit, array(abstract, attribute => node_attributes_save($edit), author => $user->id, body, comment => variable_get("story_comment", 0), moderate => variable_get("story_moderate", ""), promote => variable_get("story_promote", 0), score => 0, status => variable_get("story_status", $status[queued]), timestamp => time(), title, type => "story", votes => 0));
   }
   else if (user_access($user)) {
-    node_save($edit, array(abstract, body, cid, tid, title, type => "story"));
+    node_save($edit, array(abstract, attribute => node_attributes_save($edit), body, title, type => "story"));
   }
 }
 
@@ -84,7 +85,6 @@ function story_user() {
 
   switch($op) {
     case t("Preview"):
-      story_view(new Story(node_preview($edit)));
       $theme->box(t("Submit"), story_form($edit));
       break;
     case t("Submit"):
diff --git a/modules/story/story.module b/modules/story/story.module
index 5bb61851b4182442e58a947c9f619d5f08becb5f..3e6f428ce65db3939612e682ee5be19b9f07bc5b 100644
--- a/modules/story/story.module
+++ b/modules/story/story.module
@@ -38,21 +38,22 @@ function story_view($node, $main = 0) {
 function story_form($edit = array()) {
   global $REQUEST_URI, $user;
 
+  if ($edit[title]) {
+    story_view(new Story(node_preview($edit)));
+  }
+
   $form .= form_item(t("Your name"), format_username(($edit[userid] ? $edit[userid] : $user->userid)));
   $form .= form_hidden("userid", $edit[userid]);
   $form .= form_textfield(t("Subject"), "title", $edit[title], 50, 64);
-  $form .= structure_form("story", $edit);
-  $form .= form_textarea(t("Abstract"), "abstract", $edit[abstract], 50, 10, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
-  $form .= form_textarea(t("Body"), "body", $edit[body], 50, 15, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
+  $form .= node_attributes_edit($edit);
+  $form .= form_textarea(t("Abstract"), "abstract", $edit[abstract], 70, 10, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
+  $form .= form_textarea(t("Body"), "body", $edit[body], 70, 20, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
 
   if ($edit[nid] > 0) {
     $form .= form_hidden("nid", $edit[nid]);
   }
 
-  if (!$edit) {
-    $form .= form_submit(t("Preview"));
-  }
-  else if (!$edit[title]) {
+  if (!$edit[title]) {
     $form .= "<FONT COLOR=\"red\">". t("Warning: you did not supply a subject.") ."</FONT><P>\n";
     $form .= form_submit(t("Preview"));
   }
@@ -72,10 +73,10 @@ function story_save($edit) {
   global $status, $user;
 
   if (!$edit[nid]) {
-    node_save($edit, array(abstract, author => $user->id, body, cid, comment => variable_get("story_comment", 0), moderate => variable_get("story_moderate", ""), promote => variable_get("story_promote", 0), score => 0, status => variable_get("story_status", $status[queued]), tid, timestamp => time(), title, type => "story", votes => 0));
+    node_save($edit, array(abstract, attribute => node_attributes_save($edit), author => $user->id, body, comment => variable_get("story_comment", 0), moderate => variable_get("story_moderate", ""), promote => variable_get("story_promote", 0), score => 0, status => variable_get("story_status", $status[queued]), timestamp => time(), title, type => "story", votes => 0));
   }
   else if (user_access($user)) {
-    node_save($edit, array(abstract, body, cid, tid, title, type => "story"));
+    node_save($edit, array(abstract, attribute => node_attributes_save($edit), body, title, type => "story"));
   }
 }
 
@@ -84,7 +85,6 @@ function story_user() {
 
   switch($op) {
     case t("Preview"):
-      story_view(new Story(node_preview($edit)));
       $theme->box(t("Submit"), story_form($edit));
       break;
     case t("Submit"):
diff --git a/modules/structure.module b/modules/structure.module
deleted file mode 100644
index 823da525418c79ba9dacdaf49bb1f488f5214159..0000000000000000000000000000000000000000
--- a/modules/structure.module
+++ /dev/null
@@ -1,157 +0,0 @@
-<?php
-
-function content_types($name) {
-  global $types;
-  if (function_exists($name ."_status")) $types[$name] = $name;
-}
-
-function category_form($edit = array()) {
-  global $types;
-
-  $threshold_post = array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13, 14 => 14, 15 => 15, 20 => 20, 25 => 25, 30 => 30, 35 => 35, 40 => 40, 45 => 45, 50 => 50, 60 => 60, 70 => 70, 80 => 80, 90 => 90, 100 => 100);
-  $threshold_dump = array(-1 => -1, -2 => -2, -3 => -3, -4 => -4, -5 => -5, -6 => -6, -7 => -7, -8 => -8, -9 => -9, -10 => -10, -11 => -11, -12 => -12, -13 => -13, -14 => -14, -15 => -15, -20 => -20, -25 => -25, -30 => -30);
-  $threshold_expire = array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13, 14 => 14, 15 => 15, 20 => 20, 25 => 25, 30 => 30, 35 => 35, 40 => 40, 45 => 45, 50 => 50, 60 => 60, 70 => 70, 80 => 80, 90 => 90, 100 => 100);
-
-  module_iterate("content_types");
-
-  $form .= form_textfield(t("Name"), "name", $edit[name], 30, 55, t("A unique name for this category like 'announcement', 'article', 'column', 'review', etc."));
-  $form .= form_select(t("Content type"), "type", $edit[type], $types, t("The content type to bind or associate this category with."));
-  $form .= form_select(t("Comment"), "comment", $edit[comment], node_comment_status(), t("By default, allow or dissallow users to post comments in this category."));
-  $form .= form_select(t("Promote"), "promote", $edit[promote], node_promote_status(), t("By default, promote new submissions in this category to the front page."));
-
-  $form .= form_select(t("Submission"), "submission", $edit[submission], node_submission_status(), t("What to do with new submissions in this category?"));
-  $form .= form_select(t("Post threshold"), "post", $edit[post], $threshold_post, t("If new submissions are subject to moderation, select a post threshold."));
-  $form .= form_select(t("Dump threshold"), "dump", $edit[dump], $threshold_dump, t("If new submissions are subject to moderation, select a dump threshold."));
-  $form .= form_select(t("Expiration threshold"), "expire", $edit[expire], $threshold_expire, t("If new submissions are subject to moderation, select a expiration threshold."));
-
-  if ($edit[cid]) {
-    $form .= form_hidden("cid", $edit[cid]);
-    $form .= form_submit(t("Save category"));
-    $form .= form_submit(t("Delete category"));
-  }
-  else {
-    $form .= form_submit(t("Save category"));
-  }
-
-  return form("admin.php?mod=structure&type=category", $form);
-}
-
-function category_overview() {
-  $result = db_query("SELECT * FROM category ORDER BY name");
-
-  $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
-  $output .= " <TR><TH>name</TH><TH>type</TH><TH>comment</TH><TH>promote</TH><TH>submissions</TH><TH>operations</TH></TR>\n";
-  while ($category = db_fetch_object($result)) {
-    $output .= " <TR><TD>". check_output($category->name) ."</TD><TD>". check_output($category->type) ."</TD><TD>". node_comment_status($category->comment) ."</TD><TD>". node_promote_status($category->promote) ."</TD><TD>". node_submission_status($category->submission) ."". ($category->submission ? "<BR><SMALL>post: $category->post, dump: $category->dump, expire: $category->expire</SMALL>" : "") ."</TD><TD><A HREF=\"admin.php?mod=structure&type=category&op=edit&id=$category->cid\">edit category</A></TD></TR>\n";
-  }
-  $output .= "</TABLE>\n";
-  return $output;
-}
-
-// ---- topic ----
-
-function topic_form($edit = array()) {
-
-  $result = db_query("SELECT * FROM topic WHERE name != '$edit[name]' ORDER BY name DESC");
-  while ($topic = db_fetch_object($result)) {
-    $topics[$topic->tid] = $topic->name;
-  }
-  $topics[0] = " ";
-
-  $form .= form_textfield(t("Name"), "name", $edit[name], 30, 55, t("A unique name for this topic like 'science', 'internet', 'culture', etc."));
-  $form .= form_select(t("Parent"), "pid", $edit[pid], $topics, t("The parent topic this topic belongs in."));
-  $form .= form_textfield("Moderate", "moderate", $edit[moderate], 35, 255, t("Provide a comma-seperated list of the moderators' usernames."));
-
-  if ($edit[tid]) {
-    $form .= form_hidden("tid", $edit[tid]);
-    $form .= form_submit(t("Save topic"));
-    $form .= form_submit(t("Delete topic"));
-  }
-  else {
-    $form .= form_submit(t("Save topic"));
-  }
-
-  return form("admin.php?mod=structure&type=topic", $form);
-}
-
-function topic_overview() {
-  $tree = topic_tree();
-
-  $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
-  $output .= " <TR><TH>name</TH><TH>moderators</TH><TH>operations</TH></TR>\n";
-  foreach ($tree as $id=>$name) {
-    $topic = topic_get_object("tid", $id);
-    $output .= " <TR><TD>". check_output($name) ."</TD><TD>". check_output($topic->moderate) ."</TD><TD><A HREF=\"admin.php?mod=structure&type=topic&op=edit&id=$topic->tid\">edit topic</A></TD></TR>\n";
-  }
-  $output .= "</TABLE>\n";
-  return $output;
-}
-
-// ----- structure -----
-
-function structure_overview() {
-  $output .= "<H3>Categories</H3>\n";
-  $output .= category_overview();
-  $output .= "<H3>Topics</H3>\n";
-  $output .= topic_overview();
-  return $output;
-}
-
-function structure_admin() {
-  global $id, $op, $type, $edit;
-
-  print "<SMALL><A HREF=\"admin.php?mod=structure&type=category&op=add\">add new category</A> | <A HREF=\"admin.php?mod=structure&type=topic&op=add\">add new topic</A> | <A HREF=\"admin.php?mod=structure\">overview</A></SMALL><HR>\n";
-
-  switch ($type) {
-    case "category":
-      switch ($op) {
-        case "add":
-        print category_form();
-        break;
-      case "edit":
-        print category_form(category_get_array("cid", $id));
-        break;
-      case "view":
-        print category_view($id);
-        break;
-      case "Delete category":
-        print status(category_del($edit[cid]));
-        print structure_overview();
-        break;
-      case "Save category":
-        print status(category_save($edit));
-        print structure_overview();
-        break;
-      default:
-        print structure_overview();
-      }
-      break;
-   case "topic":
-      switch ($op) {
-        case "add":
-        print topic_form();
-        break;
-      case "edit":
-        print topic_form(topic_get_array("tid", $id));
-        break;
-      case "view":
-        print topic_view($id);
-        break;
-      case "Delete topic":
-        print status(topic_del($edit[tid]));
-        print structure_overview();
-        break;
-      case "Save topic":
-        print status(topic_save($edit));
-        print structure_overview();
-        break;
-      default:
-        print structure_overview();
-      }
-      break;
-   default:
-      print structure_overview();
-   }
-}
-
-?>
\ No newline at end of file
diff --git a/submit.php b/submit.php
index 3d5d0af1931712f2c1206c497b7ea8c4bcc53895..bff09fac3961942f093646ba6fb80442b78bd3b8 100644
--- a/submit.php
+++ b/submit.php
@@ -9,13 +9,11 @@
     module_invoke($mod, "user");
   }
   else {
-    $result = db_query("SELECT * FROM category");
-
-    while ($category = db_fetch_object($result)) {
-      if (module_hook($category->type, "user")) $options .= "<OPTION VALUE=\"$category->type\">$category->name</OPTION>";
+    foreach (module_list() as $name) {
+      if (module_hook($name, "user")) $options .= "<OPTION VALUE=\"$name\">$name</OPTION>";
     }
 
-    $form .= form_item(t("Category"), "<SELECT NAME=\"mod\">$options</SELECT>");
+    $form .= form_item(t("Type"), "<SELECT NAME=\"mod\">$options</SELECT>");
     $form .= form_submit(t("Next step"));
 
     $output .= "<P>". t("If you have written something or if you have some news or thoughts that you would like to share, then this is the place where you can submit new content.  Fill out this form and your contribution will automatically get whisked away to our submission queue where our moderators will frown at it, poke at it and hopefully post it.") ."</P>";
diff --git a/themes/example/example.theme b/themes/example/example.theme
index ad8a92cff071363d074f56cb9cd98e7e422fdf00..caa3c951853e028c79944685678eeb72ba8f3298 100644
--- a/themes/example/example.theme
+++ b/themes/example/example.theme
@@ -10,7 +10,7 @@
   *********************************************************************/
 
   class Theme extends BaseTheme {
-    // General colorset that can be used for this theme 
+    // General colorset that can be used for this theme
     var $foreground = "#000000";
     var $background = "#FFFFFF";
 
@@ -69,7 +69,7 @@ function node($node, $main = 0, $links = 0) {
                    </TD>
                    <TD ALIGN="right">
 <?php
-                     echo category_name($node->cid) ." / ". topic_name($node->tid);
+                     echo node_index($node->attribute);
 ?>
                    </TD>
                  </TR>
diff --git a/themes/goofy/goofy.theme b/themes/goofy/goofy.theme
index c51d438a79d9e32707aa1a86c7d1ecdbcfa904e6..56c28dd78fe736b82dd7cacd1f9d8d053d0c28e2 100644
--- a/themes/goofy/goofy.theme
+++ b/themes/goofy/goofy.theme
@@ -12,7 +12,7 @@
   *********************************************************************/
 
   class Theme extends BaseTheme {
-    // General colorset that can be used for this theme 
+    // General colorset that can be used for this theme
     var $foreground = "#000000";
     var $background = "#FFFFFF";
 
@@ -103,13 +103,12 @@ function node($node, $main = 0, $links = 0) {
       echo "\n<!-- node: \"$node->title\" -->\n";
       $title = check_output($node->title);
       $subleft = strtr(t("Submitted by %a on %b"), array("%a" => format_username($node->userid), "%b" => format_date($node->timestamp, "large")));
-      $subright = category_name($node->cid) ." / ". topic_name($node->tid);
+      $subright = node_index($node->attribute);
       $body = check_output($node->body, 1) . ($main || $links ? "<hr color=\"#404040\" size=\"1\"><div align=\"right\">" . $this->links($links, $main, $node) . "</div>" : "");
       print "<script language=\"JavaScript\"><!--\ns(\"". $this->stripbreaks(addslashes($title)) ."\",\"". $this->stripbreaks(addslashes($subleft)) ."\",\"". $this->stripbreaks(addslashes($subright)) ."\",\"". $this->stripbreaks(addslashes($body)) ."\"); // -->\n</script>\n";
     } // close node function
 
 
-
     function comment($comment, $link = "") {
       echo "<A NAME=\"$comment->cid\"></A>\n";
 
@@ -125,7 +124,6 @@ function comment($comment, $link = "") {
     } // close comment function
 
 
-
     function stripbreaks($a) { // helper function for generating the javascripted boxes
       return str_replace("\n","\\n",str_replace("\r","\\r",$a));
     } // close stripbreaks function
@@ -136,9 +134,6 @@ function box($subject, $content, $options = "") {
     } // close box function
 
 
-
-
-
     function footer() {
 ?>
               </td>
diff --git a/themes/jeroen/jeroen.theme b/themes/jeroen/jeroen.theme
index 56eea634641b59b1616a0b553b63cd23d0698501..26bb678b508c5b7d5988560718a2e6d0465fe7e6 100644
--- a/themes/jeroen/jeroen.theme
+++ b/themes/jeroen/jeroen.theme
@@ -10,10 +10,10 @@
   *********************************************************************/
 
   class Theme extends BaseTheme {
-    // General colorset that can be used for this theme 
+    // General colorset that can be used for this theme
     var $foreground = "#000000";
     var $background = "#E7E7E7";
-    
+
     /*
       I am going to use some colors throughout this theme:
       #000000 : black used for all links and the table in every box you'll see, I use it to create the thin black border around each.
@@ -122,7 +122,7 @@ function node($node, $main = 0, $links = 0) {
                                   </FONT>
                                 </td>
 <?php
-                                echo "<td align=\"right\" background=\"themes/jeroen/images/menutitle.gif\" nowrap><b>". category_name($node->cid) ." / ". topic_name($node->tid) ."</b>";
+                                echo "<td align=\"right\" background=\"themes/jeroen/images/menutitle.gif\" nowrap><b>". node_index($node->attribute) ."</b>";
 ?>
                                 </td>
                               </tr>
diff --git a/themes/marvin/marvin.theme b/themes/marvin/marvin.theme
index ab76f8fe1a21b0b7d76047caefe2384824300f54..108f4acfc753238a694e820d944ef67e1869fc19 100644
--- a/themes/marvin/marvin.theme
+++ b/themes/marvin/marvin.theme
@@ -13,7 +13,7 @@
  class Theme extends BaseTheme {
    var $link = "#666699";
 
-   // General colorset that can be used for this theme 
+   // General colorset that can be used for this theme
    var $foreground = "#000000";
    var $background = "#EAEAEA";
 
@@ -48,29 +48,6 @@ function header() {
     <?php
    }
 
-   function story($story, $main = 0) {
-     print "\n<!-- story: \"$story->title\" -->\n";
-     print "<TABLE BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"2\" WIDTH=\"100%\">\n";
-     print " <TR><TD COLSPAN=\"2\"><IMG SRC=\"themes/marvin/images/drop.gif\" ALT=\"\"> &nbsp; <B>". check_output($story->title) ."</B></TD></TR>\n";
-     print " <TR VALIGN=\"bottom\"><TD COLSPAN=\"2\" BGCOLOR=\"#000000\" WIDTH=\"100%\"><IMG SRC=\"themes/marvin/images/pixel.gif\" WIDTH=\"1\" HEIGHT=\"0\" ALT=\"\"></TD></TR>\n";
-     print " <TR>\n";
-     print "  <TD>\n";
-     print "   <FONT COLOR=\"#7C7C7C\"><SMALL>". strtr(t("Submitted by %a on %b"), array("%a" => format_username($story->userid), "%b" => format_date($story->timestamp, "large"))); ?><?php print "</SMALL></FONT></TD><TD ALIGN=\"right\" VALIGN=\"top\" NOWRAP><SMALL>". category_name($story->cid) ." / ". topic_name($story->tid) ."</SMALL>\n";
-     print "  </TD>\n";
-     print " </TR>\n";
-     print " <TR><TD COLSPAN=\"2\">&nbsp;</TD></TR>\n";
-     print " <TR>\n";
-     print "  <TD COLSPAN=\"2\">\n";
-     if ($story->abstract) print "<P>". check_output($story->abstract, 1) ."</P>\n";
-     if (!$main && $story->body) print "   <P>". check_output($story->body, 1) ."</P>\n";
-     print "  </TD>\n";
-     print " </TR>\n";
-     print " <TR><TD COLSPAN=\"2\">&nbsp;</TD></TR>\n";
-     if ($main || $links) print " <TR><TD COLSPAN=\"2\">". $this->links($links, $main, $node) ."</TD></TR>\n";
-     print "</TABLE>\n";
-     print "<BR><BR>\n\n";
-   }
-
    function node($node, $main = 0, $links = 0) {
      print "\n<!-- node: \"$node->title\" -->\n";
      print "<TABLE BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"2\" WIDTH=\"100%\">\n";
@@ -78,7 +55,7 @@ function node($node, $main = 0, $links = 0) {
      print " <TR VALIGN=\"bottom\"><TD COLSPAN=\"2\" BGCOLOR=\"#000000\" WIDTH=\"100%\"><IMG SRC=\"themes/marvin/images/pixel.gif\" WIDTH=\"1\" HEIGHT=\"0\" ALT=\"\"></TD></TR>\n";
      print " <TR>\n";
      print "  <TD>\n";
-     print "   <FONT COLOR=\"#7C7C7C\"><SMALL>". strtr(t("Submitted by %a on %b"), array("%a" => format_username($node->userid), "%b" => format_date($node->timestamp, "large"))); ?><?php print "</SMALL></FONT></TD><TD ALIGN=\"right\" VALIGN=\"top\" NOWRAP><SMALL>". category_name($node->cid) ." / ". topic_name($node->tid) ."</SMALL>\n";
+     print "   <FONT COLOR=\"#7C7C7C\"><SMALL>". strtr(t("Submitted by %a on %b"), array("%a" => format_username($node->userid), "%b" => format_date($node->timestamp, "large"))); ?><?php print "</SMALL></FONT></TD><TD ALIGN=\"right\" VALIGN=\"top\" NOWRAP><SMALL>". node_index($node->attribute) ."</SMALL>\n";
      print "  </TD>\n";
      print " </TR>\n";
      print " <TR><TD COLSPAN=\"2\">&nbsp;</TD></TR>\n";
diff --git a/themes/unconed/unconed.theme b/themes/unconed/unconed.theme
index 54c938dd5fe6af4a7cbf11ecb848c6c937d2d2f4..cd20fe3ab38eab05107b09c1b404b30c28a77e25 100644
--- a/themes/unconed/unconed.theme
+++ b/themes/unconed/unconed.theme
@@ -42,8 +42,6 @@ function header() {
      <HTML>
      <HEAD>
       <TITLE><?php echo variable_get(site_name, "drupal"); ?></TITLE>
-      <META NAME="description" CONTENT="drop.org">
-      <META NAME="keywords" CONTENT="drop, weblog, portal, community, news, article, announcements, stories, story, computer, science, space, hype, cult, geek, nerd, foo, bar">
      </HEAD>
      <STYLE type="text/css">
       <!--
@@ -91,7 +89,7 @@ function node($node, $main = 0, $links = 0) {
           <TR><TD COLSPAN="2" BGCOLOR="<?php echo $this->bgcolor1; ?>" WIDTH="100%"><table width="100%" cellpadding="0" cellspacing="0"><tr><td width="100%"><FONT COLOR="<?php echo $this->fgcolor1; ?>"><B><?php echo "". check_output($node->title) .""; ?></B></FONT></td><td valign="middle" align="center"><IMG SRC="themes/<?php print $this->themename; ?>/images/icon.gif" valign="middle"></td></tr></table></TD></TR>
           <TR BGCOLOR="<?php echo $this->bgcolor2; ?>">
            <?php
-            print "<TD WIDTH=\"70%\" BGCOLOR=\"$this->bgcolor2\"><SMALL>" . strtr(t("Submitted by %a on %b"), array("%a" => format_username($node->userid), "%b" => format_date($node->timestamp, "large"))) . "</TD><TD WIDTH=\"30%\" BGCOLOR=\"$this->bgcolor2\" ALIGN=\"center\" NOWRAP><B>". category_name($node->cid) ." / ". topic_name($node->tid) ."</B>";
+            print "<TD WIDTH=\"70%\" BGCOLOR=\"$this->bgcolor2\"><SMALL>" . strtr(t("Submitted by %a on %b"), array("%a" => format_username($node->userid), "%b" => format_date($node->timestamp, "large"))) . "</TD><TD WIDTH=\"30%\" BGCOLOR=\"$this->bgcolor2\" ALIGN=\"center\" NOWRAP><B>". node_index($node->attribute) ."</B>";
            ?>
           </TD>
          </TR>
diff --git a/themes/yaroon/yaroon.theme b/themes/yaroon/yaroon.theme
index d509606bfa499b4504f6c8e4d38c5d860d165415..4aefd8a1a07a92a2cfb1ef5ca0daff6afac5f427 100644
--- a/themes/yaroon/yaroon.theme
+++ b/themes/yaroon/yaroon.theme
@@ -12,7 +12,7 @@
   class Theme extends BaseTheme {
     var $foreground = "#000000";
     var $background = "#F0F0F0";
-   
+
     function header() {
 
     global $PHP_SELF, $REQUEST_URI, $cid, $id;
@@ -110,7 +110,7 @@ function do_nav() {
 <?php
 
     } // close header function
-    
+
 
     function node($node, $main = 0, $links = 0) {
 
diff --git a/updates/2.00-to-x.xx.sql b/updates/2.00-to-x.xx.sql
index c0c1890ce1d51af15b2c3da2096feadb059cbd3f..da1b0bd0574c7bf2d56e99045884c0422472a42d 100644
--- a/updates/2.00-to-x.xx.sql
+++ b/updates/2.00-to-x.xx.sql
@@ -215,3 +215,7 @@ ALTER TABLE node ADD timestamp_posted int(11) NOT NULL;
 ALTER TABLE node ADD timestamp_queued int(11) NOT NULL;
 ALTER TABLE node ADD timestamp_hidden int(11) NOT NULL;
 ALTER TABLE node ADD attribute varchar(255) DEFAULT '' NOT NULL;
+
+# 10/06/01
+ALTER TABLE node DROP cid;
+ALTER TABLE node DROP tid;