diff --git a/user/src/com/google/gwt/user/client/ui/DisclosurePanelImages.java b/user/src/com/google/gwt/user/client/ui/DisclosurePanelImages.java
index ae8792f..89497f2 100644
--- a/user/src/com/google/gwt/user/client/ui/DisclosurePanelImages.java
+++ b/user/src/com/google/gwt/user/client/ui/DisclosurePanelImages.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2007 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,39 +19,18 @@
  * An {@link ImageBundle} that provides images for {@link DisclosurePanel}.
  */
 public interface DisclosurePanelImages extends ImageBundle {
-  
+
   /**
    * An image indicating an open disclosure panel.
-   * 
+   *
    * @return a prototype of this image
    */
   AbstractImagePrototype disclosurePanelOpen();
-  
+
   /**
    * An image indicating a closed disclosure panel.
-   * 
+   *
    * @return a prototype of this image
    */
   AbstractImagePrototype disclosurePanelClosed();
 }
-
-/**
- * A bundle containing the RTL versions of the images for DisclosurePanel. Right now, we
- * only need to override the disclosurePanelClosed() method, as the image that we provide
- * for disclosurePanelOpen() is direction-agnostic.
- * 
- * Notice that this interface is package protected. This interface need not be
- * publicly exposed, as it is only used by the DisclosurePanel class to provide RTL
- * versions of the images in the case the the user does not pass in their own
- * bundle. However, we cannot make this class private, because the generated
- * class needs to be able to extend this class.
- */
-interface DisclosurePanelImagesRTL extends DisclosurePanelImages {
-  /**
-   * An image indicating a closed disclosure panel for a RTL context.
-   * 
-   * @return a prototype of this image
-   */
-  @Resource("disclosurePanelClosed_rtl.png")
-  AbstractImagePrototype disclosurePanelClosed();
-}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/user/client/ui/DisclosurePanelImagesRTL.java b/user/src/com/google/gwt/user/client/ui/DisclosurePanelImagesRTL.java
new file mode 100644
index 0000000..05872bc
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/ui/DisclosurePanelImagesRTL.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client.ui;
+
+/**
+ * A bundle containing the RTL versions of the images for DisclosurePanel. Right now, we
+ * only need to override the disclosurePanelClosed() method, as the image that we provide
+ * for disclosurePanelOpen() is direction-agnostic.
+ */
+public interface DisclosurePanelImagesRTL extends DisclosurePanelImages {
+  /**
+   * An image indicating a closed disclosure panel for a RTL context.
+   *
+   * @return a prototype of this image
+   */
+  @Resource("disclosurePanelClosed_rtl.png")
+  AbstractImagePrototype disclosurePanelClosed();
+}
diff --git a/user/src/com/google/gwt/user/client/ui/MenuBar.java b/user/src/com/google/gwt/user/client/ui/MenuBar.java
index a9fa5b3..3bc10ee 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuBar.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuBar.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -37,11 +37,11 @@
  * A standard menu bar widget. A menu bar can contain any number of menu items,
  * each of which can either fire a {@link com.google.gwt.user.client.Command} or
  * open a cascaded menu bar.
- * 
+ *
  * <p>
  * <img class='gallery' src='MenuBar.png'/>
  * </p>
- * 
+ *
  * <h3>CSS Style Rules</h3>
  * <dl>
  * <dd>.gwt-MenuBar</dd>
@@ -90,12 +90,13 @@
  * <dt>the bottom center cell</dt>
  * <dd>.gwt-MenuBarPopup .menuPopupBottomCenterInner</dd>
  * <dt>the inner element of the cell</dt>
+
  * <dd>.gwt-MenuBarPopup .menuPopupBottomRight</dd>
  * <dt>the bottom right cell</dt>
  * <dd>.gwt-MenuBarPopup .menuPopupBottomRightInner</dd>
  * <dt>the inner element of the cell</dt>
  * </dl>
- * 
+ *
  * <p>
  * <h3>Example</h3>
  * {@example com.google.gwt.examples.MenuBarExample}
@@ -112,7 +113,7 @@
   public interface MenuBarImages extends ImageBundle {
     /**
      * An image indicating a {@link MenuItem} has an associated submenu.
-     * 
+     *
      * @return a prototype of this image
      */
     AbstractImagePrototype menuBarSubMenuIcon();
@@ -120,7 +121,7 @@
 
   /**
    * A bundle containing the RTL versions of the images for MenuBar.
-   * 
+   *
    * Notice that this interface is package protected. This interface need not be
    * publicly exposed, as it is only used by the MenuBar class to provide RTL
    * versions of the images in the case the the user does not pass in their own
@@ -131,7 +132,7 @@
     /**
      * An image indicating a {@link MenuItem} has an associated submenu for a
      * RTL context.
-     * 
+     *
      * @return a prototype of this image
      */
     @Resource("menuBarSubMenuIcon_rtl.gif")
@@ -169,7 +170,7 @@
 
   /**
    * Creates an empty menu bar.
-   * 
+   *
    * @param vertical <code>true</code> to orient the menu bar vertically
    */
   public MenuBar(boolean vertical) {
@@ -184,7 +185,7 @@
   /**
    * Creates an empty menu bar that uses the specified image bundle for menu
    * images.
-   * 
+   *
    * @param vertical <code>true</code> to orient the menu bar vertically
    * @param images a bundle that provides images for this menu
    */
@@ -195,7 +196,7 @@
   /**
    * Creates an empty horizontal menu bar that uses the specified image bundle
    * for menu images.
-   * 
+   *
    * @param images a bundle that provides images for this menu
    */
   public MenuBar(MenuBarImages images) {
@@ -208,7 +209,7 @@
 
   /**
    * Adds a menu item to the bar.
-   * 
+   *
    * @param item the item to be added
    * @return the {@link MenuItem} object
    */
@@ -219,7 +220,7 @@
   /**
    * Adds a menu item to the bar, that will fire the given command when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param asHTML <code>true</code> to treat the specified text as html
    * @param cmd the command to be fired
@@ -232,7 +233,7 @@
   /**
    * Adds a menu item to the bar, that will open the specified menu when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param asHTML <code>true</code> to treat the specified text as html
    * @param popup the menu to be cascaded from it
@@ -245,7 +246,7 @@
   /**
    * Adds a menu item to the bar, that will fire the given command when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param cmd the command to be fired
    * @return the {@link MenuItem} object created
@@ -257,7 +258,7 @@
   /**
    * Adds a menu item to the bar, that will open the specified menu when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param popup the menu to be cascaded from it
    * @return the {@link MenuItem} object created
@@ -269,7 +270,7 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s.
-   * 
+   *
    * @return the {@link MenuItemSeparator} object created
    */
   public MenuItemSeparator addSeparator() {
@@ -279,7 +280,7 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s.
-   * 
+   *
    * @param separator the {@link MenuItemSeparator} to be added
    * @return the {@link MenuItemSeparator} object
    */
@@ -315,9 +316,16 @@
   }
 
   /**
+   * Give this MenuBar focus.
+   */
+  public void focus() {
+    FocusPanel.impl.focus(getElement());
+  }
+
+  /**
    * Gets whether this menu bar's child menus will open when the mouse is moved
    * over it.
-   * 
+   *
    * @return <code>true</code> if child menus will auto-open
    */
   public boolean getAutoOpen() {
@@ -326,7 +334,7 @@
 
   /**
    * Get the index of a {@link MenuItem}.
-   * 
+   *
    * @return the index of the item, or -1 if it is not contained by this MenuBar
    */
   public int getItemIndex(MenuItem item) {
@@ -335,7 +343,7 @@
 
   /**
    * Get the index of a {@link MenuItemSeparator}.
-   * 
+   *
    * @return the index of the separator, or -1 if it is not contained by this
    *         MenuBar
    */
@@ -345,7 +353,7 @@
 
   /**
    * Adds a menu item to the bar at a specific index.
-   * 
+   *
    * @param item the item to be inserted
    * @param beforeIndex the index where the item should be inserted
    * @return the {@link MenuItem} object
@@ -380,7 +388,7 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s at the specified index.
-   * 
+   *
    * @param beforeIndex the index where the seperator should be inserted
    * @return the {@link MenuItemSeparator} object
    * @throws IndexOutOfBoundsException if <code>beforeIndex</code> is out of
@@ -393,7 +401,7 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s at the specified index.
-   * 
+   *
    * @param separator the {@link MenuItemSeparator} to be inserted
    * @param beforeIndex the index where the seperator should be inserted
    * @return the {@link MenuItemSeparator} object
@@ -499,7 +507,7 @@
 
   /**
    * Closes the menu bar.
-   * 
+   *
    * @deprecated use {@link #addCloseHandler(CloseHandler)} instead.
    */
   @Deprecated
@@ -522,7 +530,7 @@
 
   /**
    * Removes the specified menu item from the bar.
-   * 
+   *
    * @param item the item to be removed
    */
   public void removeItem(MenuItem item) {
@@ -540,7 +548,7 @@
 
   /**
    * Removes the specified {@link MenuItemSeparator} from the bar.
-   * 
+   *
    * @param separator the separator to be removed
    */
   public void removeSeparator(MenuItemSeparator separator) {
@@ -549,6 +557,49 @@
     }
   }
 
+  /**
+   * Select the given MenuItem, which must be a direct child of this MenuBar.
+   * @param item the MenuItem to select, or null to clear selection
+   */
+  public void selectItem(MenuItem item) {
+    assert item == null || item.getParentMenu() == this;
+
+    if (item == selectedItem) {
+      return;
+    }
+
+    if (selectedItem != null) {
+      selectedItem.setSelectionStyle(false);
+      // Set the style of the submenu indicator
+      if (vertical) {
+        Element tr = DOM.getParent(selectedItem.getElement());
+        if (DOM.getChildCount(tr) == 2) {
+          Element td = DOM.getChild(tr, 1);
+          setStyleName(td, "subMenuIcon-selected", false);
+        }
+      }
+    }
+
+    if (item != null) {
+      item.setSelectionStyle(true);
+
+      // Set the style of the submenu indicator
+      if (vertical) {
+        Element tr = DOM.getParent(item.getElement());
+        if (DOM.getChildCount(tr) == 2) {
+          Element td = DOM.getChild(tr, 1);
+          setStyleName(td, "subMenuIcon-selected", true);
+        }
+      }
+
+      Accessibility.setState(getElement(),
+          Accessibility.STATE_ACTIVEDESCENDANT, DOM.getElementAttribute(
+              item.getElement(), "id"));
+    }
+
+    selectedItem = item;
+  }
+
   public void setAnimationEnabled(boolean enable) {
     isAnimationEnabled = enable;
   }
@@ -556,7 +607,7 @@
   /**
    * Sets whether this menu bar's child menus will open when the mouse is moved
    * over it.
-   * 
+   *
    * @param autoOpen <code>true</code> to cause child menus to auto-open
    */
   public void setAutoOpen(boolean autoOpen) {
@@ -567,7 +618,7 @@
    * Returns a list containing the <code>MenuItem</code> objects in the menu
    * bar. If there are no items in the menu bar, then an empty <code>List</code>
    * object will be returned.
-   * 
+   *
    * @return a list containing the <code>MenuItem</code> objects in the menu bar
    */
   protected List<MenuItem> getItems() {
@@ -578,7 +629,7 @@
    * Returns the <code>MenuItem</code> that is currently selected (highlighted)
    * by the user. If none of the items in the menu are currently selected, then
    * <code>null</code> will be returned.
-   * 
+   *
    * @return the <code>MenuItem</code> that is currently selected, or
    *         <code>null</code> if no items are currently selected
    */
@@ -601,7 +652,7 @@
    * <ul>
    * <li>-item# = the {@link MenuItem} at the specified index.</li>
    * </ul>
-   * 
+   *
    * @see UIObject#onEnsureDebugId(String)
    */
   @Override
@@ -626,7 +677,7 @@
    * popup associated with it, the popup will be shown. If it has a command
    * associated with it, and 'fireCommand' is true, then the command will be
    * fired. Popups associated with other items will be hidden.
-   * 
+   *
    * @param item the item whose popup is to be shown. @param fireCommand
    * <code>true</code> if the item's command should be fired, <code>false</code>
    * otherwise.
@@ -702,46 +753,9 @@
     }
   }
 
-  void selectItem(MenuItem item) {
-    if (item == selectedItem) {
-      return;
-    }
-
-    if (selectedItem != null) {
-      selectedItem.setSelectionStyle(false);
-      // Set the style of the submenu indicator
-      if (vertical) {
-        Element tr = DOM.getParent(selectedItem.getElement());
-        if (DOM.getChildCount(tr) == 2) {
-          Element td = DOM.getChild(tr, 1);
-          setStyleName(td, "subMenuIcon-selected", false);
-        }
-      }
-    }
-
-    if (item != null) {
-      item.setSelectionStyle(true);
-
-      // Set the style of the submenu indicator
-      if (vertical) {
-        Element tr = DOM.getParent(item.getElement());
-        if (DOM.getChildCount(tr) == 2) {
-          Element td = DOM.getChild(tr, 1);
-          setStyleName(td, "subMenuIcon-selected", true);
-        }
-      }
-
-      Accessibility.setState(getElement(),
-          Accessibility.STATE_ACTIVEDESCENDANT, DOM.getElementAttribute(
-              item.getElement(), "id"));
-    }
-
-    selectedItem = item;
-  }
-
   /**
    * Set the IDs of the menu items.
-   * 
+   *
    * @param baseID the base ID
    */
   void setMenuItemDebugIds(String baseID) {
@@ -754,7 +768,7 @@
 
   /**
    * Show or hide the icon used for items with a submenu.
-   * 
+   *
    * @param item the item with or without a submenu
    */
   void updateSubmenuIcon(MenuItem item) {
@@ -793,7 +807,7 @@
   /**
    * Physically add the td element of a {@link MenuItem} or
    * {@link MenuItemSeparator} to this {@link MenuBar}.
-   * 
+   *
    * @param beforeIndex the index where the seperator should be inserted
    * @param tdElem the td element to be added
    */
@@ -831,10 +845,6 @@
     return null;
   }
 
-  private void focus() {
-    FocusPanel.impl.focus(getElement());
-  }
-
   private Element getItemContainerElement() {
     if (vertical) {
       return body;
@@ -979,7 +989,7 @@
     // clear the selection; a keyboard user can cursor down to the first item
     selectItem(null);
   }
- 
+
   private void openPopup(final MenuItem item) {
     // Only the last popup to be opened should preview all event
     if (parentMenu != null && parentMenu.popup != null) {
@@ -1069,7 +1079,7 @@
   /**
    * Removes the specified item from the {@link MenuBar} and the physical DOM
    * structure.
-   * 
+   *
    * @param item the item to be removed
    * @return true if the item was removed
    */
@@ -1088,7 +1098,7 @@
   /**
    * Selects the first item in the menu if no items are currently selected. This
    * method assumes that the menu has at least 1 item.
-   * 
+   *
    * @return true if no item was previously selected and the first item in the
    *         list was selected, false otherwise
    */
@@ -1154,7 +1164,7 @@
 
   /**
    * Set the colspan of a {@link MenuItem} or {@link MenuItemSeparator}.
-   * 
+   *
    * @param item the {@link MenuItem} or {@link MenuItemSeparator}
    * @param colspan the colspan
    */
diff --git a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
index 21beb5b..6e8af4a 100644
--- a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
+++ b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -74,7 +74,7 @@
     bar.removeSeparator(separator0);
     assertEquals(item1, items.get(0));
     assertNull(separator0.getParentMenu());
-    
+
     // Add a bunch of items and clear them all
     MenuItem item2 = bar.addItem("test2", true, blankCommand);
     MenuItemSeparator separator1 = bar.addSeparator();
@@ -182,6 +182,29 @@
     }
   }
 
+  public void testSelectItem() {
+    Command emptyCommand = new Command() {
+      public void execute() {
+      }
+    };
+
+    MenuBar bar = new MenuBar(false);
+    MenuItem item1 = new MenuItem("item1", emptyCommand);
+    MenuItem item2 = new MenuItem("item2", emptyCommand);
+    MenuItem item3 = new MenuItem("item3", emptyCommand);
+    bar.addItem(item1);
+    bar.addItem(item2);
+    bar.addItem(item3);
+    RootPanel.get().add(bar);
+
+    bar.selectItem(item1);
+    assertEquals(item1, bar.getSelectedItem());
+    bar.selectItem(item3);
+    assertEquals(item3, bar.getSelectedItem());
+    bar.selectItem(null);
+    assertNull(bar.getSelectedItem());
+  }
+
   public void testDebugId() {
     Command emptyCommand = new Command() {
       public void execute() {
@@ -202,7 +225,7 @@
     bar.addItem("top1", emptyCommand);
     MenuItem top2 = bar.addItem("top2", subMenu);
     RootPanel.get().add(bar);
-    
+
     // Open the item with a submenu
     bar.itemOver(top2, true);
 
