diff --git modules/menu/menu.admin.inc modules/menu/menu.admin.inc
index 9bf7ef9..fb2aec6 100644
--- modules/menu/menu.admin.inc
+++ modules/menu/menu.admin.inc
@@ -259,7 +259,7 @@ function menu_edit_item($form, &$form_state, $type, $item, $menu) {
 
   $path = $item['link_path'];
   if (isset($item['options']['query'])) {
-    $path .= '?' . $item['options']['query'];
+    $path .= '?' . drupal_http_build_query($item['options']['query']);
   }
   if (isset($item['options']['fragment'])) {
     $path .= '#' . $item['options']['fragment'];
diff --git modules/menu/menu.test modules/menu/menu.test
index fc73b9d..17d52e8 100644
--- modules/menu/menu.test
+++ modules/menu/menu.test
@@ -228,6 +228,27 @@ class MenuTestCase extends DrupalWebTestCase {
   }
 
   /**
+   * Tests that one can add a menu item with a query string and a fragment.
+   * And tests that the query and fragment can be removed again.
+   */
+  function testMenuQueryAndFragment() {
+    $this->drupalLogin($this->big_user);
+
+    // Make a path with query and fragment on.
+    $path = 'node?arg1=value1&arg2=value2';
+    $item = $this->addMenuLink(0, $path);
+
+    $this->drupalGet('admin/structure/menu/item/' . $item['mlid'] . '/edit');
+    $this->assertFieldByName('link_path', $path, t('Path is found with both query and fragment.'));
+
+    // Now change the path to something without query and fragment.
+    $path = 'node';
+    $this->drupalPost('admin/structure/menu/item/' . $item['mlid'] . '/edit', array('link_path' => $path), t('Save'));
+    $this->drupalGet('admin/structure/menu/item/' . $item['mlid'] . '/edit');
+    $this->assertFieldByName('link_path', $path, t('Path no longer has query or fragment.'));
+  }
+
+  /**
    * Add a menu link using the menu module UI.
    *
    * @param integer $plid Parent menu link id.
@@ -268,6 +289,13 @@ class MenuTestCase extends DrupalWebTestCase {
     // Both menu links were created in the navigation menu.
     $this->assertEqual($item['menu_name'], $menu_name);
     $this->assertEqual($item['plid'], $plid);
+    $options = unserialize($item['options']);
+    if (!empty($options['query'])) {
+      $item['link_path'] .= '?' . drupal_http_build_query($options['query']);
+    }
+    if (!empty($options['fragment'])) {
+      $item['link_path'] .= '#' . $options['fragment'];
+    }
     $this->assertEqual($item['link_path'], $link);
     $this->assertEqual($item['link_title'], $title);
     if ($plid == 0) {
