     /**
      *  @private
      */ 
-    private function viewMenu_resizeHandler(event:ResizeEvent):void
-    {
-        // Reposition the view menu?
-        currentViewMenu.y = Math.ceil(getLayoutBoundsHeight() - currentViewMenu.getLayoutBoundsHeight());
-    }
-    
-    /**
-     *  @private
-     */ 
     private function openViewMenu():void
     {
-        currentViewMenu = ViewMenu(viewMenu.newInstance());
-        currentViewMenu.items = activeView.viewMenuItems;
-        currentViewMenu.owner = this;
-        currentViewMenu.addEventListener(MouseEvent.CLICK, viewMenu_clickHandler);
-        currentViewMenu.width = getLayoutBoundsWidth();
-        
-        PopUpManager.addPopUp(currentViewMenu, this, true);   
-        // Force a layout pass so we can properly position the viewMenu
-        currentViewMenu.validateNow();
-        
-        currentViewMenu.x = 0;
-        currentViewMenu.y = Math.ceil(getLayoutBoundsHeight() - currentViewMenu.getLayoutBoundsHeight());
-        
-        lastFocus = getFocus();
-        
-        currentViewMenu.setFocus();
-        currentViewMenu.addEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, viewMenu_mouseDownOutsideHandler);
-        
-        // Listen for resize if the icon is loaded from disk or via URL
-        currentViewMenu.addEventListener(ResizeEvent.RESIZE, viewMenu_resizeHandler);
-        
+        if (!currentViewMenu)
+        {
+            currentViewMenu = ViewMenu(viewMenu.newInstance());
+            currentViewMenu.items = activeView.viewMenuItems;
+            
+            // Size the menu as big as the app
+            currentViewMenu.width = getLayoutBoundsWidth();
+            currentViewMenu.height = getLayoutBoundsHeight();
+            
+            // Remember the focus, we'll restore it when the menu closes
+            lastFocus = getFocus();
+            currentViewMenu.setFocus();
+            
+            currentViewMenu.addEventListener(MouseEvent.CLICK, viewMenu_clickHandler);
+            currentViewMenu.addEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, viewMenu_mouseDownOutsideHandler);
+            currentViewMenu.addEventListener(PopUpCloseEvent.CLOSE, viewMenuClose_handler);
+        }
+        
+        currentViewMenu.open(this, false /*modal*/);
+
         // Private event for testing
         if (activeView.hasEventListener("viewMenuOpen"))
             activeView.dispatchEvent(new Event("viewMenuOpen"));
     }
-    
+
     /**
      *  @private
      */ 
     private function closeViewMenu():void
     {
+        if (currentViewMenu)
+            currentViewMenu.close();
+    }
+
+    /**
+     *  @private
+     */ 
+    private function viewMenuClose_handler(event:PopUpCloseEvent):void
+    {
+        currentViewMenu.removeEventListener(PopUpCloseEvent.CLOSE, viewMenuClose_handler);
         currentViewMenu.removeEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, viewMenu_mouseDownOutsideHandler);
-        PopUpManager.removePopUp(currentViewMenu);
+        currentViewMenu.removeEventListener(MouseEvent.CLICK, viewMenu_clickHandler);
         
         // Private event for testing
         if (activeView.hasEventListener("viewMenuClose"))
             activeView.dispatchEvent(new Event("viewMenuClose"));
         
+        // Clear the caret and validate properties to put back the viewMenu items
+        // in their default state so that next time we open the menu we don't
+        // see an item in a stale "caret" state.
         currentViewMenu.caretIndex = -1;
         currentViewMenu.validateProperties();
-        currentViewMenu.removeEventListener(MouseEvent.CLICK, viewMenu_clickHandler);
-        currentViewMenu.removeEventListener(ResizeEvent.RESIZE, viewMenu_resizeHandler);
+        
         currentViewMenu.items = null;
         currentViewMenu = null;
         
+        // Restore focus
         systemManager.stage.focus = lastFocus;
     }
     

            menuKeyHandler(event);
    }
    
    
    /**
     *  @private
     * 
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 2.5
     *  @productversion Flex 4.5
     */  
    private function orientationChangeHandler(event:StageOrientationEvent):void
    {   
        if (viewMenuOpen)
        {
            // Change the width
            // Reposition
            currentViewMenu.width = getLayoutBoundsWidth();
            
            
            currentViewMenu.validateNow();
            
            currentViewMenu.x = 0;
            currentViewMenu.y = Math.ceil(getLayoutBoundsHeight() - currentViewMenu.getLayoutBoundsHeight());
        }
    } 
    
    /**
     *  @private
     */ 

import spark.components.ViewMenuItem;
import spark.core.managers.IPersistenceManager;
import spark.core.managers.PersistenceManager;
import spark.events.PopUpCloseEvent;

[Exclude(name="controlBarContent", kind="property")]
[Exclude(name="controlBarGroup", kind="property")]
