diff --git a/includes/menu.inc b/includes/menu.inc
index cfd35c7..241d478 100644
--- a/includes/menu.inc
+++ b/includes/menu.inc
@@ -458,8 +458,8 @@ function menu_get_item($path = NULL, $router_item = NULL) {
       }
       if ($router_item['access']) {
         $router_item['map'] = $map;
-        $router_item['page_arguments'] = array_merge(menu_unserialize($router_item['page_arguments'], $map), array_slice($map, $router_item['number_parts']));
-        $router_item['theme_arguments'] = array_merge(menu_unserialize($router_item['theme_arguments'], $map), array_slice($map, $router_item['number_parts']));
+        $router_item['page_arguments'] = menu_unserialize($router_item['page_arguments'], $map);
+        $router_item['theme_arguments'] = menu_unserialize($router_item['theme_arguments'], $map);
       }
     }
     $router_items[$path] = $router_item;
@@ -748,6 +748,12 @@ function _menu_translate(&$router_item, $map, $to_arg = FALSE) {
     $router_item['access'] = FALSE;
     return FALSE;
   }
+  // A path with extra parts is not considered valid. We check here since a
+  // load function like menu_tail_load may have changed the map.
+  if (count($map) > $router_item['number_parts']) {
+    $router_item['access'] = FALSE;
+    return FALSE;
+  }
 
   // Generate the link path for the page request or local tasks.
   $link_map = explode('/', $router_item['path']);
@@ -1860,8 +1866,8 @@ function menu_local_tasks($level = 0) {
     $root_path = $router_item['path'];
 
     foreach ($result as $item) {
-      _menu_translate($item, $map, TRUE);
-      if ($item['tab_parent']) {
+      $translated_map = _menu_translate($item, $map, TRUE);
+      if ($translated_map !== FALSE && $item['tab_parent']) {
         // All tabs, but not the root page.
         $children[$item['tab_parent']][$item['path']] = $item;
       }
@@ -2113,8 +2119,8 @@ function menu_contextual_links($module, $parent_path, $args) {
     $key = drupal_substr($item['path'], $parent_length);
 
     // Denormalize and translate the contextual link.
-    _menu_translate($item, $map, TRUE);
-    if (!$item['access']) {
+    $translated_map = _menu_translate($item, $map, TRUE);
+    if ($translated_map === FALSE || !$item['access']) {
       continue;
     }
     // All contextual links are keyed by the actual "task" path argument,
@@ -2404,8 +2410,8 @@ function menu_link_get_preferred($path = NULL) {
         }
         $candidate_item = $candidates[$link_path][$menu_name];
         $map = explode('/', $path);
-        _menu_translate($candidate_item, $map);
-        if ($candidate_item['access']) {
+        $translated_map = _menu_translate($candidate_item, $map);
+        if ($translated_map !== FALSE && $candidate_item['access']) {
           $preferred_links[$path] = $candidate_item;
         }
         break 2;
diff --git a/modules/comment/comment.module b/modules/comment/comment.module
index 0381fac..0b64b9b 100644
--- a/modules/comment/comment.module
+++ b/modules/comment/comment.module
@@ -277,12 +277,19 @@ function comment_menu() {
   $items['comment/reply/%node'] = array(
     'title' => 'Add new comment',
     'page callback' => 'comment_reply',
-    'page arguments' => array(2),
+    'page arguments' => array(2, NULL),
+    'access callback' => 'node_access',
+    'access arguments' => array('view', 2),
+    'file' => 'comment.pages.inc',
+  );
+  $items['comment/reply/%node/%'] = array(
+    'title' => 'Add new comment',
+    'page callback' => 'comment_reply',
+    'page arguments' => array(2, 3),
     'access callback' => 'node_access',
     'access arguments' => array('view', 2),
     'file' => 'comment.pages.inc',
   );
-
   return $items;
 }
 
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index c58b5c9..cac0b83 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -178,7 +178,8 @@ function forum_menu_local_tasks_alter(&$data, $router_item, $root_path) {
             '#theme' => 'menu_local_action',
             '#link' => array(
               'title' => t('Add new @node_type', array('@node_type' => node_type_get_name($type))),
-              'href' => 'node/add/' . str_replace('_', '-', $type) . '/' . $forum_term->tid,
+              'href' => 'node/add/' . str_replace('_', '-', $type),
+              'localized_options' => array('query' => array('tid' => $forum_term->tid)),
             ),
           );
         }
@@ -604,9 +605,9 @@ function forum_form_alter(&$form, $form_state, $form_id) {
     $form['taxonomy_forums'][$langcode]['#multiple'] = FALSE;
     if (empty($form['taxonomy_forums'][$langcode]['#default_value'])) {
       // If there is no default forum already selected, try to get the forum
-      // ID from the URL (e.g., if we are on a page like node/add/forum/2, we
+      // ID from the URL (e.g., if we are on a page like node/add/forum?forum-id=2, we
       // expect "2" to be the ID of the forum that was requested).
-      $requested_forum_id = arg(3);
+      $requested_forum_id = isset($_GET['tid']) ? $_GET['tid'] : NULL;
       $form['taxonomy_forums'][$langcode]['#default_value'] = is_numeric($requested_forum_id) ? $requested_forum_id : '';
     }
   }
