diff --git a/modules/forum.module b/modules/forum.module
index c18b13fa0f285ae4acefa2d4df244c816ec28802..0d1fbf6f62a630165418f6dda28851350e7f2c61 100644
--- a/modules/forum.module
+++ b/modules/forum.module
@@ -85,30 +85,42 @@ function forum_load($node) {
   return $forum;
 }
 
-function forum_block() {
-  if (user_access("access content")) {
-    $content .= "<b>". t("Active forum topics:") ."</b><br />";
-    $result = db_query("SELECT n.nid, n.title, n.body, GREATEST(n.created, MAX(c.timestamp)) AS sort FROM node n, forum f LEFT JOIN comments c ON c.nid = n.nid WHERE n.type = 'forum' AND n.nid = f.nid AND f.shadow = 0 AND n.status = 1 GROUP BY n.nid ORDER BY sort DESC LIMIT ". variable_get("forum_block_num", "5"));
-    while ($node = db_fetch_object($result)) {
-      $content .= "- ".l(check_output($node->title), array("id" => $node->nid), "node", "", array("title" => substr(strip_tags($node->body), 0, 100)."...")) ."<br />";
-    }
+function forum_block($op = "list", $delta = 0) {
+  if ($op == "list") {
+    $blocks[0]["info"] = t("Forum topics");
+  }
+  else {
+    if (user_access("access content")) {
+      if (variable_get("forum_cache", 0)) {
+        $content = cache_get("forum:block");
+      }
+      
+      if (!$content) {
+        $content = "<b>". t("Active forum topics:") ."</b><br />";
+        $result = db_query("SELECT n.nid, n.title, n.body, GREATEST(n.created, MAX(c.timestamp)) AS sort FROM node n, forum f LEFT JOIN comments c ON c.nid = n.nid WHERE n.type = 'forum' AND n.nid = f.nid AND f.shadow = 0 AND n.status = 1 GROUP BY n.nid ORDER BY sort DESC LIMIT ". variable_get("forum_block_num", "5"));
+        while ($node = db_fetch_object($result)) {
+          $content .= "- ". l(check_output($node->title), array("id" => $node->nid), "node", "", array("title" => substr(strip_tags($node->body), 0, 100)."...")) ."<br />";
+        }
 
-    $content .= "<br />";
-    $content .= "<b>". t("New forum topics:") ."</b><br />";
-    $result = db_query("SELECT n.nid, n.title, n.body FROM node n LEFT JOIN forum f ON n.nid = f.nid WHERE n.type = 'forum' ORDER BY n.nid DESC LIMIT ". variable_get("forum_block_num", "5"));
-    while ($node = db_fetch_object($result)) {
-      $content .= "- ".l(check_output($node->title), array("id" => $node->nid), "node", "", array("title" => substr(strip_tags($node->body), 0, 100)."...")) ."<br />";
-    }
+        $content .= "<br />";
+        $content .= "<b>". t("New forum topics:") ."</b><br />";
+        $result = db_query("SELECT n.nid, n.title, n.body FROM node n LEFT JOIN forum f ON n.nid = f.nid WHERE n.type = 'forum' ORDER BY n.nid DESC LIMIT ". variable_get("forum_block_num", "5"));
+        while ($node = db_fetch_object($result)) {
+          $content .= "- ". l(check_output($node->title), array("id" => $node->nid), "node", "", array("title" => substr(strip_tags($node->body), 0, 100)."...")) ."<br />";
+        }
+        
+        if ($content) {
+          $content .= "<div align=\"right\">". lm(t("more"), array("mod" => "forum")) ."</div>";
+        }
+        
+        cache_set("forum:block", $content, time() + 60 * 3);
+      }
 
-    if ($content) {
-      $content .= "<div align=\"right\">". lm(t("more"), array("mod" => "forum"))."</div>";
+      $blocks["subject"] = t("Forum topics");
+      $blocks["content"] = $content;
     }
   }
 
-  $blocks[0][subject] = t("Forum topics");
-  $blocks[0][content] = $content;
-  $blocks[0][info] = t("Forum topics");
-
   return $blocks;
 }
 
@@ -156,10 +168,6 @@ function forum_link($type, $node) {
     }
   }
 
-  if ($type == "admin" && user_access("administer site configuration")) {
-    $links[] = la(t("forum"), array("mod" => "forum"));
-  }
-
   return $links ? $links : array();
 }
 
@@ -321,6 +329,7 @@ function forum_get_forums($tid = 0) {
   }
 
   if (!$forums) {
+    $forums = array();
     taxonomy_get_tree(variable_get("forum_nav_vocabulary", ""), $_forums, $tid);
     $n = 0;
     foreach ($_forums as $forum) {
@@ -761,4 +770,4 @@ function forum_help() {
   <?php
 }
 
-?>
+?>
\ No newline at end of file
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index c18b13fa0f285ae4acefa2d4df244c816ec28802..0d1fbf6f62a630165418f6dda28851350e7f2c61 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -85,30 +85,42 @@ function forum_load($node) {
   return $forum;
 }
 
-function forum_block() {
-  if (user_access("access content")) {
-    $content .= "<b>". t("Active forum topics:") ."</b><br />";
-    $result = db_query("SELECT n.nid, n.title, n.body, GREATEST(n.created, MAX(c.timestamp)) AS sort FROM node n, forum f LEFT JOIN comments c ON c.nid = n.nid WHERE n.type = 'forum' AND n.nid = f.nid AND f.shadow = 0 AND n.status = 1 GROUP BY n.nid ORDER BY sort DESC LIMIT ". variable_get("forum_block_num", "5"));
-    while ($node = db_fetch_object($result)) {
-      $content .= "- ".l(check_output($node->title), array("id" => $node->nid), "node", "", array("title" => substr(strip_tags($node->body), 0, 100)."...")) ."<br />";
-    }
+function forum_block($op = "list", $delta = 0) {
+  if ($op == "list") {
+    $blocks[0]["info"] = t("Forum topics");
+  }
+  else {
+    if (user_access("access content")) {
+      if (variable_get("forum_cache", 0)) {
+        $content = cache_get("forum:block");
+      }
+      
+      if (!$content) {
+        $content = "<b>". t("Active forum topics:") ."</b><br />";
+        $result = db_query("SELECT n.nid, n.title, n.body, GREATEST(n.created, MAX(c.timestamp)) AS sort FROM node n, forum f LEFT JOIN comments c ON c.nid = n.nid WHERE n.type = 'forum' AND n.nid = f.nid AND f.shadow = 0 AND n.status = 1 GROUP BY n.nid ORDER BY sort DESC LIMIT ". variable_get("forum_block_num", "5"));
+        while ($node = db_fetch_object($result)) {
+          $content .= "- ". l(check_output($node->title), array("id" => $node->nid), "node", "", array("title" => substr(strip_tags($node->body), 0, 100)."...")) ."<br />";
+        }
 
-    $content .= "<br />";
-    $content .= "<b>". t("New forum topics:") ."</b><br />";
-    $result = db_query("SELECT n.nid, n.title, n.body FROM node n LEFT JOIN forum f ON n.nid = f.nid WHERE n.type = 'forum' ORDER BY n.nid DESC LIMIT ". variable_get("forum_block_num", "5"));
-    while ($node = db_fetch_object($result)) {
-      $content .= "- ".l(check_output($node->title), array("id" => $node->nid), "node", "", array("title" => substr(strip_tags($node->body), 0, 100)."...")) ."<br />";
-    }
+        $content .= "<br />";
+        $content .= "<b>". t("New forum topics:") ."</b><br />";
+        $result = db_query("SELECT n.nid, n.title, n.body FROM node n LEFT JOIN forum f ON n.nid = f.nid WHERE n.type = 'forum' ORDER BY n.nid DESC LIMIT ". variable_get("forum_block_num", "5"));
+        while ($node = db_fetch_object($result)) {
+          $content .= "- ". l(check_output($node->title), array("id" => $node->nid), "node", "", array("title" => substr(strip_tags($node->body), 0, 100)."...")) ."<br />";
+        }
+        
+        if ($content) {
+          $content .= "<div align=\"right\">". lm(t("more"), array("mod" => "forum")) ."</div>";
+        }
+        
+        cache_set("forum:block", $content, time() + 60 * 3);
+      }
 
-    if ($content) {
-      $content .= "<div align=\"right\">". lm(t("more"), array("mod" => "forum"))."</div>";
+      $blocks["subject"] = t("Forum topics");
+      $blocks["content"] = $content;
     }
   }
 
-  $blocks[0][subject] = t("Forum topics");
-  $blocks[0][content] = $content;
-  $blocks[0][info] = t("Forum topics");
-
   return $blocks;
 }
 
@@ -156,10 +168,6 @@ function forum_link($type, $node) {
     }
   }
 
-  if ($type == "admin" && user_access("administer site configuration")) {
-    $links[] = la(t("forum"), array("mod" => "forum"));
-  }
-
   return $links ? $links : array();
 }
 
@@ -321,6 +329,7 @@ function forum_get_forums($tid = 0) {
   }
 
   if (!$forums) {
+    $forums = array();
     taxonomy_get_tree(variable_get("forum_nav_vocabulary", ""), $_forums, $tid);
     $n = 0;
     foreach ($_forums as $forum) {
@@ -761,4 +770,4 @@ function forum_help() {
   <?php
 }
 
-?>
+?>
\ No newline at end of file
diff --git a/modules/queue.module b/modules/queue.module
index 4c2dd9824cf604b06ab0bce3424a1d566b88b073..c7b6db3fa283ec1c5eda65057126dc24fc5009a8 100644
--- a/modules/queue.module
+++ b/modules/queue.module
@@ -178,32 +178,38 @@ function queue_page() {
   }
 }
 
-function queue_block() {
-  if (user_access("access submission queue") && (substr_count(request_uri(), drupal_url(array("mod" => "queue"), "module")) || substr_count(request_uri(), drupal_url()))) {
-    global $user, $id;
-    if ($user->uid) {
-      $node = node_load(array("nid" => $id));
-    }
-    if (($user->uid == $node->uid || field_get($node->users, $user->uid)) && $node->moderate == 1) {
-      foreach (explode(",", $node->users) as $vote) {
-        if ($vote) {
-          $data = explode("=", $vote);
-          $account = user_load(array("uid" => $data[0]));
-          $output .= format_name($account) ." voted '$data[1]'.<br />";
-        }
+function queue_block($op = "list", $delta = 0) {
+  if ($op == "list") {
+    $blocks[0]["info"] = t("Moderation results");
+    return $blocks;
+  }
+  else {
+    if (user_access("access submission queue") && (substr_count(request_uri(), drupal_url(array("mod" => "queue"), "module")) || substr_count(request_uri(), drupal_url()))) {
+      global $user, $id;
+      if ($user->uid) {
+        $node = node_load(array("nid" => $id));
       }
+      if (($user->uid == $node->uid || field_get($node->users, $user->uid)) && $node->moderate == 1) {
+        foreach (explode(",", $node->users) as $vote) {
+          if ($vote) {
+            $data = explode("=", $vote);
+            $account = user_load(array("uid" => $data[0]));
+            $output .= format_name($account) ." voted '$data[1]'.<br />";
+          }
+        }
 
+        $block[0]["subject"] = t("Moderation results");
+        $block[0]["content"] = $output ? $output : t("This node has not been moderated yet.");
+        $block[0]["info"] = t("Moderation results");
+      }
+    }
+    elseif ((user_access("access submission queue") || user_access("administer blocks")) && (substr_count(request_uri(), drupal_url(array("mod" => "user"), "module")) || substr_count(request_uri(), drupal_url(array(), "admin")))) {
       $block[0]["subject"] = t("Moderation results");
-      $block[0]["content"] = $output ? $output : t("This node has not been moderated yet.");
       $block[0]["info"] = t("Moderation results");
     }
-  }
-  elseif ((user_access("access submission queue") || user_access("administer blocks")) && (substr_count(request_uri(), drupal_url(array("mod" => "user"), "module")) || substr_count(request_uri(), drupal_url(array(), "admin")))) {
-    $block[0]["subject"] = t("Moderation results");
-    $block[0]["info"] = t("Moderation results");
-  }
 
-  return $block;
+    return $block;
+  }
 }
 
 ?>
diff --git a/modules/statistics.module b/modules/statistics.module
index f5b1bd56913b2b8bd2aa36a97e5fc27aba179014..d4a7137f4a04fab78451859d3c9e1305dbf9ff6e 100644
--- a/modules/statistics.module
+++ b/modules/statistics.module
@@ -839,17 +839,27 @@ function statistics_get($nid) {
 
 
 /* Block hook */
-function statistics_block() {
-
-  $block[0]["subject"] = variable_get("statistics_block_top_title", "Popular content");
-  $block[0]["content"] = statistics_display_topnodes_block();
-  $block[0]["info"] = "Top nodes";
+function statistics_block($op = "list", $delta = 0) {
+  if ($op == "list") {
+    $blocks[0]["info"] = t("Top nodes");
+    $blocks[1]["info"] = t("Who's online");
+    return $blocks;
+  }
+  else {
+    switch($op) {
+      case 0:
+        $block["subject"] = variable_get("statistics_block_top_title", "Popular content");
+        $block["content"] = statistics_display_topnodes_block();
+        break;
 
-  $block[1]["subject"] = variable_get("statistics_block_online_title", "Who's online");
-  $block[1]["content"] = statistics_display_online_block();
-  $block[1]["info"] = "Who's online";
+      case 1:
+        $block["subject"] = variable_get("statistics_block_online_title", "Who's online");
+        $block["content"] = statistics_display_online_block();
+        break;
+    }
 
-  return $block;
+    return $block;
+  }
 }
 
 
diff --git a/modules/statistics/statistics.module b/modules/statistics/statistics.module
index f5b1bd56913b2b8bd2aa36a97e5fc27aba179014..d4a7137f4a04fab78451859d3c9e1305dbf9ff6e 100644
--- a/modules/statistics/statistics.module
+++ b/modules/statistics/statistics.module
@@ -839,17 +839,27 @@ function statistics_get($nid) {
 
 
 /* Block hook */
-function statistics_block() {
-
-  $block[0]["subject"] = variable_get("statistics_block_top_title", "Popular content");
-  $block[0]["content"] = statistics_display_topnodes_block();
-  $block[0]["info"] = "Top nodes";
+function statistics_block($op = "list", $delta = 0) {
+  if ($op == "list") {
+    $blocks[0]["info"] = t("Top nodes");
+    $blocks[1]["info"] = t("Who's online");
+    return $blocks;
+  }
+  else {
+    switch($op) {
+      case 0:
+        $block["subject"] = variable_get("statistics_block_top_title", "Popular content");
+        $block["content"] = statistics_display_topnodes_block();
+        break;
 
-  $block[1]["subject"] = variable_get("statistics_block_online_title", "Who's online");
-  $block[1]["content"] = statistics_display_online_block();
-  $block[1]["info"] = "Who's online";
+      case 1:
+        $block["subject"] = variable_get("statistics_block_online_title", "Who's online");
+        $block["content"] = statistics_display_online_block();
+        break;
+    }
 
-  return $block;
+    return $block;
+  }
 }