diff --git a/includes/common.inc b/includes/common.inc
index 5e4fa290cb5477d42571160b8722f97289234921..1cf0b3c61d64d8ba6e5c367126e34f25c88ab8db 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -10,7 +10,7 @@ function drupal_set_title($title = NULL) {
   static $stored_title;
 
   if (isset($title)) {
-    $stored_title = $title;
+    $stored_title = ucfirst($title);
   }
   return $stored_title;
 }
diff --git a/includes/theme.inc b/includes/theme.inc
index 3e8af9546d0c82b3b47911111f0f3cb5c5ee73ed..505c727f42a4161762ab83df75ba1361d3fa897e 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -16,17 +16,15 @@
 /**
   Returns the theme header.
 
-  @param $title (optional) override the page title.
-
   @return a string containing the \a header output.
 **/
-function theme_header($title = "") {
+function theme_header() {
   global $base_url;
 
   $output = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
   $output .= "<html xmlns=\"http://www.w3.org/1999/xhtml\">";
   $output .= "<head>";
-  $output .= " <title>". $title ? $title : variable_get(site_name, "drupal") ."</title>";
+  $output .= " <title>". drupal_get_title() ? drupal_get_title() : variable_get(site_name, "drupal") ."</title>";
   $output .= theme_head($main);
   $output .= " <style type=\"text/css\" media=\"all\">";
   $output .= "  @import url(misc/drupal.css);";
@@ -49,6 +47,27 @@ function theme_header($title = "") {
   return $output;
 }
 
+/**
+  Returns an entire Drupal page displaying the supplied content.
+  @param $content a string containing the content to display.
+
+  @return a string containing the \a page output.
+**/
+function theme_page($content, $title = NULL, $breadcrumb = NULL) {
+  if (isset($title)) {
+    drupal_set_title($title);
+  }
+  if (isset($breadcrumb)) {
+    drupal_set_breadcrumb($breadcrumb);
+  }
+
+  $output = theme("header");
+  $output .= $content;
+  $output .= theme("footer");
+
+  return $output;
+}
+
 /**
   Returns themed set of links.
 
@@ -98,16 +117,22 @@ function theme_breadcrumb($breadcrumb) {
   \li \c $node->username the username of the poster.
 
   @param $node the \a node to be themed.
-  @param $main
+  @param $main Display teaser only, as on main page?
+  @param $page Display node as standalone page (no title)?
 
   @return a string containing the \a node output.
 **/
-function theme_node($node, $main) {
+function theme_node($node, $main = 0, $page = 0) {
   if (module_exist("taxonomy")) {
     $terms = taxonomy_link("taxonomy terms", $node);
   }
 
-  $output = "<h2>$node->title</h2> by ". format_name($node);
+  if ($page == 0) {
+    $output = "<h2>$node->title</h2> by ". format_name($node);
+  }
+  else {
+    $output = "by ". format_name($node);
+  }
 
   if (count($terms)) {
     $output .= " <small>(". print theme("links", $terms) .")</small><br />";
diff --git a/index.php b/index.php
index 06c23390cfd2feba61bad11014306551d22137c2..76fdd98ff2cd18bca959d130ea385f8e1fd790ef 100644
--- a/index.php
+++ b/index.php
@@ -13,8 +13,7 @@
   menu_execute_active_handler();
 }
 else {
-  print theme("header");
-  print theme("footer");
+  print theme("page", "");
 }
 
 drupal_page_footer();
diff --git a/modules/admin.module b/modules/admin.module
index e1de707d69b8d3a559634ba60782620329e1668f..b82fc2f8ef227135bc9db38829bd78b081b18ed8 100644
--- a/modules/admin.module
+++ b/modules/admin.module
@@ -26,14 +26,10 @@ function admin_link($type) {
 
 function admin_admin() {
   if (user_access("access administration pages")) {
-    print theme("header");
-    print watchdog_overview("actions");
-    print theme("footer");
+    print theme("page", watchdog_overview("actions"));
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/aggregator.module b/modules/aggregator.module
index a01b46653ea6cd4af477c7bf5a2ffa74c0cd5a26..e4a644a6c28a30efb736f83938ef1ef76ca2fc1e 100644
--- a/modules/aggregator.module
+++ b/modules/aggregator.module
@@ -76,9 +76,7 @@ function import_help($section = "admin/help#import") {
 }
 
 function import_help_page() {
-  print theme("header");
-  print import_help();
-  print theme("footer");
+  print theme("page", import_help());
 }
 
 function import_settings() {
@@ -618,14 +616,10 @@ function import_admin() {
       default:
         $output .=  import_view();
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/aggregator/aggregator.module b/modules/aggregator/aggregator.module
index a01b46653ea6cd4af477c7bf5a2ffa74c0cd5a26..e4a644a6c28a30efb736f83938ef1ef76ca2fc1e 100644
--- a/modules/aggregator/aggregator.module
+++ b/modules/aggregator/aggregator.module
@@ -76,9 +76,7 @@ function import_help($section = "admin/help#import") {
 }
 
 function import_help_page() {
-  print theme("header");
-  print import_help();
-  print theme("footer");
+  print theme("page", import_help());
 }
 
 function import_settings() {
@@ -618,14 +616,10 @@ function import_admin() {
       default:
         $output .=  import_view();
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/archive.module b/modules/archive.module
index be2ad00f4844a98093a9d16e6b7715d87c13f14f..594e5f7b7fdc34aa6dba9d5d754fb8b145ef3e8e 100644
--- a/modules/archive.module
+++ b/modules/archive.module
@@ -200,6 +200,12 @@ function archive_link($type) {
     }
   }
 
+  if ($type == "system") {
+    if (user_access("access content")) {
+      menu("archive", t("archives"), "archive_page", 0, 1);
+    }
+  }
+
   return $links;
 }
 
@@ -209,7 +215,7 @@ function archive_page() {
   $op = $_POST["op"];
   $edit = $_POST["edit"];
 
-  print theme("header");
+  $output = "";
 
   if (user_access("access content")) {
     if ($op == t("Show")) {
@@ -236,7 +242,7 @@ function archive_page() {
     $start = "<div class=\"container-inline\">";
     $start .= form_select("", "year", ($year ? $year : date("Y")), $years). form_select("", "month", ($month ? $month : date("m")), $months) . form_select("", "day", ($day ? $day : date("d")), $days) . form_submit(t("Show"));
     $start .= "</div>";
-    print form($start);
+    $output .= form($start);
 
     /*
     ** Fetch nodes for the selected date, or current date if none
@@ -247,15 +253,14 @@ function archive_page() {
       $result = db_query_range("SELECT nid FROM {node} WHERE status = '1' AND created > %d ORDER BY created", $date, 0, 20);
 
       while ($nid = db_fetch_object($result)) {
-        node_view(node_load(array("nid" => $nid->nid)), 1);
+        $output .= node_view(node_load(array("nid" => $nid->nid)), 1);
       }
     }
+    print theme("page", $output);
   }
   else {
-    message_access();
+    print theme("page", message_access());
   }
-
-  print theme("footer");
 }
 
 function archive_settings() {
diff --git a/modules/archive/archive.module b/modules/archive/archive.module
index be2ad00f4844a98093a9d16e6b7715d87c13f14f..594e5f7b7fdc34aa6dba9d5d754fb8b145ef3e8e 100644
--- a/modules/archive/archive.module
+++ b/modules/archive/archive.module
@@ -200,6 +200,12 @@ function archive_link($type) {
     }
   }
 
+  if ($type == "system") {
+    if (user_access("access content")) {
+      menu("archive", t("archives"), "archive_page", 0, 1);
+    }
+  }
+
   return $links;
 }
 
@@ -209,7 +215,7 @@ function archive_page() {
   $op = $_POST["op"];
   $edit = $_POST["edit"];
 
-  print theme("header");
+  $output = "";
 
   if (user_access("access content")) {
     if ($op == t("Show")) {
@@ -236,7 +242,7 @@ function archive_page() {
     $start = "<div class=\"container-inline\">";
     $start .= form_select("", "year", ($year ? $year : date("Y")), $years). form_select("", "month", ($month ? $month : date("m")), $months) . form_select("", "day", ($day ? $day : date("d")), $days) . form_submit(t("Show"));
     $start .= "</div>";
-    print form($start);
+    $output .= form($start);
 
     /*
     ** Fetch nodes for the selected date, or current date if none
@@ -247,15 +253,14 @@ function archive_page() {
       $result = db_query_range("SELECT nid FROM {node} WHERE status = '1' AND created > %d ORDER BY created", $date, 0, 20);
 
       while ($nid = db_fetch_object($result)) {
-        node_view(node_load(array("nid" => $nid->nid)), 1);
+        $output .= node_view(node_load(array("nid" => $nid->nid)), 1);
       }
     }
+    print theme("page", $output);
   }
   else {
-    message_access();
+    print theme("page", message_access());
   }
-
-  print theme("footer");
 }
 
 function archive_settings() {
diff --git a/modules/block.module b/modules/block.module
index 1ae859566099c914ba01a5bf32c2332d92fed45e..a6ba601450a01b2ef194cbc4d3a3e7c6d3754291 100644
--- a/modules/block.module
+++ b/modules/block.module
@@ -54,9 +54,7 @@ function block_help($section = "admin/help#block") {
 }
 
 function block_help_page() {
-  print theme("header");
-  print block_help();
-  print theme("footer");
+  print theme("page", block_help());
 }
 
 function block_perm() {
@@ -312,14 +310,10 @@ function block_admin() {
         $output .= block_admin_display();
     }
 
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/block/block.module b/modules/block/block.module
index 1ae859566099c914ba01a5bf32c2332d92fed45e..a6ba601450a01b2ef194cbc4d3a3e7c6d3754291 100644
--- a/modules/block/block.module
+++ b/modules/block/block.module
@@ -54,9 +54,7 @@ function block_help($section = "admin/help#block") {
 }
 
 function block_help_page() {
-  print theme("header");
-  print block_help();
-  print theme("footer");
+  print theme("page", block_help());
 }
 
 function block_perm() {
@@ -312,14 +310,10 @@ function block_admin() {
         $output .= block_admin_display();
     }
 
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/blog.module b/modules/blog.module
index be73a62de436cdae89f9ae58a540f62cede60f9e..b7f3ab8c2ab60878c22a9c3edc3c58725eb8c9a5 100644
--- a/modules/blog.module
+++ b/modules/blog.module
@@ -116,34 +116,36 @@ function blog_page_user($uid) {
   $account = user_load(array((is_numeric($uid) ? "uid" : "name") => $uid, "status" => 1));
 
   // Breadcrumb navigation:
-  $breadcrumb[] = l(t("Home"), NULL);
-  $breadcrumb[] = l(t("Blogs"), "blog");
-  $breadcrumb[] = t("%name's blog", array("%name" => $account->name));
-  print theme("breadcrumb", $breadcrumb);
+  $breadcrumb[] = l(t("Home"), "");
+  $breadcrumb[] = t("blogs");
+
+  $title = t("%name's blog", array("%name" => $account->name));
+  $output = "";
 
   $result = pager_query("SELECT nid FROM {node} WHERE type = 'blog' AND uid = '$account->uid' AND status = 1 ORDER BY nid DESC", variable_get("default_nodes_main", 10));
   while ($node = db_fetch_object($result)) {
-    node_view(node_load(array("nid" => $node->nid)), 1);
+    $output .= node_view(node_load(array("nid" => $node->nid)), 1);
   }
-  print pager_display(NULL, variable_get("default_nodes_main", 10));
-  print "<div class=\"xml-icon\">" . l("<img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" alt=\"\" title=\"\" />", "blog/feed/$account->uid", array("title" => t("View the XML version of %username's blog", array("%username" => $account->name)))) . "</div>";
+  $output .= pager_display(NULL, variable_get("default_nodes_main", 10));
+  $output .= "<div class=\"xml-icon\">" . l("<img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" alt=\"\" title=\"\" />", "blog/feed/$account->uid", array("title" => t("View the XML version of %username's blog", array("%username" => $account->name)))) . "</div>";
+
+  print theme("page", $output, $title);
 }
 
 function blog_page_last() {
   global $user;
 
-  // Breadcrumb navigation:
-  $breadcrumb[] = l(t("Home"), NULL);
-  $breadcrumb[] = t("Blogs");
-  print theme("breadcrumb", $breadcrumb);
+  $output = "";
 
   $result = pager_query("SELECT nid FROM {node} WHERE type = 'blog' AND status = 1 ORDER BY nid DESC", variable_get("default_nodes_main", 10));
 
   while ($node = db_fetch_object($result)) {
-    node_view(node_load(array("nid" => $node->nid)), 1);
+    $output .= node_view(node_load(array("nid" => $node->nid)), 1);
   }
-  print pager_display(NULL, variable_get("default_nodes_main", 10));
-  print "<div class=\"xml-icon\">". l("<img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" alt=\"\" title=\"\" />", "blog/feed", array("title" => t("Read the XML version of all blogs."))) ."</div>";
+  $output .= pager_display(NULL, variable_get("default_nodes_main", 10));
+  $output .= "<div class=\"xml-icon\">". l("<img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" alt=\"\" title=\"\" />", "blog/feed", array("title" => t("Read the XML version of all blogs."))) ."</div>";
+
+  print theme("page", $output);
 }
 
 function blog_validate(&$node) {
@@ -207,20 +209,16 @@ function blog_page() {
         }
         break;
       default:
-        print theme("header");
         if (arg(1)) {
           blog_page_user(arg(1));
         }
         else {
           blog_page_last();
         }
-        print theme("footer");
     }
   }
   else {
-    print theme("header");
-    print theme("box", t("Access denied"), message_access());
-    print theme("footer");
+    print theme("page", message_access());
   }
 
 }
@@ -231,18 +229,19 @@ function blog_content($node) {
   return $node;
 }
 
-function blog_view($node, $main = 0) {
-  if ($main == 0) {
+function blog_view($node, $main = 0, $page = 0) {
+  if ($page) {
     // Breadcrumb navigation
-    $breadcrumb[] = l(t("Home"), NULL);
+    $breadcrumb[] = l(t("Home"), "");
+    $breadcrumb[] = l(t("blogs"), "blog");
     $breadcrumb[] = l(t("%name's blog", array("%name" => $node->name)), "blog/$node->uid");
-    // print the breadcrumb
-    print theme("breadcrumb", $breadcrumb);
+    // set the breadcrumb
+    drupal_set_breadcrumb($breadcrumb);
   }
-  // prepair the node content
+  // prepare the node content
   $node = blog_content($node);
   // print the node
-  print theme("node", $node, $main);
+  return theme("node", $node, $main, $page);
 }
 
 function blog_link($type, $node = 0, $main) {
@@ -258,7 +257,7 @@ function blog_link($type, $node = 0, $main) {
       menu("blog/" . $user->uid, t("my blog"), "blog_page", 1);
     }
     if (user_access("access content")) {
-      menu("blog", t("blog"), "blog_page", 0, 1);
+      menu("blog", t("blogs"), "blog_page", 0, 1);
     }
   }
 
diff --git a/modules/blog/blog.module b/modules/blog/blog.module
index be73a62de436cdae89f9ae58a540f62cede60f9e..b7f3ab8c2ab60878c22a9c3edc3c58725eb8c9a5 100644
--- a/modules/blog/blog.module
+++ b/modules/blog/blog.module
@@ -116,34 +116,36 @@ function blog_page_user($uid) {
   $account = user_load(array((is_numeric($uid) ? "uid" : "name") => $uid, "status" => 1));
 
   // Breadcrumb navigation:
-  $breadcrumb[] = l(t("Home"), NULL);
-  $breadcrumb[] = l(t("Blogs"), "blog");
-  $breadcrumb[] = t("%name's blog", array("%name" => $account->name));
-  print theme("breadcrumb", $breadcrumb);
+  $breadcrumb[] = l(t("Home"), "");
+  $breadcrumb[] = t("blogs");
+
+  $title = t("%name's blog", array("%name" => $account->name));
+  $output = "";
 
   $result = pager_query("SELECT nid FROM {node} WHERE type = 'blog' AND uid = '$account->uid' AND status = 1 ORDER BY nid DESC", variable_get("default_nodes_main", 10));
   while ($node = db_fetch_object($result)) {
-    node_view(node_load(array("nid" => $node->nid)), 1);
+    $output .= node_view(node_load(array("nid" => $node->nid)), 1);
   }
-  print pager_display(NULL, variable_get("default_nodes_main", 10));
-  print "<div class=\"xml-icon\">" . l("<img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" alt=\"\" title=\"\" />", "blog/feed/$account->uid", array("title" => t("View the XML version of %username's blog", array("%username" => $account->name)))) . "</div>";
+  $output .= pager_display(NULL, variable_get("default_nodes_main", 10));
+  $output .= "<div class=\"xml-icon\">" . l("<img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" alt=\"\" title=\"\" />", "blog/feed/$account->uid", array("title" => t("View the XML version of %username's blog", array("%username" => $account->name)))) . "</div>";
+
+  print theme("page", $output, $title);
 }
 
 function blog_page_last() {
   global $user;
 
-  // Breadcrumb navigation:
-  $breadcrumb[] = l(t("Home"), NULL);
-  $breadcrumb[] = t("Blogs");
-  print theme("breadcrumb", $breadcrumb);
+  $output = "";
 
   $result = pager_query("SELECT nid FROM {node} WHERE type = 'blog' AND status = 1 ORDER BY nid DESC", variable_get("default_nodes_main", 10));
 
   while ($node = db_fetch_object($result)) {
-    node_view(node_load(array("nid" => $node->nid)), 1);
+    $output .= node_view(node_load(array("nid" => $node->nid)), 1);
   }
-  print pager_display(NULL, variable_get("default_nodes_main", 10));
-  print "<div class=\"xml-icon\">". l("<img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" alt=\"\" title=\"\" />", "blog/feed", array("title" => t("Read the XML version of all blogs."))) ."</div>";
+  $output .= pager_display(NULL, variable_get("default_nodes_main", 10));
+  $output .= "<div class=\"xml-icon\">". l("<img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" alt=\"\" title=\"\" />", "blog/feed", array("title" => t("Read the XML version of all blogs."))) ."</div>";
+
+  print theme("page", $output);
 }
 
 function blog_validate(&$node) {
@@ -207,20 +209,16 @@ function blog_page() {
         }
         break;
       default:
-        print theme("header");
         if (arg(1)) {
           blog_page_user(arg(1));
         }
         else {
           blog_page_last();
         }
-        print theme("footer");
     }
   }
   else {
-    print theme("header");
-    print theme("box", t("Access denied"), message_access());
-    print theme("footer");
+    print theme("page", message_access());
   }
 
 }
@@ -231,18 +229,19 @@ function blog_content($node) {
   return $node;
 }
 
-function blog_view($node, $main = 0) {
-  if ($main == 0) {
+function blog_view($node, $main = 0, $page = 0) {
+  if ($page) {
     // Breadcrumb navigation
-    $breadcrumb[] = l(t("Home"), NULL);
+    $breadcrumb[] = l(t("Home"), "");
+    $breadcrumb[] = l(t("blogs"), "blog");
     $breadcrumb[] = l(t("%name's blog", array("%name" => $node->name)), "blog/$node->uid");
-    // print the breadcrumb
-    print theme("breadcrumb", $breadcrumb);
+    // set the breadcrumb
+    drupal_set_breadcrumb($breadcrumb);
   }
-  // prepair the node content
+  // prepare the node content
   $node = blog_content($node);
   // print the node
-  print theme("node", $node, $main);
+  return theme("node", $node, $main, $page);
 }
 
 function blog_link($type, $node = 0, $main) {
@@ -258,7 +257,7 @@ function blog_link($type, $node = 0, $main) {
       menu("blog/" . $user->uid, t("my blog"), "blog_page", 1);
     }
     if (user_access("access content")) {
-      menu("blog", t("blog"), "blog_page", 0, 1);
+      menu("blog", t("blogs"), "blog_page", 0, 1);
     }
   }
 
diff --git a/modules/book.module b/modules/book.module
index 94f123447c27b3cf63dfc2a89a8ab7995ea5ad75..0f36bc35763147cb1b8f6ac294f5f5f59a963baf 100644
--- a/modules/book.module
+++ b/modules/book.module
@@ -383,7 +383,7 @@ function book_content($node) {
   return $node;
 }
 
-function book_view($node, $main = 0) {
+function book_view($node, $main = 0, $page = 0) {
   $node = book_content($node);
   /*
   ** Display the node.  If not displayed on the main page, we render
@@ -391,30 +391,35 @@ function book_view($node, $main = 0) {
   ** and the next page.
   */
 
+  $output = "";
+
   if ($main) {
-    print theme("node", $node, $main);
+    $output .= theme("node", $node, $main, $page);
   }
   else {
     if ($node->moderate) {
       $node->body = $node->body . "<div class=\"log\"><div class=\"title\">". t("Log") .":</div>$node->log</div>";
     }
     // Add the navigation and the breadcrumb if we view a page
-    if (arg(1) == "view") {
+    if ($page) {
       $node = book_navigation($node);
       // Print the breadcrumb
-      print theme("breadcrumb", $node->breadcrumb);
+      drupal_set_breadcrumb($node->breadcrumb);
     }
     // Print the node
-    print theme("node", $node, $main);
+    $output .= theme("node", $node, $main, $page);
   }
+
+  return $output;
 }
 
 function book_show($node, $cid) {
+  $output = "";
 
   if (node_access("view", $node)) {
 
     if ($node->type == "book") {
-      book_view($node, 0);
+      $output .= book_view($node, 0, 1);
     }
     else {
 
@@ -443,8 +448,8 @@ function book_show($node, $cid) {
         /*
         ** View the node
         */
-        print theme("breadcrumb", $node->breadcrumb);
-        print theme("node", $node, 0);
+        drupal_set_breadcrumb($node->breadcrumb);
+        $output .= theme("node", $node, 0, 1);
       }
       else {
 
@@ -452,11 +457,11 @@ function book_show($node, $cid) {
         ** We can't get the content of the node and just view the node.
         ** We don't add breadcrums or links.
         */
-        node_view($node, 0);
+        $output .= node_view($node, 0, 1);
       }
     }
     if (function_exists("comment_render") && $node->comment) {
-      comment_render($node, $cid);
+      $output .= comment_render($node, $cid);
     }
 
     /*
@@ -464,6 +469,10 @@ function book_show($node, $cid) {
     */
     node_tag_new($node->nid);
   }
+  else {
+    $output .= message_access();
+  }
+  return $output;
 }
 
 function book_navigation($node) {
@@ -476,7 +485,7 @@ function book_navigation($node) {
 
     $node->breadcrumb = ""; // Overwrite the trail with a book trail.
     $node->breadcrumb[] = l(t("Home"), "");
-    $node->breadcrumb[] = l(t("Books"), "book");
+    $node->breadcrumb[] = l(t("books"), "book");
     foreach ($path as $level) {
       $node->breadcrumb[] = l($level->title, "book/view/$level->nid");
     }
@@ -625,9 +634,7 @@ function book_render() {
   }
 
   drupal_set_title(t("Books"));
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function book_page() {
@@ -636,9 +643,8 @@ function book_page() {
     switch (arg(1)) {
       case "view":
         $node = node_load(array("nid" => arg(2)));
-        print theme("header");
-        book_show($node, arg(3));
-        print theme("footer");
+        $output = book_show($node, arg(3));
+        print theme("page", $output, $node->title);
         break;
       case "print":
         print book_print(arg(2), $depth = 1);
@@ -648,10 +654,7 @@ function book_page() {
     }
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -805,9 +808,7 @@ function book_admin_orphan() {
     $output .= theme("table", $header, $rows);
   }
 
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function book_admin_links() {
@@ -839,14 +840,10 @@ function book_admin() {
         $output .= book_admin_view(arg(3));
         break;
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -883,8 +880,6 @@ function book_help($section = "admin/help#book") {
 }
 
 function book_help_page() {
-  print theme("header");
-  print book_help();
-  print theme("footer");
+  print theme("page", book_help());
 }
 ?>
diff --git a/modules/book/book.module b/modules/book/book.module
index 94f123447c27b3cf63dfc2a89a8ab7995ea5ad75..0f36bc35763147cb1b8f6ac294f5f5f59a963baf 100644
--- a/modules/book/book.module
+++ b/modules/book/book.module
@@ -383,7 +383,7 @@ function book_content($node) {
   return $node;
 }
 
-function book_view($node, $main = 0) {
+function book_view($node, $main = 0, $page = 0) {
   $node = book_content($node);
   /*
   ** Display the node.  If not displayed on the main page, we render
@@ -391,30 +391,35 @@ function book_view($node, $main = 0) {
   ** and the next page.
   */
 
+  $output = "";
+
   if ($main) {
-    print theme("node", $node, $main);
+    $output .= theme("node", $node, $main, $page);
   }
   else {
     if ($node->moderate) {
       $node->body = $node->body . "<div class=\"log\"><div class=\"title\">". t("Log") .":</div>$node->log</div>";
     }
     // Add the navigation and the breadcrumb if we view a page
-    if (arg(1) == "view") {
+    if ($page) {
       $node = book_navigation($node);
       // Print the breadcrumb
-      print theme("breadcrumb", $node->breadcrumb);
+      drupal_set_breadcrumb($node->breadcrumb);
     }
     // Print the node
-    print theme("node", $node, $main);
+    $output .= theme("node", $node, $main, $page);
   }
+
+  return $output;
 }
 
 function book_show($node, $cid) {
+  $output = "";
 
   if (node_access("view", $node)) {
 
     if ($node->type == "book") {
-      book_view($node, 0);
+      $output .= book_view($node, 0, 1);
     }
     else {
 
@@ -443,8 +448,8 @@ function book_show($node, $cid) {
         /*
         ** View the node
         */
-        print theme("breadcrumb", $node->breadcrumb);
-        print theme("node", $node, 0);
+        drupal_set_breadcrumb($node->breadcrumb);
+        $output .= theme("node", $node, 0, 1);
       }
       else {
 
@@ -452,11 +457,11 @@ function book_show($node, $cid) {
         ** We can't get the content of the node and just view the node.
         ** We don't add breadcrums or links.
         */
-        node_view($node, 0);
+        $output .= node_view($node, 0, 1);
       }
     }
     if (function_exists("comment_render") && $node->comment) {
-      comment_render($node, $cid);
+      $output .= comment_render($node, $cid);
     }
 
     /*
@@ -464,6 +469,10 @@ function book_show($node, $cid) {
     */
     node_tag_new($node->nid);
   }
+  else {
+    $output .= message_access();
+  }
+  return $output;
 }
 
 function book_navigation($node) {
@@ -476,7 +485,7 @@ function book_navigation($node) {
 
     $node->breadcrumb = ""; // Overwrite the trail with a book trail.
     $node->breadcrumb[] = l(t("Home"), "");
-    $node->breadcrumb[] = l(t("Books"), "book");
+    $node->breadcrumb[] = l(t("books"), "book");
     foreach ($path as $level) {
       $node->breadcrumb[] = l($level->title, "book/view/$level->nid");
     }
@@ -625,9 +634,7 @@ function book_render() {
   }
 
   drupal_set_title(t("Books"));
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function book_page() {
@@ -636,9 +643,8 @@ function book_page() {
     switch (arg(1)) {
       case "view":
         $node = node_load(array("nid" => arg(2)));
-        print theme("header");
-        book_show($node, arg(3));
-        print theme("footer");
+        $output = book_show($node, arg(3));
+        print theme("page", $output, $node->title);
         break;
       case "print":
         print book_print(arg(2), $depth = 1);
@@ -648,10 +654,7 @@ function book_page() {
     }
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -805,9 +808,7 @@ function book_admin_orphan() {
     $output .= theme("table", $header, $rows);
   }
 
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function book_admin_links() {
@@ -839,14 +840,10 @@ function book_admin() {
         $output .= book_admin_view(arg(3));
         break;
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -883,8 +880,6 @@ function book_help($section = "admin/help#book") {
 }
 
 function book_help_page() {
-  print theme("header");
-  print book_help();
-  print theme("footer");
+  print theme("page", book_help());
 }
 ?>
diff --git a/modules/comment.module b/modules/comment.module
index 6b71fd388033fc281a9d24281357f94f82fd2c91..fd16e3623007b423984d3c7cb8fda8b042c5e5fd 100644
--- a/modules/comment.module
+++ b/modules/comment.module
@@ -110,9 +110,7 @@ function comment_help($section = "admin/help#comment") {
 }
 
 function comment_help_page() {
-  print theme("header");
-  print comment_help();
-  print theme("footer");
+  print theme("page", comment_help());
 }
 
 function comment_settings() {
@@ -239,7 +237,7 @@ function comment_reply($pid, $nid) {
       print theme("comment_view", $comment);
     }
     else if (user_access("access content")) {
-      node_view(node_load(array("nid" => $nid)));
+      print node_view(node_load(array("nid" => $nid)));
       $pid = 0;
     }
 
@@ -290,7 +288,7 @@ function comment_preview($edit) {
     print theme("comment_view", $comment);
   }
   else {
-    node_view(node_load(array("nid" => $edit["nid"])));
+    print node_view(node_load(array("nid" => $edit["nid"])));
     $edit["pid"] = 0;
   }
 }
@@ -552,6 +550,8 @@ function comment_render($node, $cid = 0) {
   $comments_per_page = $_GET["comments_per_page"];
   $comment_page = $_GET["comment_page"];
 
+  $output = "";
+
   if (user_access("access comments")) {
 
     /*
@@ -586,7 +586,7 @@ function comment_render($node, $cid = 0) {
       $comments_per_page = $user->comments_per_page ? $user->comments_per_page : ($_SESSION["comment_comments_per_page"] ? $_SESSION["comment_comments_per_page"] : variable_get("comment_default_per_page", "50"));
     }
 
-    print "<a id=\"comment\"></a>\n";
+    $output .= "<a id=\"comment\"></a>\n";
 
 
     if ($cid) {
@@ -595,19 +595,19 @@ function comment_render($node, $cid = 0) {
       ** Single comment view
       */
 
-      print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
-      print form_hidden("nid", $nid);
+      $output .= "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
+      $output .= form_hidden("nid", $nid);
 
       $result = db_query("SELECT c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name, u.data, c.score, c.users FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d AND c.status = 0 GROUP BY c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name, u.data, c.score, c.users", $cid);
 
       if ($comment = db_fetch_object($result)) {
-        print theme("comment_view",$comment, comment_links($comment));
+        $output .= theme("comment_view",$comment, comment_links($comment));
       }
 
       if ((comment_user_can_moderate($node)) && $user->uid != $comment->uid && !(comment_already_moderated($user->uid, $comment->users))) {
-        print "<div style=\"text-align: center;\">". form_submit(t("Moderate comment")) ."</div><br />";
+        $output .= "<div style=\"text-align: center;\">". form_submit(t("Moderate comment")) ."</div><br />";
       }
-      print "</div></form>";
+      $output .= "</div></form>";
     }
     else {
 
@@ -713,29 +713,29 @@ function comment_render($node, $cid = 0) {
       $result = pager_query($query, $comments_per_page, 0, "SELECT COUNT(*) FROM {comments} WHERE nid = '". check_query($nid) ."'");
 
       if (db_num_rows($result) && (variable_get("comment_controls", 0) == 0 || variable_get("comment_controls", 0) == 2)) {
-        print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
-        print theme("comment_controls", $threshold, $mode, $order, $comments_per_page);
-        print form_hidden("nid", $nid);
-        print "</div></form>";
+        $output .= "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
+        $output .= theme("comment_controls", $threshold, $mode, $order, $comments_per_page);
+        $output .= form_hidden("nid", $nid);
+        $output .= "</div></form>";
       }
 
-      print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
-      print form_hidden("nid", $nid);
+      $output .= "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
+      $output .= form_hidden("nid", $nid);
 
       while ($comment = db_fetch_object($result)) {
         $comment->depth = count(explode(".", $comment->thread)) - 1;
 
         if ($mode == 1) {
-          print theme("comment_flat_collapsed", $comment, $threshold_min);
+          $output .= theme("comment_flat_collapsed", $comment, $threshold_min);
         }
         else if ($mode == 2) {
-          print theme("comment_flat_expanded", $comment, $threshold_min);
+          $output .= theme("comment_flat_expanded", $comment, $threshold_min);
         }
         else if ($mode == 3) {
-          print theme("comment_thread_min", $comment, $threshold_min);
+          $output .= theme("comment_thread_min", $comment, $threshold_min);
         }
         else if ($mode == 4) {
-          print theme("comment_thread_max", $comment, $threshold_min);
+          $output .= theme("comment_thread_max", $comment, $threshold_min);
         }
       }
 
@@ -744,20 +744,20 @@ function comment_render($node, $cid = 0) {
       ** is global and defined in pager.inc
       */
       if ($pager = pager_display(NULL, $comments_per_page, 0, "default", array("comments_per_page" => $comments_per_page))) {
-        print $pager;
+        $output .= $pager;
       }
 
       if (db_num_rows($result) && comment_user_can_moderate($node)) {
-        print "<div align=\"center\">". form_submit(t("Moderate comments")) ."</div><br />";
+        $output .= "<div align=\"center\">". form_submit(t("Moderate comments")) ."</div><br />";
       }
 
-      print "</div></form>";
+      $output .= "</div></form>";
 
       if (db_num_rows($result) && (variable_get("comment_controls", 0) == 1 || variable_get("comment_controls", 0) == 2)) {
-        print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
-        print theme("comment_controls", $threshold, $mode, $order, $comments_per_page);
-        print form_hidden("nid", $nid);
-        print "</div></form>";
+        $output .= "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
+        $output .= theme("comment_controls", $threshold, $mode, $order, $comments_per_page);
+        $output .= form_hidden("nid", $nid);
+        $output .= "</div></form>";
       }
     }
 
@@ -766,9 +766,10 @@ function comment_render($node, $cid = 0) {
     */
 
     if (user_access("post comments") && node_comment_mode($nid) == 2 && variable_get("comment_form_location", 0)) {
-      print theme("box", t("Post new comment"), comment_form(array("nid" => $nid)));
+      $output .= theme("box", t("Post new comment"), comment_form(array("nid" => $nid)));
     }
   }
+  return $output;
 }
 
 function comment_perm() {
@@ -883,10 +884,7 @@ function comment_page() {
     case t("Post comment"):
       list($error_title, $error_body) = comment_post($edit);
       if ($error_body) {
-        drupal_set_title($error_title);
-        print theme("header");
-        print $error_body;
-        print theme("footer");
+        print theme("page", $error_body, $error_title);
       }
       else {
         drupal_goto(url(comment_referer_load()));
@@ -1239,14 +1237,10 @@ function comment_admin() {
           $output = comment_admin_overview(0);
         }
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/comment/comment.module b/modules/comment/comment.module
index 6b71fd388033fc281a9d24281357f94f82fd2c91..fd16e3623007b423984d3c7cb8fda8b042c5e5fd 100644
--- a/modules/comment/comment.module
+++ b/modules/comment/comment.module
@@ -110,9 +110,7 @@ function comment_help($section = "admin/help#comment") {
 }
 
 function comment_help_page() {
-  print theme("header");
-  print comment_help();
-  print theme("footer");
+  print theme("page", comment_help());
 }
 
 function comment_settings() {
@@ -239,7 +237,7 @@ function comment_reply($pid, $nid) {
       print theme("comment_view", $comment);
     }
     else if (user_access("access content")) {
-      node_view(node_load(array("nid" => $nid)));
+      print node_view(node_load(array("nid" => $nid)));
       $pid = 0;
     }
 
@@ -290,7 +288,7 @@ function comment_preview($edit) {
     print theme("comment_view", $comment);
   }
   else {
-    node_view(node_load(array("nid" => $edit["nid"])));
+    print node_view(node_load(array("nid" => $edit["nid"])));
     $edit["pid"] = 0;
   }
 }
@@ -552,6 +550,8 @@ function comment_render($node, $cid = 0) {
   $comments_per_page = $_GET["comments_per_page"];
   $comment_page = $_GET["comment_page"];
 
+  $output = "";
+
   if (user_access("access comments")) {
 
     /*
@@ -586,7 +586,7 @@ function comment_render($node, $cid = 0) {
       $comments_per_page = $user->comments_per_page ? $user->comments_per_page : ($_SESSION["comment_comments_per_page"] ? $_SESSION["comment_comments_per_page"] : variable_get("comment_default_per_page", "50"));
     }
 
-    print "<a id=\"comment\"></a>\n";
+    $output .= "<a id=\"comment\"></a>\n";
 
 
     if ($cid) {
@@ -595,19 +595,19 @@ function comment_render($node, $cid = 0) {
       ** Single comment view
       */
 
-      print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
-      print form_hidden("nid", $nid);
+      $output .= "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
+      $output .= form_hidden("nid", $nid);
 
       $result = db_query("SELECT c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name, u.data, c.score, c.users FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d AND c.status = 0 GROUP BY c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name, u.data, c.score, c.users", $cid);
 
       if ($comment = db_fetch_object($result)) {
-        print theme("comment_view",$comment, comment_links($comment));
+        $output .= theme("comment_view",$comment, comment_links($comment));
       }
 
       if ((comment_user_can_moderate($node)) && $user->uid != $comment->uid && !(comment_already_moderated($user->uid, $comment->users))) {
-        print "<div style=\"text-align: center;\">". form_submit(t("Moderate comment")) ."</div><br />";
+        $output .= "<div style=\"text-align: center;\">". form_submit(t("Moderate comment")) ."</div><br />";
       }
-      print "</div></form>";
+      $output .= "</div></form>";
     }
     else {
 
@@ -713,29 +713,29 @@ function comment_render($node, $cid = 0) {
       $result = pager_query($query, $comments_per_page, 0, "SELECT COUNT(*) FROM {comments} WHERE nid = '". check_query($nid) ."'");
 
       if (db_num_rows($result) && (variable_get("comment_controls", 0) == 0 || variable_get("comment_controls", 0) == 2)) {
-        print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
-        print theme("comment_controls", $threshold, $mode, $order, $comments_per_page);
-        print form_hidden("nid", $nid);
-        print "</div></form>";
+        $output .= "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
+        $output .= theme("comment_controls", $threshold, $mode, $order, $comments_per_page);
+        $output .= form_hidden("nid", $nid);
+        $output .= "</div></form>";
       }
 
-      print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
-      print form_hidden("nid", $nid);
+      $output .= "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
+      $output .= form_hidden("nid", $nid);
 
       while ($comment = db_fetch_object($result)) {
         $comment->depth = count(explode(".", $comment->thread)) - 1;
 
         if ($mode == 1) {
-          print theme("comment_flat_collapsed", $comment, $threshold_min);
+          $output .= theme("comment_flat_collapsed", $comment, $threshold_min);
         }
         else if ($mode == 2) {
-          print theme("comment_flat_expanded", $comment, $threshold_min);
+          $output .= theme("comment_flat_expanded", $comment, $threshold_min);
         }
         else if ($mode == 3) {
-          print theme("comment_thread_min", $comment, $threshold_min);
+          $output .= theme("comment_thread_min", $comment, $threshold_min);
         }
         else if ($mode == 4) {
-          print theme("comment_thread_max", $comment, $threshold_min);
+          $output .= theme("comment_thread_max", $comment, $threshold_min);
         }
       }
 
@@ -744,20 +744,20 @@ function comment_render($node, $cid = 0) {
       ** is global and defined in pager.inc
       */
       if ($pager = pager_display(NULL, $comments_per_page, 0, "default", array("comments_per_page" => $comments_per_page))) {
-        print $pager;
+        $output .= $pager;
       }
 
       if (db_num_rows($result) && comment_user_can_moderate($node)) {
-        print "<div align=\"center\">". form_submit(t("Moderate comments")) ."</div><br />";
+        $output .= "<div align=\"center\">". form_submit(t("Moderate comments")) ."</div><br />";
       }
 
-      print "</div></form>";
+      $output .= "</div></form>";
 
       if (db_num_rows($result) && (variable_get("comment_controls", 0) == 1 || variable_get("comment_controls", 0) == 2)) {
-        print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
-        print theme("comment_controls", $threshold, $mode, $order, $comments_per_page);
-        print form_hidden("nid", $nid);
-        print "</div></form>";
+        $output .= "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
+        $output .= theme("comment_controls", $threshold, $mode, $order, $comments_per_page);
+        $output .= form_hidden("nid", $nid);
+        $output .= "</div></form>";
       }
     }
 
@@ -766,9 +766,10 @@ function comment_render($node, $cid = 0) {
     */
 
     if (user_access("post comments") && node_comment_mode($nid) == 2 && variable_get("comment_form_location", 0)) {
-      print theme("box", t("Post new comment"), comment_form(array("nid" => $nid)));
+      $output .= theme("box", t("Post new comment"), comment_form(array("nid" => $nid)));
     }
   }
+  return $output;
 }
 
 function comment_perm() {
@@ -883,10 +884,7 @@ function comment_page() {
     case t("Post comment"):
       list($error_title, $error_body) = comment_post($edit);
       if ($error_body) {
-        drupal_set_title($error_title);
-        print theme("header");
-        print $error_body;
-        print theme("footer");
+        print theme("page", $error_body, $error_title);
       }
       else {
         drupal_goto(url(comment_referer_load()));
@@ -1239,14 +1237,10 @@ function comment_admin() {
           $output = comment_admin_overview(0);
         }
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/drupal.module b/modules/drupal.module
index ae609c1326db6aa9ad38b216cbb8c8dba3fd2d1a..040f41f8932ec4d43318aef735cbc55f76505de8 100644
--- a/modules/drupal.module
+++ b/modules/drupal.module
@@ -162,10 +162,7 @@ function drupal_link($type) {
 }
 
 function drupal_page() {
-  drupal_set_title("Drupal");
-  print theme("header");
-  print drupal_help("user/help#drupal");
-  print theme("footer");
+  print theme("page", drupal_help("user/help#drupal"), "Drupal");
 }
 
 function drupal_login($arguments) {
diff --git a/modules/drupal/drupal.module b/modules/drupal/drupal.module
index ae609c1326db6aa9ad38b216cbb8c8dba3fd2d1a..040f41f8932ec4d43318aef735cbc55f76505de8 100644
--- a/modules/drupal/drupal.module
+++ b/modules/drupal/drupal.module
@@ -162,10 +162,7 @@ function drupal_link($type) {
 }
 
 function drupal_page() {
-  drupal_set_title("Drupal");
-  print theme("header");
-  print drupal_help("user/help#drupal");
-  print theme("footer");
+  print theme("page", drupal_help("user/help#drupal"), "Drupal");
 }
 
 function drupal_login($arguments) {
diff --git a/modules/forum.module b/modules/forum.module
index 542449668a4c89e299678c84e327821a4ef6a9eb..dafad93412c5588097efb33d97b5ed124632d3be 100644
--- a/modules/forum.module
+++ b/modules/forum.module
@@ -140,9 +140,9 @@ function forum_content($node) {
   return $node;
 }
 
-function forum_view($node, $main = 0) {
+function forum_view($node, $main = 0, $page = 0) {
 
-  if ($main == 0) {
+  if ($page) {
     $term_data = array_shift(taxonomy_node_get_terms($node->nid));
     if (!$term_data) {
       // we are previewing
@@ -151,15 +151,17 @@ function forum_view($node, $main = 0) {
     $voc = taxonomy_get_vocabulary($term_data->vid);
     // Breadcrumb navigation
     $breadcrumb[] = l(t("Home"), NULL);
-    $breadcrumb[] = l(t("Forums"), "forum");
+    $breadcrumb[] = l(t("forums"), "forum");
     $breadcrumb[] = l($term_data->name, "forum/$term_data->tid");
     // print the breadcrumb
-    print theme("breadcrumb", $breadcrumb);
+    drupal_set_breadcrumb($breadcrumb);
   }
-  // prepair the node content
+  // prepare the node content
   $node = forum_content($node);
   // print the node
-  print theme("node", $node, $main);
+  $output .= theme("node", $node, $main, $page);
+
+  return $output;
 }
 
 function forum_validate(&$node) {
@@ -442,17 +444,11 @@ function forum_page() {
       print theme("forum_display", $forums, $topics, $parents, $tid, $sortby, $forum_per_page, $offset);
     }
     else {
-      drupal_set_title(t("Warning"));
-      print theme("header");
-      print _forum_message_taxonomy();
-      print theme("footer");
+      print theme("page", _forum_message_taxonomy(), t("Warning"));
     }
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -479,13 +475,15 @@ function forum_page() {
 function theme_forum_display($forums, $topics, $parents, $tid, $sortby, $forum_per_page, $offset) {
   // forum list, topics list, topic browser and "add new topic" link
 
-  $title = t("Forums");
+  $title = t("forums");
 
   /*
   ** Breadcrumb navigation:
   */
   $breadcrumb[] = l(t("Home"), "");
-  $breadcrumb[] = l($title, "forum");
+  if ($tid) {
+    $breadcrumb[] = l($title, "forum");
+  }
 
   if ($parents) {
     $parents = array_reverse($parents);
@@ -513,11 +511,7 @@ function theme_forum_display($forums, $topics, $parents, $tid, $sortby, $forum_p
     $output = '';
   }
 
-  drupal_set_title($title);
-  drupal_set_breadcrumb($breadcrumb);
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output, $title, $breadcrumb);
 }
 
 /**
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index 542449668a4c89e299678c84e327821a4ef6a9eb..dafad93412c5588097efb33d97b5ed124632d3be 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -140,9 +140,9 @@ function forum_content($node) {
   return $node;
 }
 
-function forum_view($node, $main = 0) {
+function forum_view($node, $main = 0, $page = 0) {
 
-  if ($main == 0) {
+  if ($page) {
     $term_data = array_shift(taxonomy_node_get_terms($node->nid));
     if (!$term_data) {
       // we are previewing
@@ -151,15 +151,17 @@ function forum_view($node, $main = 0) {
     $voc = taxonomy_get_vocabulary($term_data->vid);
     // Breadcrumb navigation
     $breadcrumb[] = l(t("Home"), NULL);
-    $breadcrumb[] = l(t("Forums"), "forum");
+    $breadcrumb[] = l(t("forums"), "forum");
     $breadcrumb[] = l($term_data->name, "forum/$term_data->tid");
     // print the breadcrumb
-    print theme("breadcrumb", $breadcrumb);
+    drupal_set_breadcrumb($breadcrumb);
   }
-  // prepair the node content
+  // prepare the node content
   $node = forum_content($node);
   // print the node
-  print theme("node", $node, $main);
+  $output .= theme("node", $node, $main, $page);
+
+  return $output;
 }
 
 function forum_validate(&$node) {
@@ -442,17 +444,11 @@ function forum_page() {
       print theme("forum_display", $forums, $topics, $parents, $tid, $sortby, $forum_per_page, $offset);
     }
     else {
-      drupal_set_title(t("Warning"));
-      print theme("header");
-      print _forum_message_taxonomy();
-      print theme("footer");
+      print theme("page", _forum_message_taxonomy(), t("Warning"));
     }
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -479,13 +475,15 @@ function forum_page() {
 function theme_forum_display($forums, $topics, $parents, $tid, $sortby, $forum_per_page, $offset) {
   // forum list, topics list, topic browser and "add new topic" link
 
-  $title = t("Forums");
+  $title = t("forums");
 
   /*
   ** Breadcrumb navigation:
   */
   $breadcrumb[] = l(t("Home"), "");
-  $breadcrumb[] = l($title, "forum");
+  if ($tid) {
+    $breadcrumb[] = l($title, "forum");
+  }
 
   if ($parents) {
     $parents = array_reverse($parents);
@@ -513,11 +511,7 @@ function theme_forum_display($forums, $topics, $parents, $tid, $sortby, $forum_p
     $output = '';
   }
 
-  drupal_set_title($title);
-  drupal_set_breadcrumb($breadcrumb);
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output, $title, $breadcrumb);
 }
 
 /**
diff --git a/modules/help.module b/modules/help.module
index f53853e4fd47ea2bafa1742edd9fb44e74eab3a8..d8a11cfeb66cc7e8a5470b4c9f3209aca9895be6 100644
--- a/modules/help.module
+++ b/modules/help.module
@@ -28,9 +28,7 @@ function help_glossary() {
   $output .= "</dl>";
   $output = t($output, array("%taxonomy" => l(t("taxonomy help"), "admin/taxonomy/help")));
 
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function help_help($section = "admin/help#help") {
@@ -62,9 +60,7 @@ function help_help($section = "admin/help#help") {
 }
 
 function help_help_page() {
-  print theme("header");
-  print help_help();
-  print theme("footer");
+  print theme("page", help_help());
 }
 
 ?>
diff --git a/modules/help/help.module b/modules/help/help.module
index f53853e4fd47ea2bafa1742edd9fb44e74eab3a8..d8a11cfeb66cc7e8a5470b4c9f3209aca9895be6 100644
--- a/modules/help/help.module
+++ b/modules/help/help.module
@@ -28,9 +28,7 @@ function help_glossary() {
   $output .= "</dl>";
   $output = t($output, array("%taxonomy" => l(t("taxonomy help"), "admin/taxonomy/help")));
 
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function help_help($section = "admin/help#help") {
@@ -62,9 +60,7 @@ function help_help($section = "admin/help#help") {
 }
 
 function help_help_page() {
-  print theme("header");
-  print help_help();
-  print theme("footer");
+  print theme("page", help_help());
 }
 
 ?>
diff --git a/modules/import.module b/modules/import.module
index a01b46653ea6cd4af477c7bf5a2ffa74c0cd5a26..e4a644a6c28a30efb736f83938ef1ef76ca2fc1e 100644
--- a/modules/import.module
+++ b/modules/import.module
@@ -76,9 +76,7 @@ function import_help($section = "admin/help#import") {
 }
 
 function import_help_page() {
-  print theme("header");
-  print import_help();
-  print theme("footer");
+  print theme("page", import_help());
 }
 
 function import_settings() {
@@ -618,14 +616,10 @@ function import_admin() {
       default:
         $output .=  import_view();
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/locale.module b/modules/locale.module
index 8e54b97a4d636e26141953b016d24f0c9448b6fe..79da2f23ce6258955ac2270d780eadffc015c8ab 100644
--- a/modules/locale.module
+++ b/modules/locale.module
@@ -55,9 +55,7 @@ function locale_help($section = "admin/help#locale") {
 }
 
 function locale_help_page() {
-  print theme("header");
-  print locale_help();
-  print theme("footer");
+  print theme("page", locale_help());
 }
 
 function locale_perm() {
@@ -300,14 +298,10 @@ function locale_admin() {
         $output = locale_seek();
         $output .= locale_seek_form();
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/locale/locale.module b/modules/locale/locale.module
index 8e54b97a4d636e26141953b016d24f0c9448b6fe..79da2f23ce6258955ac2270d780eadffc015c8ab 100644
--- a/modules/locale/locale.module
+++ b/modules/locale/locale.module
@@ -55,9 +55,7 @@ function locale_help($section = "admin/help#locale") {
 }
 
 function locale_help_page() {
-  print theme("header");
-  print locale_help();
-  print theme("footer");
+  print theme("page", locale_help());
 }
 
 function locale_perm() {
@@ -300,14 +298,10 @@ function locale_admin() {
         $output = locale_seek();
         $output .= locale_seek_form();
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/node.module b/modules/node.module
index 46ae6a8c336631acfaeb5ebcc09f9a6f2aa1e011..1423fe2be0df46a0b1f5049d1f7af9697a62c186 100644
--- a/modules/node.module
+++ b/modules/node.module
@@ -64,9 +64,7 @@ function node_help($section = "admin/help#node") {
 }
 
 function node_help_page() {
-  print theme("header");
-  print node_help();
-  print theme("footer");
+  print theme("page", node_help());
 }
 
 
@@ -386,7 +384,7 @@ function node_save($node) {
 
 }
 
-function node_view($node, $main = 0) {
+function node_view($node, $main = 0, $page = 0) {
 
   $node = array2object($node);
 
@@ -403,7 +401,7 @@ function node_view($node, $main = 0) {
   */
 
   if (module_hook($node->type, "view")) {
-    node_invoke($node, "view", $main);
+    return node_invoke($node, "view", $main, $page);
   }
   else {
 
@@ -414,7 +412,7 @@ function node_view($node, $main = 0) {
     $node->teaser = check_output($node->teaser);
     $node->body = check_output($node->body);
 
-    print theme("node", $node, $main);
+    return theme("node", $node, $main, $page);
   }
 }
 
@@ -422,10 +420,10 @@ function node_show($node, $cid) {
 
   if (node_access("view", $node)) {
 
-    node_view($node);
+    $output = node_view($node, 0, 1);
 
     if (function_exists("comment_render") && $node->comment) {
-      comment_render($node, $cid);
+      $output .= comment_render($node, $cid);
     }
 
     /*
@@ -433,6 +431,8 @@ function node_show($node, $cid) {
     */
 
     node_tag_new($node->nid);
+
+    return $output;
   }
 }
 
@@ -931,14 +931,10 @@ function node_admin() {
       default:
         $output = node_admin_nodes();
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -1348,17 +1344,18 @@ function node_preview($node, $error = NULL) {
     */
 
     if ($view->teaser && $view->teaser != $view->body) {
-      print "<h3>". t("Preview trimmed version") ."</h3>";
-      node_view($view, 1);
-      print "<p><i>". t("The trimmed version of your post shows how your post looks like when promoted to the main page or when exported for syndication.  You can insert a delimiter '&lt;!--break--&gt' (without the quotes) to fine-tune where your post gets split.") ."</i></p>";
-      print "<h3>". t("Preview full version") ."</h3>";
-      node_view($view, 0);
+      $output = "<h3>". t("Preview trimmed version") ."</h3>";
+      $output .= node_view($view, 1);
+      $output .= "<p><i>". t("The trimmed version of your post shows how your post looks like when promoted to the main page or when exported for syndication.  You can insert a delimiter '&lt;!--break--&gt' (without the quotes) to fine-tune where your post gets split.") ."</i></p>";
+      $output .= "<h3>". t("Preview full version") ."</h3>";
+      $output .= node_view($view, 0);
     }
     else {
-      node_view($view, 0);
+      $output .= node_view($view, 0);
     }
 
-    return node_form($node, $error);
+    $output .= node_form($node, $error);
+    return $output;
   }
 }
 
@@ -1509,81 +1506,50 @@ function node_page() {
 
     switch ($op) {
       case "add":
-        drupal_set_title(t("Submit %name", array("%name" => $name)));
-        print theme("header");
-        print node_add(arg(2));
-        print theme("footer");
+        print theme("page", node_add(arg(2)), t("Submit %name", array("%name" => $name)));
         break;
       case "edit":
-        drupal_set_title(t("Edit %name", array("%name" => $name)));
-        print theme("header");
-        print node_edit(arg(2));
-        print theme("footer");
+        print theme("page", node_edit(arg(2)), t("Edit %name", array("%name" => $name)));
         break;
       case "view":
-        drupal_set_title($node->title);
-        print theme("header");
-        print node_show($node, arg(3));
-        print theme("footer");
+        print theme("page", node_show($node, arg(3)), $node->title);
         break;
       case "revisions":
-        drupal_set_title(t("Revisions"));
-        print theme("header");
-        print node_revision_overview(arg(2));
-        print theme("footer");
+        print theme("page", node_revision_overview(arg(2)), t("Revisions"));
         break;
       case "rollback-revision":
         $output  = node_revision_rollback(arg(2), arg(3));
         $output .= node_revision_overview(arg(2));
-        drupal_set_title(t("Revisions"));
-        print theme("header");
-        print $output;
-        print theme("footer");
+        print theme("page", $output, t("Revisions"));
         break;
       case "delete-revision":
         $output  = node_revision_delete(arg(2), arg(3));
         $output .= node_revision_overview(arg(2));
-        drupal_set_title(t("Revisions"));
-        print theme("header");
-        print $output;
-        print theme("footer");
+        print theme("page", $output, t("Revisions"));
         break;
       case t("Preview"):
         $edit = node_validate($edit, $error);
-        drupal_set_title(t("Preview %name", array("%name" => $name)));
-        print theme("header");
-        print node_preview($edit, $error);
-        print theme("footer");
+        print theme("page", node_preview($edit, $error), t("Preview %name", array("%name" => $name)));
         break;
       case t("Submit"):
-        drupal_set_title(t("Submit %name", array("%name" => $name)));
-        print theme("header");
-        print node_submit($edit);
-        print theme("footer");
+        print theme("page", node_submit($edit), t("Submit %name", array("%name" => $name)));
         break;
       case t("Delete"):
-        drupal_set_title(t("Delete %name", array("%name" => $name)));
-        print theme("header");
-        print node_delete($edit);
-        print theme("footer");
+        print theme("page", node_delete($edit), t("Delete %name", array("%name" => $name)));
         break;
       default:
-        drupal_set_title("");
-        print theme("header");
+        $output = "";
         $result = pager_query("SELECT nid, type FROM {node} WHERE promote = '1' AND status = '1' ORDER BY static DESC, created DESC", variable_get("default_nodes_main", 10));
 
         while ($node = db_fetch_object($result)) {
-          node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
+          $output .= node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
         }
-        print pager_display(NULL, variable_get("default_nodes_main", 10));
-        print theme("footer");
+        $output .= pager_display(NULL, variable_get("default_nodes_main", 10));
+        print theme("page", $output, "");
     }
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 
 }
diff --git a/modules/node/node.module b/modules/node/node.module
index 46ae6a8c336631acfaeb5ebcc09f9a6f2aa1e011..1423fe2be0df46a0b1f5049d1f7af9697a62c186 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -64,9 +64,7 @@ function node_help($section = "admin/help#node") {
 }
 
 function node_help_page() {
-  print theme("header");
-  print node_help();
-  print theme("footer");
+  print theme("page", node_help());
 }
 
 
@@ -386,7 +384,7 @@ function node_save($node) {
 
 }
 
-function node_view($node, $main = 0) {
+function node_view($node, $main = 0, $page = 0) {
 
   $node = array2object($node);
 
@@ -403,7 +401,7 @@ function node_view($node, $main = 0) {
   */
 
   if (module_hook($node->type, "view")) {
-    node_invoke($node, "view", $main);
+    return node_invoke($node, "view", $main, $page);
   }
   else {
 
@@ -414,7 +412,7 @@ function node_view($node, $main = 0) {
     $node->teaser = check_output($node->teaser);
     $node->body = check_output($node->body);
 
-    print theme("node", $node, $main);
+    return theme("node", $node, $main, $page);
   }
 }
 
@@ -422,10 +420,10 @@ function node_show($node, $cid) {
 
   if (node_access("view", $node)) {
 
-    node_view($node);
+    $output = node_view($node, 0, 1);
 
     if (function_exists("comment_render") && $node->comment) {
-      comment_render($node, $cid);
+      $output .= comment_render($node, $cid);
     }
 
     /*
@@ -433,6 +431,8 @@ function node_show($node, $cid) {
     */
 
     node_tag_new($node->nid);
+
+    return $output;
   }
 }
 
@@ -931,14 +931,10 @@ function node_admin() {
       default:
         $output = node_admin_nodes();
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -1348,17 +1344,18 @@ function node_preview($node, $error = NULL) {
     */
 
     if ($view->teaser && $view->teaser != $view->body) {
-      print "<h3>". t("Preview trimmed version") ."</h3>";
-      node_view($view, 1);
-      print "<p><i>". t("The trimmed version of your post shows how your post looks like when promoted to the main page or when exported for syndication.  You can insert a delimiter '&lt;!--break--&gt' (without the quotes) to fine-tune where your post gets split.") ."</i></p>";
-      print "<h3>". t("Preview full version") ."</h3>";
-      node_view($view, 0);
+      $output = "<h3>". t("Preview trimmed version") ."</h3>";
+      $output .= node_view($view, 1);
+      $output .= "<p><i>". t("The trimmed version of your post shows how your post looks like when promoted to the main page or when exported for syndication.  You can insert a delimiter '&lt;!--break--&gt' (without the quotes) to fine-tune where your post gets split.") ."</i></p>";
+      $output .= "<h3>". t("Preview full version") ."</h3>";
+      $output .= node_view($view, 0);
     }
     else {
-      node_view($view, 0);
+      $output .= node_view($view, 0);
     }
 
-    return node_form($node, $error);
+    $output .= node_form($node, $error);
+    return $output;
   }
 }
 
@@ -1509,81 +1506,50 @@ function node_page() {
 
     switch ($op) {
       case "add":
-        drupal_set_title(t("Submit %name", array("%name" => $name)));
-        print theme("header");
-        print node_add(arg(2));
-        print theme("footer");
+        print theme("page", node_add(arg(2)), t("Submit %name", array("%name" => $name)));
         break;
       case "edit":
-        drupal_set_title(t("Edit %name", array("%name" => $name)));
-        print theme("header");
-        print node_edit(arg(2));
-        print theme("footer");
+        print theme("page", node_edit(arg(2)), t("Edit %name", array("%name" => $name)));
         break;
       case "view":
-        drupal_set_title($node->title);
-        print theme("header");
-        print node_show($node, arg(3));
-        print theme("footer");
+        print theme("page", node_show($node, arg(3)), $node->title);
         break;
       case "revisions":
-        drupal_set_title(t("Revisions"));
-        print theme("header");
-        print node_revision_overview(arg(2));
-        print theme("footer");
+        print theme("page", node_revision_overview(arg(2)), t("Revisions"));
         break;
       case "rollback-revision":
         $output  = node_revision_rollback(arg(2), arg(3));
         $output .= node_revision_overview(arg(2));
-        drupal_set_title(t("Revisions"));
-        print theme("header");
-        print $output;
-        print theme("footer");
+        print theme("page", $output, t("Revisions"));
         break;
       case "delete-revision":
         $output  = node_revision_delete(arg(2), arg(3));
         $output .= node_revision_overview(arg(2));
-        drupal_set_title(t("Revisions"));
-        print theme("header");
-        print $output;
-        print theme("footer");
+        print theme("page", $output, t("Revisions"));
         break;
       case t("Preview"):
         $edit = node_validate($edit, $error);
-        drupal_set_title(t("Preview %name", array("%name" => $name)));
-        print theme("header");
-        print node_preview($edit, $error);
-        print theme("footer");
+        print theme("page", node_preview($edit, $error), t("Preview %name", array("%name" => $name)));
         break;
       case t("Submit"):
-        drupal_set_title(t("Submit %name", array("%name" => $name)));
-        print theme("header");
-        print node_submit($edit);
-        print theme("footer");
+        print theme("page", node_submit($edit), t("Submit %name", array("%name" => $name)));
         break;
       case t("Delete"):
-        drupal_set_title(t("Delete %name", array("%name" => $name)));
-        print theme("header");
-        print node_delete($edit);
-        print theme("footer");
+        print theme("page", node_delete($edit), t("Delete %name", array("%name" => $name)));
         break;
       default:
-        drupal_set_title("");
-        print theme("header");
+        $output = "";
         $result = pager_query("SELECT nid, type FROM {node} WHERE promote = '1' AND status = '1' ORDER BY static DESC, created DESC", variable_get("default_nodes_main", 10));
 
         while ($node = db_fetch_object($result)) {
-          node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
+          $output .= node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
         }
-        print pager_display(NULL, variable_get("default_nodes_main", 10));
-        print theme("footer");
+        $output .= pager_display(NULL, variable_get("default_nodes_main", 10));
+        print theme("page", $output, "");
     }
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 
 }
diff --git a/modules/page.module b/modules/page.module
index 5b5629136cf5d6f53e0e71fa7988c38cda44059b..75c4144d2cba0aa3c7f1052b35a542c56026ce35 100644
--- a/modules/page.module
+++ b/modules/page.module
@@ -117,11 +117,11 @@ function page_content($node) {
   return $node;
 }
 
-function page_view($node, $main) {
-  // prepair the node content
+function page_view($node, $main = 0, $page = 0) {
+  // prepare the node content
   $node = page_content($node);
   // print the node
-  print theme("node", $node, $main);
+  return theme("node", $node, $main, $page);
 }
 
 function page_form(&$node, &$help, &$error) {
diff --git a/modules/page/page.module b/modules/page/page.module
index 5b5629136cf5d6f53e0e71fa7988c38cda44059b..75c4144d2cba0aa3c7f1052b35a542c56026ce35 100644
--- a/modules/page/page.module
+++ b/modules/page/page.module
@@ -117,11 +117,11 @@ function page_content($node) {
   return $node;
 }
 
-function page_view($node, $main) {
-  // prepair the node content
+function page_view($node, $main = 0, $page = 0) {
+  // prepare the node content
   $node = page_content($node);
   // print the node
-  print theme("node", $node, $main);
+  return theme("node", $node, $main, $page);
 }
 
 function page_form(&$node, &$help, &$error) {
diff --git a/modules/path.module b/modules/path.module
index 1d66bd366eedd02af6f0af2ef248871b7391145d..af4efe461a85f1673459521420294314390b4c14 100644
--- a/modules/path.module
+++ b/modules/path.module
@@ -38,14 +38,10 @@ function path_admin() {
         $output .= path_overview();
     }
 
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/path/path.module b/modules/path/path.module
index 1d66bd366eedd02af6f0af2ef248871b7391145d..af4efe461a85f1673459521420294314390b4c14 100644
--- a/modules/path/path.module
+++ b/modules/path/path.module
@@ -38,14 +38,10 @@ function path_admin() {
         $output .= path_overview();
     }
 
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/poll.module b/modules/poll.module
index fe2cd92b4760766223e47e0dc608195d2190b6c0..b03db0c756154518baf7f587a75cbd300af8db7e 100644
--- a/modules/poll.module
+++ b/modules/poll.module
@@ -249,16 +249,13 @@ function poll_node($field) {
 }
 
 function poll_page() {
-
-  print theme("header");
   $result = db_query("SELECT n.nid, n.title, p.active, SUM(c.chvotes) AS votes FROM {node} n INNER JOIN {poll} p ON n.nid=p.nid INNER JOIN {poll_choices} c ON n.nid=c.nid WHERE type = 'poll' AND status = '1' AND moderate = '0' GROUP BY n.nid, n.title, p.active, n.created ORDER BY n.created DESC");
   $output = "<ul>";
   while ($node = db_fetch_object($result)) {
     $output .= "<li>".l($node->title, "node/view/$node->nid") ." - ". format_plural($node->votes, "1 vote", "%count votes") ." - ". ($node->active ? t("open") : t("closed")) ."</li>";
   }
   $output .= "</ul>";
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function poll_perm() {
@@ -386,7 +383,7 @@ function poll_view(&$node, $main = 0, $block = 0) {
 
   // We also use poll_view() for the side-block
   if (!$block) {
-    print theme("node", $node, $main);
+    return theme("node", $node, $main);
   }
 }
 
diff --git a/modules/poll/poll.module b/modules/poll/poll.module
index fe2cd92b4760766223e47e0dc608195d2190b6c0..b03db0c756154518baf7f587a75cbd300af8db7e 100644
--- a/modules/poll/poll.module
+++ b/modules/poll/poll.module
@@ -249,16 +249,13 @@ function poll_node($field) {
 }
 
 function poll_page() {
-
-  print theme("header");
   $result = db_query("SELECT n.nid, n.title, p.active, SUM(c.chvotes) AS votes FROM {node} n INNER JOIN {poll} p ON n.nid=p.nid INNER JOIN {poll_choices} c ON n.nid=c.nid WHERE type = 'poll' AND status = '1' AND moderate = '0' GROUP BY n.nid, n.title, p.active, n.created ORDER BY n.created DESC");
   $output = "<ul>";
   while ($node = db_fetch_object($result)) {
     $output .= "<li>".l($node->title, "node/view/$node->nid") ." - ". format_plural($node->votes, "1 vote", "%count votes") ." - ". ($node->active ? t("open") : t("closed")) ."</li>";
   }
   $output .= "</ul>";
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function poll_perm() {
@@ -386,7 +383,7 @@ function poll_view(&$node, $main = 0, $block = 0) {
 
   // We also use poll_view() for the side-block
   if (!$block) {
-    print theme("node", $node, $main);
+    return theme("node", $node, $main);
   }
 }
 
diff --git a/modules/queue.module b/modules/queue.module
index bb8efb2be1684adb62bc892bafe190360d0d14cf..7c118c046b9f13cb45dfd81ffcdcfede3054612b 100644
--- a/modules/queue.module
+++ b/modules/queue.module
@@ -117,9 +117,7 @@ function queue_overview() {
   $output .= "</table>";
 
   drupal_set_title(t("Submission queue"));
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function queue_view($nid) {
@@ -170,12 +168,12 @@ function queue_view($nid) {
   }
 
   print theme("header");
-  node_view($node);
+  print node_view($node);
   if ($output) {
     print theme("box", t("Moderate"), $output);
   }
   if ($node->comment && variable_get("queue_show_comments", 1)) {
-    module_invoke("comment", "render", $node);
+    print module_invoke("comment", "render", $node);
   }
   print theme("footer");
 }
@@ -192,9 +190,7 @@ function queue_page() {
     }
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/search.module b/modules/search.module
index 3d4d191da84d0612272ecb58b994134dec2be435..43c016156a4a67697383d08f30ae01d34183bb81 100644
--- a/modules/search.module
+++ b/modules/search.module
@@ -50,6 +50,10 @@ function search_link($type) {
     menu("search", t("search"), "search_page", 0, 1);
   }
 
+  if ($type == "system" && user_access("search content")) {
+    menu("search", t("search"), "search_page", 0, 1);
+  }
+
   return $links;
 }
 
@@ -75,15 +79,11 @@ function search_admin() {
       $output = t("index invalidated") ."<br />\n";
       search_cron();
       $output .= t("index recreated") ."<br /><hr />\n";
-      print theme("header");
-      print $output;
-      print theme("footer");
+      print theme("page", $output);
     }
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -353,48 +353,40 @@ function search_view($keys) {
 
   if (user_access("search content")) {
     // Construct the search form:
-    $form = search_form(NULL, $keys, TRUE);
-
-    // Collect the search results:
-    $output = search_data($keys);
+    $output = search_form(NULL, $keys, TRUE);
 
     // Display form and search results:
     $help_link = l(t("search help"), "search/help");
     switch (variable_get("help_pos", 1)) {
       case "1":
-        $form = search_help(). $form ."<br />";
+        $output = search_help(). $output ."<br />";
         break;
       case "2":
-        $form .= search_help() ."<br />";
+        $output .= search_help() ."<br />";
         break;
       case "3":
-        $form = $help_link. "<br />". $form ."<br />";
+        $output = $help_link. "<br />". $output ."<br />";
         break;
       case "4":
-        $form .= "<br />". $help_link ."<br />";
+        $output .= "<br />". $help_link ."<br />";
     }
 
-    drupal_set_title(t("Search"));
-    print theme("header");
-
-    print $form;
+    // Collect the search results:
+    $results = search_data($keys);
 
     if ($keys) {
-      if ($output) {
-        print theme("box", t("Search Results"), $output);
+      if ($results) {
+        $output .= theme("box", t("Search Results"), $results);
       }
       else {
-        print theme("box", t("Search Results"), t("Your search yielded no results."));
+        $output .= theme("box", t("Search Results"), t("Your search yielded no results."));
       }
     }
 
-    print theme("footer");
+    print theme("page", $output, t("Search"));
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 
 }
@@ -404,10 +396,7 @@ function search_page() {
 
   switch (arg(1)) {
     case "help":
-      drupal_set_title(t("Search Help"));
-      print theme("header");
-      print search_help();
-      print theme("footer");
+      print theme("page", search_help(), t("Search Help"));
       break;
     default:
       search_view($keys);
diff --git a/modules/search/search.module b/modules/search/search.module
index 3d4d191da84d0612272ecb58b994134dec2be435..43c016156a4a67697383d08f30ae01d34183bb81 100644
--- a/modules/search/search.module
+++ b/modules/search/search.module
@@ -50,6 +50,10 @@ function search_link($type) {
     menu("search", t("search"), "search_page", 0, 1);
   }
 
+  if ($type == "system" && user_access("search content")) {
+    menu("search", t("search"), "search_page", 0, 1);
+  }
+
   return $links;
 }
 
@@ -75,15 +79,11 @@ function search_admin() {
       $output = t("index invalidated") ."<br />\n";
       search_cron();
       $output .= t("index recreated") ."<br /><hr />\n";
-      print theme("header");
-      print $output;
-      print theme("footer");
+      print theme("page", $output);
     }
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -353,48 +353,40 @@ function search_view($keys) {
 
   if (user_access("search content")) {
     // Construct the search form:
-    $form = search_form(NULL, $keys, TRUE);
-
-    // Collect the search results:
-    $output = search_data($keys);
+    $output = search_form(NULL, $keys, TRUE);
 
     // Display form and search results:
     $help_link = l(t("search help"), "search/help");
     switch (variable_get("help_pos", 1)) {
       case "1":
-        $form = search_help(). $form ."<br />";
+        $output = search_help(). $output ."<br />";
         break;
       case "2":
-        $form .= search_help() ."<br />";
+        $output .= search_help() ."<br />";
         break;
       case "3":
-        $form = $help_link. "<br />". $form ."<br />";
+        $output = $help_link. "<br />". $output ."<br />";
         break;
       case "4":
-        $form .= "<br />". $help_link ."<br />";
+        $output .= "<br />". $help_link ."<br />";
     }
 
-    drupal_set_title(t("Search"));
-    print theme("header");
-
-    print $form;
+    // Collect the search results:
+    $results = search_data($keys);
 
     if ($keys) {
-      if ($output) {
-        print theme("box", t("Search Results"), $output);
+      if ($results) {
+        $output .= theme("box", t("Search Results"), $results);
       }
       else {
-        print theme("box", t("Search Results"), t("Your search yielded no results."));
+        $output .= theme("box", t("Search Results"), t("Your search yielded no results."));
       }
     }
 
-    print theme("footer");
+    print theme("page", $output, t("Search"));
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 
 }
@@ -404,10 +396,7 @@ function search_page() {
 
   switch (arg(1)) {
     case "help":
-      drupal_set_title(t("Search Help"));
-      print theme("header");
-      print search_help();
-      print theme("footer");
+      print theme("page", search_help(), t("Search Help"));
       break;
     default:
       search_view($keys);
diff --git a/modules/statistics.module b/modules/statistics.module
index 78284090f3f3344a36cf0323a2a372c3d0903503..6889adeaefc9b69b73d44e0aac0a8b814dfea70e 100644
--- a/modules/statistics.module
+++ b/modules/statistics.module
@@ -245,9 +245,7 @@ function statistics_help($section = "admin/help#statistics") {
 }
 
 function statistics_help_page() {
-  print theme("header");
-  print statistics_help();
-  print theme("footer");
+  print theme("page", statistics_help());
 }
 
 
@@ -325,14 +323,10 @@ function statistics_admin() {
           $output .= statistics_admin_topnodes();
       }
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -778,15 +772,10 @@ function statistics_page() {
 
 
   if (user_access("access content")) {
-    print theme("header");
-    statistics_page_user();
-    print theme("footer");
+    print theme("page", statistics_page_user());
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -799,29 +788,31 @@ function statistics_page_user($uid = 0, $date = 0, $all = 0) {
   }
 
   if ($displaycount = variable_get("statistics_userpage_day_cnt", 10)) {
-    $output = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
-    $output .= statistics_summary("daycount", $displaycount);
-    $output .= "</table>";
+    $table = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
+    $table .= statistics_summary("daycount", $displaycount);
+    $table .= "</table>";
 
-    print theme("box", t(variable_get("statistics_userpage_day_head", "")), $output, "main");
+    $output .= theme("box", t(variable_get("statistics_userpage_day_head", "")), $table, "main");
   }
 
 
   if ($displaycount = variable_get("statistics_userpage_all_cnt", "10")) {
-    $output = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
-    $output .= statistics_summary("totalcount", $displaycount);
-    $output .= "</table>";
+    $table = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
+    $table .= statistics_summary("totalcount", $displaycount);
+    $table .= "</table>";
 
-    print theme("box", t(variable_get("statistics_userpage_all_head", "")), $output, "main");
+    $output .= theme("box", t(variable_get("statistics_userpage_all_head", "")), $table, "main");
   }
 
   if ($displaycount = variable_get("statistics_userpage_last_cnt", "10")) {
-    $output = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
-    $output .= statistics_summary("timestamp", $displaycount);
-    $output .= "</table>";
+    $table = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
+    $table .= statistics_summary("timestamp", $displaycount);
+    $table .= "</table>";
 
-    print theme("box", t(variable_get("statistics_userpage_last_head", "")), $output, "main");
+    $output .= theme("box", t(variable_get("statistics_userpage_last_head", "")), $table, "main");
   }
+
+  return $output;
 }
 
 
diff --git a/modules/statistics/statistics.module b/modules/statistics/statistics.module
index 78284090f3f3344a36cf0323a2a372c3d0903503..6889adeaefc9b69b73d44e0aac0a8b814dfea70e 100644
--- a/modules/statistics/statistics.module
+++ b/modules/statistics/statistics.module
@@ -245,9 +245,7 @@ function statistics_help($section = "admin/help#statistics") {
 }
 
 function statistics_help_page() {
-  print theme("header");
-  print statistics_help();
-  print theme("footer");
+  print theme("page", statistics_help());
 }
 
 
@@ -325,14 +323,10 @@ function statistics_admin() {
           $output .= statistics_admin_topnodes();
       }
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -778,15 +772,10 @@ function statistics_page() {
 
 
   if (user_access("access content")) {
-    print theme("header");
-    statistics_page_user();
-    print theme("footer");
+    print theme("page", statistics_page_user());
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
@@ -799,29 +788,31 @@ function statistics_page_user($uid = 0, $date = 0, $all = 0) {
   }
 
   if ($displaycount = variable_get("statistics_userpage_day_cnt", 10)) {
-    $output = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
-    $output .= statistics_summary("daycount", $displaycount);
-    $output .= "</table>";
+    $table = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
+    $table .= statistics_summary("daycount", $displaycount);
+    $table .= "</table>";
 
-    print theme("box", t(variable_get("statistics_userpage_day_head", "")), $output, "main");
+    $output .= theme("box", t(variable_get("statistics_userpage_day_head", "")), $table, "main");
   }
 
 
   if ($displaycount = variable_get("statistics_userpage_all_cnt", "10")) {
-    $output = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
-    $output .= statistics_summary("totalcount", $displaycount);
-    $output .= "</table>";
+    $table = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
+    $table .= statistics_summary("totalcount", $displaycount);
+    $table .= "</table>";
 
-    print theme("box", t(variable_get("statistics_userpage_all_head", "")), $output, "main");
+    $output .= theme("box", t(variable_get("statistics_userpage_all_head", "")), $table, "main");
   }
 
   if ($displaycount = variable_get("statistics_userpage_last_cnt", "10")) {
-    $output = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
-    $output .= statistics_summary("timestamp", $displaycount);
-    $output .= "</table>";
+    $table = "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\" style=\"width: 100%;\">";
+    $table .= statistics_summary("timestamp", $displaycount);
+    $table .= "</table>";
 
-    print theme("box", t(variable_get("statistics_userpage_last_head", "")), $output, "main");
+    $output .= theme("box", t(variable_get("statistics_userpage_last_head", "")), $table, "main");
   }
+
+  return $output;
 }
 
 
diff --git a/modules/system.module b/modules/system.module
index f32f4a2ce2983c46440f4708e9a51f8cdab3e56e..38c858c993a41b6d739b84780efaef54432b6cc7 100644
--- a/modules/system.module
+++ b/modules/system.module
@@ -47,9 +47,7 @@ function system_help($section = "admin/help#system") {
 }
 
 function system_help_page() {
-  print theme("header");
-  print system_help();
-  print theme("footer");
+  print theme("page", system_help());
 }
 
 function system_perm() {
@@ -358,14 +356,10 @@ function system_admin() {
     }
 
     $output .= system_view(arg(2), arg(3));
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/system/system.module b/modules/system/system.module
index f32f4a2ce2983c46440f4708e9a51f8cdab3e56e..38c858c993a41b6d739b84780efaef54432b6cc7 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -47,9 +47,7 @@ function system_help($section = "admin/help#system") {
 }
 
 function system_help_page() {
-  print theme("header");
-  print system_help();
-  print theme("footer");
+  print theme("page", system_help());
 }
 
 function system_perm() {
@@ -358,14 +356,10 @@ function system_admin() {
     }
 
     $output .= system_view(arg(2), arg(3));
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/taxonomy.module b/modules/taxonomy.module
index ca59cae258e12ef9575d3ac686332a41e7d77ee8..f56b55ac1a6d51ba5c42ef56d60a4474ed857906 100644
--- a/modules/taxonomy.module
+++ b/modules/taxonomy.module
@@ -686,7 +686,7 @@ function taxonomy_select_nodes($taxonomy, $pager = 1) {
 function taxonomy_render_nodes($result) {
 
   while ($node = db_fetch_object($result)) {
-    node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
+    print node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
   }
   print pager_display(NULL, variable_get("default_nodes_main", 10), 0);
 }
@@ -795,9 +795,7 @@ function taxonomy_admin() {
     $output .= message_access();
   }
 
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function taxonomy_help($section = "admin/help#taxonomy") {
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index ca59cae258e12ef9575d3ac686332a41e7d77ee8..f56b55ac1a6d51ba5c42ef56d60a4474ed857906 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -686,7 +686,7 @@ function taxonomy_select_nodes($taxonomy, $pager = 1) {
 function taxonomy_render_nodes($result) {
 
   while ($node = db_fetch_object($result)) {
-    node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
+    print node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
   }
   print pager_display(NULL, variable_get("default_nodes_main", 10), 0);
 }
@@ -795,9 +795,7 @@ function taxonomy_admin() {
     $output .= message_access();
   }
 
-  print theme("header");
-  print $output;
-  print theme("footer");
+  print theme("page", $output);
 }
 
 function taxonomy_help($section = "admin/help#taxonomy") {
diff --git a/modules/title.module b/modules/title.module
index 8de104f930d31ffde34719433a687ab1c2cac500..aa99aefdd6d48db730af946a0718ac6f91b2a078 100644
--- a/modules/title.module
+++ b/modules/title.module
@@ -40,9 +40,7 @@ function title_page() {
     else if (db_num_rows($result) == 1) {
       $node = db_fetch_object($result);
       $node = node_load(array("nid" => $node->nid));
-      print theme("header");
-      print node_show($node, NULL);
-      print theme("footer");
+      print theme("page", node_show($node, NULL));
     }
     else {
       $header = array(t("Type"), t("Title"), t("Author"));
@@ -58,16 +56,11 @@ function title_page() {
       $output .= "</div>";
 
       drupal_set_title(t("Matching Posts"));
-      print theme("header");
-      print $output;
-      print theme("footer");
+      print theme("page", $output);
     }
   }
   else {
-    drupal_set_title(t("Access denied"));
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/tracker.module b/modules/tracker.module
index 1d06272c32d367d94e6a1057cdeb517042f87b89..b75096f8d85ab9ebbc5dcd73de04adf84695df5b 100644
--- a/modules/tracker.module
+++ b/modules/tracker.module
@@ -104,15 +104,10 @@ function tracker_page() {
   global $user;
 
   if (user_access("access content")) {
-    drupal_set_title(t("Recent posts"));
-    print theme("header");
-    print tracker_posts(arg(1));
-    print theme("footer");
+    print theme("page", tracker_posts(arg(1)), t("Recent posts"));
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/tracker/tracker.module b/modules/tracker/tracker.module
index 1d06272c32d367d94e6a1057cdeb517042f87b89..b75096f8d85ab9ebbc5dcd73de04adf84695df5b 100644
--- a/modules/tracker/tracker.module
+++ b/modules/tracker/tracker.module
@@ -104,15 +104,10 @@ function tracker_page() {
   global $user;
 
   if (user_access("access content")) {
-    drupal_set_title(t("Recent posts"));
-    print theme("header");
-    print tracker_posts(arg(1));
-    print theme("footer");
+    print theme("page", tracker_posts(arg(1)), t("Recent posts"));
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/user.module b/modules/user.module
index 5744621c5c152ce886d021a76dedb218d1874163..f983073ac572455a3c17810de5ac21b67cea2679 100644
--- a/modules/user.module
+++ b/modules/user.module
@@ -963,10 +963,7 @@ function user_view($uid = 0) {
 
     $output .= implode("\n", module_invoke_all("user", "view_private", "", $user));
 
-    drupal_set_title($user->name);
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output, $user->name);
   }
   else if ($uid && $account = user_load(array("uid" => $uid, "status" => 1))) {
     $output = form_item(t("Name"), $account->name);
@@ -977,21 +974,16 @@ function user_view($uid = 0) {
       $output .= form_item(t("Administration"), l(t("edit account"), "admin/user/edit/$account->uid"));
     }
 
-    drupal_set_title($account->name);
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output, $account->name);
   }
   else {
-    $output = user_login();
-    drupal_set_title(t("User login"));
-    print theme("header");
-    print theme("box", t("User login"), $output);
+    $output = theme("box", t("User login"), user_login());
     if (variable_get("user_register", 1)) {
-      print theme("box", t("Create new user account"), user_register());
+      $output .= theme("box", t("Create new user account"), user_register());
     }
-    print theme("box", t("Request new password"), user_pass());
-    print theme("footer");
+    $output .= theme("box", t("Request new password"), user_pass());
+
+    print theme("page", $output, t("User login"));
   }
 }
 
@@ -1007,40 +999,28 @@ function user_page() {
   switch ($op) {
     case t("E-mail new password"):
     case "password":
-      drupal_set_title(t("E-mail new password"));
-      print theme("header");
-      print user_pass($edit);
-      print theme("footer");
+      print theme("page", user_pass($edit), t("E-mail new password"));
       break;
     case t("Create new account"):
     case "register":
       $output = user_register($edit);
-      drupal_set_title(t("Create new account"));
-      print theme("header");
       if (variable_get("user_register", 1)) {
-        print $output;
+        print theme("page", $output, t("Create new account"));
       }
       else {
-        print message_access();
+        print theme("page", message_access());
       }
-      print theme("footer");
       break;
     case t("Log in"):
     case "login":
       $output = user_login($edit);
-      drupal_set_title(t("Log in"));
-      print theme("header");
-      print $output;
-      print theme("footer");
+      print theme("page", $output, t("Log in"));
       break;
     case t("Save user information"):
     case "edit":
       $output = user_edit($edit);
       $GLOBALS["theme"] = init_theme();
-      drupal_set_title(t("Edit account"));
-      print theme("header");
-      print $output;
-      print theme("footer");
+      print theme("page", $output, t("Edit account"));
       break;
     case "view":
       user_view(arg(2));
@@ -1050,10 +1030,7 @@ function user_page() {
       print user_logout();
       break;
     case "help":
-      drupal_set_title(t("Distributed authentication"));
-      print theme("header");
-      print user_help("user/help#user");
-      print theme("footer");
+      print theme("page", user_help("user/help#user"), t("Distributed authentication"));
       break;
     default:
       print user_view();
@@ -1524,14 +1501,10 @@ function user_admin() {
           $output = user_admin_account();
         }
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 // the following functions comprise help for admins and developers
@@ -1753,9 +1726,7 @@ function julia_user(\$type, \$edit, &\$user) {
 }
 
 function user_help_page() {
-  print theme("header");
-  print user_help();
-  print theme("footer");
+  print theme("page", user_help());
 }
 
 ?>
diff --git a/modules/user/user.module b/modules/user/user.module
index 5744621c5c152ce886d021a76dedb218d1874163..f983073ac572455a3c17810de5ac21b67cea2679 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -963,10 +963,7 @@ function user_view($uid = 0) {
 
     $output .= implode("\n", module_invoke_all("user", "view_private", "", $user));
 
-    drupal_set_title($user->name);
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output, $user->name);
   }
   else if ($uid && $account = user_load(array("uid" => $uid, "status" => 1))) {
     $output = form_item(t("Name"), $account->name);
@@ -977,21 +974,16 @@ function user_view($uid = 0) {
       $output .= form_item(t("Administration"), l(t("edit account"), "admin/user/edit/$account->uid"));
     }
 
-    drupal_set_title($account->name);
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output, $account->name);
   }
   else {
-    $output = user_login();
-    drupal_set_title(t("User login"));
-    print theme("header");
-    print theme("box", t("User login"), $output);
+    $output = theme("box", t("User login"), user_login());
     if (variable_get("user_register", 1)) {
-      print theme("box", t("Create new user account"), user_register());
+      $output .= theme("box", t("Create new user account"), user_register());
     }
-    print theme("box", t("Request new password"), user_pass());
-    print theme("footer");
+    $output .= theme("box", t("Request new password"), user_pass());
+
+    print theme("page", $output, t("User login"));
   }
 }
 
@@ -1007,40 +999,28 @@ function user_page() {
   switch ($op) {
     case t("E-mail new password"):
     case "password":
-      drupal_set_title(t("E-mail new password"));
-      print theme("header");
-      print user_pass($edit);
-      print theme("footer");
+      print theme("page", user_pass($edit), t("E-mail new password"));
       break;
     case t("Create new account"):
     case "register":
       $output = user_register($edit);
-      drupal_set_title(t("Create new account"));
-      print theme("header");
       if (variable_get("user_register", 1)) {
-        print $output;
+        print theme("page", $output, t("Create new account"));
       }
       else {
-        print message_access();
+        print theme("page", message_access());
       }
-      print theme("footer");
       break;
     case t("Log in"):
     case "login":
       $output = user_login($edit);
-      drupal_set_title(t("Log in"));
-      print theme("header");
-      print $output;
-      print theme("footer");
+      print theme("page", $output, t("Log in"));
       break;
     case t("Save user information"):
     case "edit":
       $output = user_edit($edit);
       $GLOBALS["theme"] = init_theme();
-      drupal_set_title(t("Edit account"));
-      print theme("header");
-      print $output;
-      print theme("footer");
+      print theme("page", $output, t("Edit account"));
       break;
     case "view":
       user_view(arg(2));
@@ -1050,10 +1030,7 @@ function user_page() {
       print user_logout();
       break;
     case "help":
-      drupal_set_title(t("Distributed authentication"));
-      print theme("header");
-      print user_help("user/help#user");
-      print theme("footer");
+      print theme("page", user_help("user/help#user"), t("Distributed authentication"));
       break;
     default:
       print user_view();
@@ -1524,14 +1501,10 @@ function user_admin() {
           $output = user_admin_account();
         }
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 // the following functions comprise help for admins and developers
@@ -1753,9 +1726,7 @@ function julia_user(\$type, \$edit, &\$user) {
 }
 
 function user_help_page() {
-  print theme("header");
-  print user_help();
-  print theme("footer");
+  print theme("page", user_help());
 }
 
 ?>
diff --git a/modules/watchdog.module b/modules/watchdog.module
index 5981f58d733f3a810f07e477c1fc6f6484cd4b98..d765d2fc81cebf5bb9444b6f17e04fa456fa4d61 100644
--- a/modules/watchdog.module
+++ b/modules/watchdog.module
@@ -139,14 +139,10 @@ function watchdog_admin() {
       default:
         $output = watchdog_overview(arg(2));
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/modules/watchdog/watchdog.module b/modules/watchdog/watchdog.module
index 5981f58d733f3a810f07e477c1fc6f6484cd4b98..d765d2fc81cebf5bb9444b6f17e04fa456fa4d61 100644
--- a/modules/watchdog/watchdog.module
+++ b/modules/watchdog/watchdog.module
@@ -139,14 +139,10 @@ function watchdog_admin() {
       default:
         $output = watchdog_overview(arg(2));
     }
-    print theme("header");
-    print $output;
-    print theme("footer");
+    print theme("page", $output);
   }
   else {
-    print theme("header");
-    print message_access();
-    print theme("footer");
+    print theme("page", message_access());
   }
 }
 
diff --git a/themes/marvin/marvin.theme b/themes/marvin/marvin.theme
index ed6205a272cca1dc470d7e59859c27fdbd3a496b..5c92a697091b56ee22f4e165c93bfbf90d14204a 100644
--- a/themes/marvin/marvin.theme
+++ b/themes/marvin/marvin.theme
@@ -65,7 +65,7 @@ function marvin_header() {
   return $output;
 }
 
-function marvin_node($node, $main = 0) {
+function marvin_node($node, $main = 0, $page = 0) {
 
   if (module_exist("taxonomy")) {
     $terms = taxonomy_link("taxonomy terms", $node);
@@ -77,7 +77,9 @@ function marvin_node($node, $main = 0) {
   $path = path_to_theme();
   $output  = "\n<!-- node: \"$node->title\" -->\n";
   $output .= "<table cellpadding=\"0\" cellspacing=\"0\" style=\"border 0px; width: 100%;\">\n";
-  $output .= " <tr><td$colspan><img src=\"$path/images/drop.gif\" alt=\"\" title=\"\" /> &nbsp; <b>$node->title</b></td></tr>\n";
+  if ($page == 0) {
+    $output .= " <tr><td$colspan><img src=\"$path/images/drop.gif\" alt=\"\" title=\"\" /> &nbsp; <b>$node->title</b></td></tr>\n";
+  }
   $output .= " <tr style=\"vertical-align: bottom;\"><td colspan=\"2\" style=\"background-color: #000000; width: 100%;\"><img src=\"$path/images/pixel.gif\" width=\"1\" height=\"1\" alt=\"\" title=\"\" /></td></tr>\n";
   $output .= " <tr><td><div style=\"color: #7c7c7c;\"><small>". t("Submitted by %a on %b", array("%a" => format_name($node), "%b" => format_date($node->created, "large"))) ."</small></div></td>";
   if ($colspan) {
diff --git a/themes/unconed/unconed.theme b/themes/unconed/unconed.theme
index b94f3086982b87b269c2cf3256a3f465610e7beb..cee33d4db2e191f6b5a5091513866e691d09f385 100644
--- a/themes/unconed/unconed.theme
+++ b/themes/unconed/unconed.theme
@@ -82,7 +82,7 @@ function unconed_header() {
   }
 }
 
-function unconed_node($node, $main = 0) {
+function unconed_node($node, $main = 0, $page = 0) {
   $foreground = "#000000";
   $background = "#ffffff";
 
@@ -111,7 +111,13 @@ function unconed_node($node, $main = 0) {
       <table border="0" cellpadding="0" cellspacing="0" style="background-color: <?php echo $brcolor1; ?>; width: 100%;">
       <tr><td>
       <table border="0" cellpadding="4" cellspacing="1" style="width: 100%;">
+      <?php
+        if ($page == 0) {
+      ?>
         <tr><td colspan="2" style="background-color: <?php echo $bgcolor1; ?>; width: 100%;"><table cellpadding="0" cellspacing="0" style="width: 100%;"><tr><td style="width: 100%;"><div style="color: <?php echo $fgcolor1; ?>;"><b><?php echo "$node->title"; ?></b></div></td><td style="vertical-align: middle; text-align: center;"><img src="<?php print path_to_theme(); ?>/images/icon.gif" alt="" title="" /></td></tr></table></td></tr>
+      <?php
+        }
+      ?>
         <tr style="background-color: <?php echo $bgcolor2; ?>;">
         <?php
           if (module_exist("taxonomy")) {
diff --git a/themes/xtemplate/xtemplate.theme b/themes/xtemplate/xtemplate.theme
index 6abe6fa8ba0604687e7207d160d690394d229046..182ac7048c9f7fca0160fe3198b8d53a321cd82d 100644
--- a/themes/xtemplate/xtemplate.theme
+++ b/themes/xtemplate/xtemplate.theme
@@ -31,7 +31,7 @@ function xtemplate_help($section) {
   return $output;
 }
 
-function xtemplate_node($node, $main = 0) {
+function xtemplate_node($node, $main = 0, $page = 0) {
   global $xtemplate;
 
   $xtemplate->template->assign(array(
@@ -55,6 +55,10 @@ function xtemplate_node($node, $main = 0) {
     $xtemplate->template->assign("links", "");
   }
 
+  if ($page == 0) {
+    $xtemplate->template->parse("node.title");
+  }
+
   $xtemplate->template->parse("node");
   $output = $xtemplate->template->text("node");
   $xtemplate->template->reset("node");
diff --git a/themes/xtemplate/xtemplate.xtmpl b/themes/xtemplate/xtemplate.xtmpl
index e9199c674b362acda3dd940904d06b00ba033283..73af28cf2152d2b97078417d3206376e1659a70f 100644
--- a/themes/xtemplate/xtemplate.xtmpl
+++ b/themes/xtemplate/xtemplate.xtmpl
@@ -52,7 +52,9 @@
 
 <!-- BEGIN: node -->
   <div class="node">
+    <!-- BEGIN: title -->
     <h2><a href="{link}">{title}</a></h2>
+    <!-- END: title -->
     <span class="author">Submitted by {author} on {date}.</span>
     <span class="taxonomy">{taxonomy}</span>
     <div class="content">{content}</div>