diff --git a/user/src/com/google/gwt/user/client/ui/PopupPanel.java b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
index 1a2e62e..623f193 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
@@ -389,7 +389,7 @@
 
     int left = (Window.getClientWidth() - getOffsetWidth()) >> 1;
     int top = (Window.getClientHeight() - getOffsetHeight()) >> 1;
-    setPopupPosition(Window.getScrollLeft() + left, Window.getScrollTop() + top);
+    setPopupPosition(Math.max(Window.getScrollLeft() + left, 0), Math.max(Window.getScrollTop() + top, 0));
 
     if (!initiallyShowing) {
       setAnimationEnabled(initiallyAnimated);
diff --git a/user/test/com/google/gwt/user/client/ui/PopupTest.java b/user/test/com/google/gwt/user/client/ui/PopupTest.java
index 1281c0a..44631cf 100644
--- a/user/test/com/google/gwt/user/client/ui/PopupTest.java
+++ b/user/test/com/google/gwt/user/client/ui/PopupTest.java
@@ -35,15 +35,15 @@
   private static class TestablePopupPanel extends PopupPanel {
     private int onLoadCount;
 
+    public void assertOnLoadCount(int expected) {
+      assertEquals(expected, onLoadCount);
+    }
+
     @Override
     public Element getContainerElement() {
       return super.getContainerElement();
     }
 
-    public void assertOnLoadCount(int expected) {
-      assertEquals(expected, onLoadCount);
-    }
-
     @Override
     public void onLoad() {
       super.onLoad();
@@ -113,6 +113,20 @@
   }
 
   /**
+   * Tests that a large PopupPanel is not positioned off the top or left edges
+   * of the browser window, making part of the panel unreachable.
+   */
+  public void testCenterLargePopup() {
+    PopupPanel popup = new PopupPanel();
+    popup.setHeight("1000px");
+    popup.setWidth("1000px");
+    popup.setWidget(new Label("foo"));
+    popup.center();
+    assertEquals(0, popup.getAbsoluteTop());
+    assertEquals(0, popup.getAbsoluteLeft());
+  }
+
+  /**
    * Issue 2463: If a {@link PopupPanel} contains a dependent {@link PopupPanel}
    * that is hidden or shown in the onDetach or onAttach method, we could run
    * into conflicts with the animations. The {@link MenuBar} exhibits this
@@ -182,28 +196,6 @@
     }
   }
 
-  /**
-   * Test the showing a popup while it is hiding will not result in an illegal
-   * state.
-   */
-  public void testShowWhileHiding() {
-    PopupPanel popup = createPopupPanel();
-
-    // Show the popup
-    popup.setAnimationEnabled(false);
-    popup.show();
-    assertTrue(popup.isShowing());
-
-    // Start hiding the popup
-    popup.setAnimationEnabled(true);
-    popup.hide();
-    assertFalse(popup.isShowing());
-
-    // Show the popup while its hiding
-    popup.show();
-    assertTrue(popup.isShowing());
-  }
-
   @DoNotRunWith(Platform.Htmlunit)
   public void testPopup() {
     // Get rid of window margins so we can test absolute position.
@@ -278,6 +270,28 @@
   }
 
   /**
+   * Test the showing a popup while it is hiding will not result in an illegal
+   * state.
+   */
+  public void testShowWhileHiding() {
+    PopupPanel popup = createPopupPanel();
+
+    // Show the popup
+    popup.setAnimationEnabled(false);
+    popup.show();
+    assertTrue(popup.isShowing());
+
+    // Start hiding the popup
+    popup.setAnimationEnabled(true);
+    popup.hide();
+    assertFalse(popup.isShowing());
+
+    // Show the popup while its hiding
+    popup.show();
+    assertTrue(popup.isShowing());
+  }
+
+  /**
    * Create a new PopupPanel.
    */
   protected PopupPanel createPopupPanel() {
