diff --git a/modules/forum.module b/modules/forum.module
index 8e957fe74b2ee877cf438bbe7b1798746b206968..0b77a8813c9e8c11a3f7f52f349b9a581b7e8334 100644
--- a/modules/forum.module
+++ b/modules/forum.module
@@ -400,50 +400,6 @@ function forum_block($op = 'list', $delta = 0, $edit = array()) {
   }
 }
 
-/**
- * Implementation of hook_link().
- */
-function forum_link($type, $node = 0, $main = 0) {
-  global $user;
-
-  $links = array();
-
-  if (!$main && $type == 'node' && $node->type == 'forum') {
-    // get previous and next topic
-
-    $sql = "SELECT n.nid, n.title, n.sticky, l.comment_count, l.last_comment_timestamp FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d WHERE n.status = 1 AND n.type = 'forum' ORDER BY n.sticky DESC, ". _forum_get_topic_order_sql(variable_get('forum_order', 1));
-    $sql = db_rewrite_sql($sql);
-    $result = db_query($sql, $node->tid);
-
-    while ($topic = db_fetch_object($result)) {
-      if ($stop == 1) {
-        $next = new StdClass();
-        $next->nid = $topic->nid;
-        $next->title = $topic->title;
-        break;
-      }
-      if ($topic->nid == $node->nid) {
-        $stop = 1;
-      }
-      else {
-        $prev = new StdClass();
-        $prev->nid = $topic->nid;
-        $prev->title = $topic->title;
-      }
-    }
-
-    if ($prev) {
-      $links[] = l(t('previous forum topic'), "node/$prev->nid", array('title' => check_plain($prev->title)));
-    }
-
-    if ($next) {
-      $links[] = l(t('next forum topic'), "node/$next->nid", array('title' => check_plain($next->title)));
-    }
-  }
-
-  return $links;
-}
-
 function forum_term_path($term) {
   return 'forum/'. $term->tid;
 }
@@ -497,7 +453,6 @@ function forum_menu($may_cache) {
  * Implementation of hook_view().
  */
 function forum_view(&$node, $teaser = FALSE, $page = FALSE) {
-
   if ($page) {
     $vocabulary = taxonomy_get_vocabulary(variable_get('forum_nav_vocabulary', ''));
     // Breadcrumb navigation
@@ -514,6 +469,8 @@ function forum_view(&$node, $teaser = FALSE, $page = FALSE) {
   }
 
   $node = node_prepare($node, $teaser);
+
+  $node->body .= theme('forum_topic_navigation', $node);
 }
 
 /**
@@ -1007,6 +964,51 @@ function theme_forum_icon($new_posts, $num_posts = 0, $comment_mode = 0, $sticky
   return $output;
 }
 
+/**
+ * Format the next/previous forum topic navigation links.
+ *
+ * @ingroup themeable
+ */
+function theme_forum_topic_navigation($node) {
+  $output = '';
+
+  // get previous and next topic
+  $sql = "SELECT n.nid, n.title, n.sticky, l.comment_count, l.last_comment_timestamp FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d WHERE n.status = 1 AND n.type = 'forum' ORDER BY n.sticky DESC, ". _forum_get_topic_order_sql(variable_get('forum_order', 1));
+  $result = db_query(db_rewrite_sql($sql), $node->tid);
+
+  while ($topic = db_fetch_object($result)) {
+    if ($stop == 1) {
+      $next = new StdClass();
+      $next->nid = $topic->nid;
+      $next->title = $topic->title;
+      break;
+    }
+    if ($topic->nid == $node->nid) {
+      $stop = 1;
+    }
+    else {
+      $prev = new StdClass();
+      $prev->nid = $topic->nid;
+      $prev->title = $topic->title;
+    }
+  }
+
+  if ($prev || $next) {
+    $output .= '<div class="forum-topic-navigation">';
+
+    if ($prev) {
+      $output .= l(t('‹ ') . check_plain($prev->title), 'node/'. $prev->nid, array('class' => 'topic-previous', 'title' => t('Go to previous forum topic')));
+    }
+    if ($next) {
+      $output .= l(check_plain($next->title) . t(' ›'), 'node/'. $next->nid, array('class' => 'topic-next', 'title' => t('Go to next forum topic')));
+    }
+
+    $output .= '</div>';
+  }
+
+  return $output;
+}
+
 function _forum_user_last_visit($nid) {
   global $user;
   static $history = array();
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index 8e957fe74b2ee877cf438bbe7b1798746b206968..0b77a8813c9e8c11a3f7f52f349b9a581b7e8334 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -400,50 +400,6 @@ function forum_block($op = 'list', $delta = 0, $edit = array()) {
   }
 }
 
-/**
- * Implementation of hook_link().
- */
-function forum_link($type, $node = 0, $main = 0) {
-  global $user;
-
-  $links = array();
-
-  if (!$main && $type == 'node' && $node->type == 'forum') {
-    // get previous and next topic
-
-    $sql = "SELECT n.nid, n.title, n.sticky, l.comment_count, l.last_comment_timestamp FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d WHERE n.status = 1 AND n.type = 'forum' ORDER BY n.sticky DESC, ". _forum_get_topic_order_sql(variable_get('forum_order', 1));
-    $sql = db_rewrite_sql($sql);
-    $result = db_query($sql, $node->tid);
-
-    while ($topic = db_fetch_object($result)) {
-      if ($stop == 1) {
-        $next = new StdClass();
-        $next->nid = $topic->nid;
-        $next->title = $topic->title;
-        break;
-      }
-      if ($topic->nid == $node->nid) {
-        $stop = 1;
-      }
-      else {
-        $prev = new StdClass();
-        $prev->nid = $topic->nid;
-        $prev->title = $topic->title;
-      }
-    }
-
-    if ($prev) {
-      $links[] = l(t('previous forum topic'), "node/$prev->nid", array('title' => check_plain($prev->title)));
-    }
-
-    if ($next) {
-      $links[] = l(t('next forum topic'), "node/$next->nid", array('title' => check_plain($next->title)));
-    }
-  }
-
-  return $links;
-}
-
 function forum_term_path($term) {
   return 'forum/'. $term->tid;
 }
@@ -497,7 +453,6 @@ function forum_menu($may_cache) {
  * Implementation of hook_view().
  */
 function forum_view(&$node, $teaser = FALSE, $page = FALSE) {
-
   if ($page) {
     $vocabulary = taxonomy_get_vocabulary(variable_get('forum_nav_vocabulary', ''));
     // Breadcrumb navigation
@@ -514,6 +469,8 @@ function forum_view(&$node, $teaser = FALSE, $page = FALSE) {
   }
 
   $node = node_prepare($node, $teaser);
+
+  $node->body .= theme('forum_topic_navigation', $node);
 }
 
 /**
@@ -1007,6 +964,51 @@ function theme_forum_icon($new_posts, $num_posts = 0, $comment_mode = 0, $sticky
   return $output;
 }
 
+/**
+ * Format the next/previous forum topic navigation links.
+ *
+ * @ingroup themeable
+ */
+function theme_forum_topic_navigation($node) {
+  $output = '';
+
+  // get previous and next topic
+  $sql = "SELECT n.nid, n.title, n.sticky, l.comment_count, l.last_comment_timestamp FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d WHERE n.status = 1 AND n.type = 'forum' ORDER BY n.sticky DESC, ". _forum_get_topic_order_sql(variable_get('forum_order', 1));
+  $result = db_query(db_rewrite_sql($sql), $node->tid);
+
+  while ($topic = db_fetch_object($result)) {
+    if ($stop == 1) {
+      $next = new StdClass();
+      $next->nid = $topic->nid;
+      $next->title = $topic->title;
+      break;
+    }
+    if ($topic->nid == $node->nid) {
+      $stop = 1;
+    }
+    else {
+      $prev = new StdClass();
+      $prev->nid = $topic->nid;
+      $prev->title = $topic->title;
+    }
+  }
+
+  if ($prev || $next) {
+    $output .= '<div class="forum-topic-navigation">';
+
+    if ($prev) {
+      $output .= l(t('‹ ') . check_plain($prev->title), 'node/'. $prev->nid, array('class' => 'topic-previous', 'title' => t('Go to previous forum topic')));
+    }
+    if ($next) {
+      $output .= l(check_plain($next->title) . t(' ›'), 'node/'. $next->nid, array('class' => 'topic-next', 'title' => t('Go to next forum topic')));
+    }
+
+    $output .= '</div>';
+  }
+
+  return $output;
+}
+
 function _forum_user_last_visit($nid) {
   global $user;
   static $history = array();