diff --git a/includes/comment.inc b/includes/comment.inc
index 5d5a3e98c2f10ca368ed7ad573ea168f32e0ca73..983117392a0b07ca6d90794ffd10eb515d3bb44e 100644
--- a/includes/comment.inc
+++ b/includes/comment.inc
@@ -45,6 +45,8 @@ function comment_settings($mode, $order, $threshold) {
 function comment_form($edit) {
   global $user;
 
+  $form .= "<a name=\"comment\"></a>\n";
+
   // name field:
   $form .= form_item(t("Your name"), format_name($user));
 
@@ -293,6 +295,7 @@ function comment_render($lid, $cid) {
       $threshold = $user->uid ? $user->threshold : variable_get(default_comment_threshold, 3);
     }
 
+    print "<a name=\"comment\"></a>\n";
     print "<form method=\"post\" action=\"$REQUEST_URI\">\n";
 
     /*
diff --git a/includes/theme.inc b/includes/theme.inc
index 60bf86cd0cf24a1fda954cb9f6a8a67627b9e348..8a28b81e379948b37282c1acde7e8d93b9c2594f 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -79,15 +79,7 @@ function node($node, $main) {
 
 
   function comment_controls($threshold = 1, $mode = 3, $order = 1) {
-    global $user, $id;
-
-    $output .= form_item(t("Comment viewing options"), comment_mode($mode) . comment_order($order) . comment_threshold($threshold) ." <input type=\"submit\" name=\"op\" value=\"". t("Update settings") ."\" />", t("Select your prefered way to display the comments and click 'Update settings' to active your changes."));
-
-    if (user_access("post comment")) {
-      $output .= form_item(t("Add a comment"), "<input type=\"submit\" name=\"op\" value=\"". t("Add comment") ."\" />", t("Click 'Add comment' to start a new thread in the discussion."));
-    }
-
-    return $output;
+    return form_item(t("Comment viewing options"), comment_mode($mode) . comment_order($order) . comment_threshold($threshold) ." <input type=\"submit\" name=\"op\" value=\"". t("Update settings") ."\" />", t("Select your prefered way to display the comments and click 'Update settings' to active your changes."));
   }
 
   function comment($comment, $link = 0) {
diff --git a/modules/comment.module b/modules/comment.module
index c45dfd9243013e628677a3b5d2fbc88f473d0a54..e0ef2e2c7c0f8c3093314382284ea9161ab8fc24 100644
--- a/modules/comment.module
+++ b/modules/comment.module
@@ -14,11 +14,35 @@ function comment_perm() {
   return array("access comments", "post comments", "administer comments");
 }
 
-function comment_link($type) {
+function comment_link($type, $node = 0, $main = 0) {
   if ($type == "admin" and user_access("administer comments")) {
     $links[] = "<a href=\"admin.php?mod=comment\">comments</a>";
   }
 
+  if ($node->comment) {
+
+    if ($main) {
+
+      /*
+      ** Main page: display the number of comments that have been posted.
+      */
+
+      if (user_access("access comments")) {
+        $links[] = "<a href=\"node.php?id=$node->nid#comment\">". format_plural(node_get_comments($node->nid), "comment", "comments") ."</a>";
+      }
+    }
+    else {
+      /*
+      ** Node page: add a "post comment" link if the user is allowed to
+      ** post comments.
+      */
+
+      if (user_access("post comments")) {
+        $links[] = "<a href=\"node.php?id=$node->nid&op=comment#comment\">". t("add new comment") ."</a>";
+      }
+    }
+  }
+
   return $links ? $links : array();
 }
 
diff --git a/modules/comment/comment.module b/modules/comment/comment.module
index c45dfd9243013e628677a3b5d2fbc88f473d0a54..e0ef2e2c7c0f8c3093314382284ea9161ab8fc24 100644
--- a/modules/comment/comment.module
+++ b/modules/comment/comment.module
@@ -14,11 +14,35 @@ function comment_perm() {
   return array("access comments", "post comments", "administer comments");
 }
 
-function comment_link($type) {
+function comment_link($type, $node = 0, $main = 0) {
   if ($type == "admin" and user_access("administer comments")) {
     $links[] = "<a href=\"admin.php?mod=comment\">comments</a>";
   }
 
+  if ($node->comment) {
+
+    if ($main) {
+
+      /*
+      ** Main page: display the number of comments that have been posted.
+      */
+
+      if (user_access("access comments")) {
+        $links[] = "<a href=\"node.php?id=$node->nid#comment\">". format_plural(node_get_comments($node->nid), "comment", "comments") ."</a>";
+      }
+    }
+    else {
+      /*
+      ** Node page: add a "post comment" link if the user is allowed to
+      ** post comments.
+      */
+
+      if (user_access("post comments")) {
+        $links[] = "<a href=\"node.php?id=$node->nid&op=comment#comment\">". t("add new comment") ."</a>";
+      }
+    }
+  }
+
   return $links ? $links : array();
 }
 
diff --git a/modules/node.module b/modules/node.module
index 53de72abf7f10cd2cfa236033729744e5655654e..6b0dd88fe4284d24509374a81d8207d2e714e558 100644
--- a/modules/node.module
+++ b/modules/node.module
@@ -143,16 +143,16 @@ function node_link($type, $node = 0, $main = 0) {
       $links = $node->links;
     }
 
-    if ($node->teaser != $node->body && $main) {
-      $links[] = "<a href=\"node.php?id=". $node->nid ."\">". t("read more") ."</a>";
+    if ($main && $node->teaser != $node->body) {
+      $links[] = "<a href=\"node.php?id=$node->nid\">". t("read more") ."</a>";
     }
 
-    if ($node->comment) {
-      $links[] = "<a href=\"node.php?id=". $node->nid ."\">". format_plural(node_get_comments($node->nid), "comment", "comments") ."</a>";
+    if (module_invoke($node->type, "access", "update", $node)) {
+      $links[] = "<a href=\"module.php?mod=node&op=edit&id=$node->nid\">". t("edit") ."</a>";
     }
-
+    
     if (user_access("administer nodes")) {
-      $links[] = "<a href=\"admin.php?mod=node&op=edit&id=". $node->nid ."\">". t("edit") ."</a>";
+       $links[] = "<a href=\"admin.php?mod=node&op=edit&id=$node->nid\">". t("administer") ."</a>";
     }
   }
 
diff --git a/modules/node/node.module b/modules/node/node.module
index 53de72abf7f10cd2cfa236033729744e5655654e..6b0dd88fe4284d24509374a81d8207d2e714e558 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -143,16 +143,16 @@ function node_link($type, $node = 0, $main = 0) {
       $links = $node->links;
     }
 
-    if ($node->teaser != $node->body && $main) {
-      $links[] = "<a href=\"node.php?id=". $node->nid ."\">". t("read more") ."</a>";
+    if ($main && $node->teaser != $node->body) {
+      $links[] = "<a href=\"node.php?id=$node->nid\">". t("read more") ."</a>";
     }
 
-    if ($node->comment) {
-      $links[] = "<a href=\"node.php?id=". $node->nid ."\">". format_plural(node_get_comments($node->nid), "comment", "comments") ."</a>";
+    if (module_invoke($node->type, "access", "update", $node)) {
+      $links[] = "<a href=\"module.php?mod=node&op=edit&id=$node->nid\">". t("edit") ."</a>";
     }
-
+    
     if (user_access("administer nodes")) {
-      $links[] = "<a href=\"admin.php?mod=node&op=edit&id=". $node->nid ."\">". t("edit") ."</a>";
+       $links[] = "<a href=\"admin.php?mod=node&op=edit&id=$node->nid\">". t("administer") ."</a>";
     }
   }
 
diff --git a/node.php b/node.php
index 3e5c7520dbb25865b154594bd7c44227a5f3a55e..adb89fca4bc89c5cfe27bf8dd396f40881f42c38 100644
--- a/node.php
+++ b/node.php
@@ -24,7 +24,7 @@ function node_render($node) {
           comment_render($edit[id], $cid);
           $theme->footer();
           break;
-        case t("Add comment"):
+        case "comment":
           $theme->header();
           comment_reply(check_query($cid), check_query($id));
           $theme->footer();