diff --git a/samples/mail/src/com/google/gwt/sample/mail/client/Shortcuts.java b/samples/mail/src/com/google/gwt/sample/mail/client/Shortcuts.java
index 8fe6a20..211aafe 100644
--- a/samples/mail/src/com/google/gwt/sample/mail/client/Shortcuts.java
+++ b/samples/mail/src/com/google/gwt/sample/mail/client/Shortcuts.java
@@ -17,7 +17,7 @@
 
 import com.google.gwt.user.client.ui.AbstractImagePrototype;
 import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.StackPanel;
+import com.google.gwt.user.client.ui.DecoratedStackPanel;
 import com.google.gwt.user.client.ui.Widget;
 
 /**
@@ -42,7 +42,7 @@
   }
 
   private int nextHeaderIndex = 0;
-  private StackPanel stackPanel = new StackPanel();
+  private DecoratedStackPanel stackPanel = new DecoratedStackPanel();
 
   /**
    * Constructs a new shortcuts widget using the specified images.
diff --git a/samples/mail/src/com/google/gwt/sample/mail/public/Mail.css b/samples/mail/src/com/google/gwt/sample/mail/public/Mail.css
index 8128615..df8c836 100644
--- a/samples/mail/src/com/google/gwt/sample/mail/public/Mail.css
+++ b/samples/mail/src/com/google/gwt/sample/mail/public/Mail.css
@@ -79,98 +79,98 @@
   background: #ccc;
 }
 
-.gwt-StackPanel {
+.gwt-DecoratedStackPanel {
   width: 15em;
   border-bottom: 1px solid #666;
 }
-.gwt-StackPanel .lcaption {
+.gwt-DecoratedStackPanel .lcaption {
   width: 32px;
   padding: 0 0 4px 5px;
 }
-.gwt-StackPanel .rcaption {
+.gwt-DecoratedStackPanel .rcaption {
   padding: 0 0 4px 5px;
 }
-.gwt-StackPanel .gwt-StackPanelContent {
+.gwt-DecoratedStackPanel .gwt-StackPanelContent {
   border: 1px solid #666;
   border-bottom: 0px;
   background: white;
   padding: 2px 2px 10px 5px;
 }
-.gwt-StackPanelItem {
+.gwt-DecoratedStackPanel .gwt-StackPanelItem {
   cursor: pointer;
   cursor: hand;
 }
-.gwt-StackPanelItem .topLeft,
-.gwt-StackPanelItem .topRight {
+.gwt-DecoratedStackPanel .gwt-StackPanelItem .topLeft,
+.gwt-DecoratedStackPanel .gwt-StackPanelItem .topRight {
   width: 4px;
   height: 4px;
-	zoom: 1;
+  zoom: 1;
 }
-html>body .gwt-StackPanelItem .topLeft {
+html>body .gwt-DecoratedStackPanel .gwt-StackPanelItem .topLeft {
   background: #c1eec8 url(leftCorner.gif) no-repeat;
   border-left: 1px solid #666;
 }
-html>body .gwt-StackPanelItem .topRight {
+html>body .gwt-DecoratedStackPanel .gwt-StackPanelItem .topRight {
   background: #c1eec8 url(rightCorner.gif) no-repeat;
   border-right: 1px solid #666;
 }
-.gwt-StackPanelItem .topLeftInner,
-.gwt-StackPanelItem .topRightInner {
+.gwt-DecoratedStackPanel .gwt-StackPanelItem .topLeftInner,
+.gwt-DecoratedStackPanel .gwt-StackPanelItem .topRightInner {
   width: 4px;
   height: 4px;
 }
-* html .gwt-StackPanelItem .topLeftInner {
+* html .gwt-DecoratedStackPanel .gwt-StackPanelItem .topLeftInner {
   overflow: hidden;
   border-left: 1px solid #666;
   background-color: #d3def6;
   filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='leftCorner.gif',sizingMethod='crop');
 }
-* html .gwt-StackPanelItem .topRightInner {
+* html .gwt-DecoratedStackPanel .gwt-StackPanelItem .topRightInner {
   overflow: hidden;
   border-right: 1px solid #666;
   background-color: #d3def6;
   filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='rightCorner.gif',sizingMethod='crop');
 }
-.gwt-StackPanelItem .topCenter {
-	background: #ddefde url(gradient.gif) repeat-x 0px 0px;
+.gwt-DecoratedStackPanel .gwt-StackPanelItem .topCenter {
+  background: #ddefde url(gradient.gif) repeat-x 0px 0px;
 }
-.gwt-StackPanelItem .middleLeft {
+.gwt-DecoratedStackPanel .gwt-StackPanelItem .middleLeft {
   background: #d3def6 url(gradient.gif) repeat-x 0px -1px;
   border-left: 1px solid #666;
 }
-.gwt-StackPanelItem .middleLeftInner,
-.gwt-StackPanelItem .middleRightInner {
+.gwt-DecoratedStackPanel .gwt-StackPanelItem .middleLeftInner,
+.gwt-DecoratedStackPanel .gwt-StackPanelItem .middleRightInner {
   width: 1px;
   height: 1px;
 }
-.gwt-StackPanelItem .middleRight {
+.gwt-DecoratedStackPanel .gwt-StackPanelItem .middleRight {
   background: #d3def6 url(gradient.gif) repeat-x 0px -1px;
   border-right: 1px solid #666;
 }
-.gwt-StackPanelItem .middleCenter {
+.gwt-DecoratedStackPanel .gwt-StackPanelItem .middleCenter {
   font-weight: bold;
   font-size: 1.3em;
   background: #d3def6 url(gradient.gif) repeat-x 0px -1px;
 }
-html>body .gwt-StackPanelItem-first .topRight,
-html>body .gwt-StackPanelItem-first .topLeft {
+html>body .gwt-DecoratedStackPanel .gwt-StackPanelItem-first .topRight,
+html>body .gwt-DecoratedStackPanel .gwt-StackPanelItem-first .topLeft {
   border: 0px;
   background-color: white;
 }
-html>body .gwt-StackPanelItem-below-selected .topLeft,
-html>body .gwt-StackPanelItem-below-selected .topRight {
+html>body .gwt-DecoratedStackPanel .gwt-StackPanelItem-below-selected .topLeft,
+html>body .gwt-DecoratedStackPanel .gwt-StackPanelItem-below-selected .topRight {
   background-color: white;
 }
-* html .gwt-StackPanelItem-first .topLeftInner,
-* html .gwt-StackPanelItem-first .topRightInner {
+* html .gwt-DecoratedStackPanel .gwt-StackPanelItem-first .topLeftInner,
+* html .gwt-DecoratedStackPanel .gwt-StackPanelItem-first .topRightInner {
   border: 0px;
   background-color: white;
 }
-* html .gwt-StackPanelItem-first .topLeftInner {
+* html .gwt-DecoratedStackPanel .gwt-StackPanelItem-first .topLeftInner {
   padding-left: 1px;
 }
-* html .gwt-StackPanelItem-below-selected .topLeftInner,
-* html .gwt-StackPanelItem-below-selected .topRightInner {
+* html .gwt-DecoratedStackPanel .gwt-StackPanelItem-below-selected .topLeftInner,
+* html .gwt-DecoratedStackPanel .gwt-StackPanelItem-below-selected .topRightInner {
   background-color: white;
 }
 
diff --git a/samples/showcase/src/com/google/gwt/sample/showcase/client/content/lists/CwStackPanel.java b/samples/showcase/src/com/google/gwt/sample/showcase/client/content/lists/CwStackPanel.java
index b7d7124..eb746f2 100644
--- a/samples/showcase/src/com/google/gwt/sample/showcase/client/content/lists/CwStackPanel.java
+++ b/samples/showcase/src/com/google/gwt/sample/showcase/client/content/lists/CwStackPanel.java
@@ -20,11 +20,11 @@
 import com.google.gwt.sample.showcase.client.ContentWidget;
 import com.google.gwt.user.client.ui.AbstractImagePrototype;
 import com.google.gwt.user.client.ui.CheckBox;
+import com.google.gwt.user.client.ui.DecoratedStackPanel;
 import com.google.gwt.user.client.ui.HTML;
 import com.google.gwt.user.client.ui.HasVerticalAlignment;
 import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.StackPanel;
 import com.google.gwt.user.client.ui.Tree;
 import com.google.gwt.user.client.ui.TreeImages;
 import com.google.gwt.user.client.ui.TreeItem;
@@ -34,10 +34,9 @@
 /**
  * Example file.
  * 
- * @gwt.CSS .gwt-StackPanel
- * @gwt.CSS .gwt-StackPanelItem
- * @gwt.CSS html>body .gwt-StackPanelItem
- * @gwt.CSS * html .gwt-StackPanelItem
+ * @gwt.CSS .gwt-DecoratedStackPanel
+ * @gwt.CSS html>body .gwt-DecoratedStackPanel
+ * @gwt.CSS * html .gwt-DecoratedStackPanel
  * @gwt.CSS .cw-StackPanelHeader
  */
 public class CwStackPanel extends ContentWidget {
@@ -141,7 +140,7 @@
     Images images = (Images) GWT.create(Images.class);
 
     // Create a new stack panel
-    StackPanel stackPanel = new StackPanel();
+    DecoratedStackPanel stackPanel = new DecoratedStackPanel();
     stackPanel.setWidth("200px");
 
     // Add links to Mail folders
diff --git a/samples/showcase/src/com/google/gwt/sample/showcase/client/content/panels/CwTabPanel.java b/samples/showcase/src/com/google/gwt/sample/showcase/client/content/panels/CwTabPanel.java
index f4f05ca..10b4647 100644
--- a/samples/showcase/src/com/google/gwt/sample/showcase/client/content/panels/CwTabPanel.java
+++ b/samples/showcase/src/com/google/gwt/sample/showcase/client/content/panels/CwTabPanel.java
@@ -18,17 +18,17 @@
 import com.google.gwt.i18n.client.Constants;
 import com.google.gwt.sample.showcase.client.ContentWidget;
 import com.google.gwt.sample.showcase.client.Showcase;
+import com.google.gwt.user.client.ui.DecoratedTabPanel;
 import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.TabPanel;
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.user.client.ui.Widget;
 
 /**
  * Example file.
  * 
- * @gwt.CSS .gwt-TabBar
- * @gwt.CSS html>body .gwt-TabBar
- * @gwt.CSS * html .gwt-TabBar
+ * @gwt.CSS .gwt-DecoratedTabBar
+ * @gwt.CSS html>body .gwt-DecoratedTabBar
+ * @gwt.CSS * html .gwt-DecoratedTabBar
  * @gwt.CSS .gwt-TabPanel
  */
 public class CwTabPanel extends ContentWidget {
@@ -85,7 +85,7 @@
   @Override
   public Widget onInitialize() {
     // Create a tab panel
-    TabPanel tabPanel = new TabPanel();
+    DecoratedTabPanel tabPanel = new DecoratedTabPanel();
     tabPanel.setWidth("400px");
 
     // Enable the deck panel animation
diff --git a/samples/showcase/src/com/google/gwt/sample/showcase/client/content/popups/CwBasicPopup.java b/samples/showcase/src/com/google/gwt/sample/showcase/client/content/popups/CwBasicPopup.java
index 66689fb..a2d4d9f 100644
--- a/samples/showcase/src/com/google/gwt/sample/showcase/client/content/popups/CwBasicPopup.java
+++ b/samples/showcase/src/com/google/gwt/sample/showcase/client/content/popups/CwBasicPopup.java
@@ -20,6 +20,7 @@
 import com.google.gwt.sample.showcase.client.Showcase;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.DecoratedPopupPanel;
 import com.google.gwt.user.client.ui.HTML;
 import com.google.gwt.user.client.ui.Image;
 import com.google.gwt.user.client.ui.PopupPanel;
@@ -32,6 +33,9 @@
  * @gwt.CSS .gwt-PopupPanel
  * @gwt.CSS html>body .gwt-PopupPanel
  * @gwt.CSS * html .gwt-PopupPanel
+ * @gwt.CSS .gwt-DecoratedPopupPanel
+ * @gwt.CSS html>body .gwt-DecoratedPopupPanel
+ * @gwt.CSS * html .gwt-DecoratedPopupPanel
  */
 public class CwBasicPopup extends ContentWidget {
   /**
@@ -87,9 +91,9 @@
   @Override
   public Widget onInitialize() {
     // Create a basic popup widget
-    final PopupPanel simplePopup = new PopupPanel(true);
+    final DecoratedPopupPanel simplePopup = new DecoratedPopupPanel(true);
     simplePopup.ensureDebugId("cwBasicPopup-simplePopup");
-    simplePopup.setWidth("128px");
+    simplePopup.setWidth("150px");
     simplePopup.setWidget(new HTML(
         constants.cwBasicPopupClickOutsideInstructions()));
 
diff --git a/samples/showcase/src/com/google/gwt/sample/showcase/public/default/Showcase.css b/samples/showcase/src/com/google/gwt/sample/showcase/public/default/Showcase.css
index 3de650c..1e4a587 100644
--- a/samples/showcase/src/com/google/gwt/sample/showcase/public/default/Showcase.css
+++ b/samples/showcase/src/com/google/gwt/sample/showcase/public/default/Showcase.css
@@ -74,14 +74,7 @@
   background: url(images/hborder.png) repeat-x 0px -2003px;
   border-bottom: 2px solid #bbcdf3;
 }
-.Application-content-title .gwt-TabBarItem .top,
-.Application-content-title .gwt-TabBarItem .topLeft,
-.Application-content-title .gwt-TabBarItem .topRight,
-.Application-content-title .gwt-TabBarItem .middleLeft,
-.Application-content-title .gwt-TabBarItem .middleRight {
-  display: none;
-}
-.Application-content-title .gwt-TabBarItem .middleCenter {
+.Application-content-title .gwt-TabBarItem {
   background: none;
   padding: 0px;
 }
diff --git a/user/src/com/google/gwt/user/client/ui/DecoratedPopupPanel.java b/user/src/com/google/gwt/user/client/ui/DecoratedPopupPanel.java
new file mode 100644
index 0000000..ce112a7
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/ui/DecoratedPopupPanel.java
@@ -0,0 +1,117 @@
+/*
+ * 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
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client.ui;
+
+import com.google.gwt.user.client.Element;
+
+import java.util.Iterator;
+
+/**
+ * <p>
+ * A {@link PopupPanel} that wraps its content in a 3x3 grid, which allows users
+ * to add rounded corners.
+ * </p>
+ * <h3>CSS Style Rules</h3>
+ * <ul class='css'>
+ * <li>.gwt-DecoratedPopupPanel { the outside of the popup }</li>
+ * <li>.gwt-DecoratedPopupPanel .content { the wrapper around the content }</li>
+ * </ul>
+ * <p>
+ * The styles that apply to {@link DecoratorPanel} also apply to PopupPanel.
+ * </p>
+ */
+public class DecoratedPopupPanel extends PopupPanel {
+  private static final String DEFAULT_STYLENAME = "gwt-DecoratedPopupPanel";
+
+  /**
+   * The panel used to nine box the contents.
+   */
+  private DecoratorPanel decPanel = new DecoratorPanel();
+
+  /**
+   * Creates an empty decorated popup panel. A child widget must be added to it
+   * before it is shown.
+   */
+  public DecoratedPopupPanel() {
+    this(false);
+  }
+
+  /**
+   * Creates an empty decorated popup panel, specifying its "auto-hide"
+   * property.
+   * 
+   * @param autoHide <code>true</code> if the popup should be automatically
+   *          hidden when the user clicks outside of it
+   */
+  public DecoratedPopupPanel(boolean autoHide) {
+    this(autoHide, false);
+  }
+
+  /**
+   * Creates an empty decorated popup panel, specifying its "auto-hide" and
+   * "modal" properties.
+   * 
+   * @param autoHide <code>true</code> if the popup should be automatically
+   *          hidden when the user clicks outside of it
+   * @param modal <code>true</code> if keyboard or mouse events that do not
+   *          target the PopupPanel or its children should be ignored
+   */
+  public DecoratedPopupPanel(boolean autoHide, boolean modal) {
+    super(autoHide, modal);
+    decPanel.setStyleName("");
+    setStylePrimaryName(DEFAULT_STYLENAME);
+    super.setWidget(decPanel);
+    setStyleName(getContainerElement(), "content", false);
+    setStyleName(decPanel.getContainerElement(), "content", true);
+  }
+
+  @Override
+  public void clear() {
+    decPanel.clear();
+  }
+
+  @Override
+  public Widget getWidget() {
+    return decPanel.getWidget();
+  }
+
+  @Override
+  public Iterator<Widget> iterator() {
+    return decPanel.iterator();
+  }
+
+  @Override
+  public boolean remove(Widget w) {
+    return decPanel.remove(w);
+  }
+
+  @Override
+  public void setWidget(Widget w) {
+    decPanel.setWidget(w);
+    maybeUpdateSize();
+  }
+
+  /**
+   * Get a specific Element from the panel.
+   * 
+   * @param row the row index
+   * @param cell the cell index
+   * @return the Element at the given row and cell
+   */
+  protected Element getCellElement(int row, int cell) {
+    return decPanel.getCellElement(row, cell);
+  }
+}
diff --git a/user/src/com/google/gwt/user/client/ui/DecoratedStackPanel.java b/user/src/com/google/gwt/user/client/ui/DecoratedStackPanel.java
new file mode 100644
index 0000000..ab849be
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/ui/DecoratedStackPanel.java
@@ -0,0 +1,80 @@
+/*
+ * 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
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client.ui;
+
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+
+/**
+ * <p>
+ * A {@link StackPanel} that wraps each item in a 2x3 grid (six box), which
+ * allows users to add rounded corners.
+ * </p>
+ * <h3>CSS Style Rules</h3>
+ * <ul class='css'>
+ * <li>.gwt-DecoratedStackPanel { the panel itself }</li>
+ * <li>.gwt-DecoratedStackPanel .gwt-StackPanelItem { unselected items }</li>
+ * <li>.gwt-DecoratedStackPanel .gwt-StackPanelItem-selected { selected items }</li>
+ * <li>.gwt-DecoratedStackPanel .gwt-StackPanelContent { the wrapper around the
+ * contents of the item }</li>
+ * <li>.gwt-DecoratedStackPanel .topLeft { top left corner of the item}</li>
+ * <li>.gwt-DecoratedStackPanel .topCenter { top center of the item}</li>
+ * <li>.gwt-DecoratedStackPanel .topRight { top right corner of the item}</li>
+ * <li>.gwt-DecoratedStackPanel .middleLeft { left side of the item }</li>
+ * <li>.gwt-DecoratedStackPanel .middleCenter { center of the item, where the
+ * item text resides }</li>
+ * <li>.gwt-DecoratedStackPanel .middleRight { right side of the item }</li>
+ * </ul>
+ */
+public class DecoratedStackPanel extends StackPanel {
+  public static final String DEFAULT_STYLENAME = "gwt-DecoratedStackPanel";
+
+  /**
+   * Creates an empty decorated stack panel.
+   */
+  public DecoratedStackPanel() {
+    super();
+    setStylePrimaryName(DEFAULT_STYLENAME);
+  }
+
+  @Override
+  Element createHeaderElem() {
+    // Create the table
+    Element table = DOM.createTable();
+    Element tbody = DOM.createTBody();
+    DOM.appendChild(table, tbody);
+    DOM.setStyleAttribute(table, "width", "100%");
+    DOM.setElementPropertyInt(table, "cellSpacing", 0);
+    DOM.setElementPropertyInt(table, "cellPadding", 0);
+
+    // Add the top row
+    DOM.appendChild(tbody, DecoratorPanel.createTR("top"));
+
+    // Add the middle row
+    DOM.appendChild(tbody, DecoratorPanel.createTR("middle"));
+
+    // Return the table
+    return table;
+  }
+
+  @Override
+  Element getHeaderTextElem(Element headerElem) {
+    Element tbody = DOM.getFirstChild(headerElem);
+    Element tr = DOM.getChild(tbody, 1);
+    Element td = DOM.getChild(tr, 1);
+    return DOM.getFirstChild(td);
+  }
+}
diff --git a/user/src/com/google/gwt/user/client/ui/DecoratedTabBar.java b/user/src/com/google/gwt/user/client/ui/DecoratedTabBar.java
new file mode 100644
index 0000000..43acefe
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/ui/DecoratedTabBar.java
@@ -0,0 +1,63 @@
+/*
+ * 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
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client.ui;
+
+/**
+ * <p>
+ * A {@link TabBar} that wraps each tab in a 2x3 grid (six box), which allows
+ * users to add rounded corners.
+ * </p>
+ * <h3>CSS Style Rules</h3>
+ * <ul class='css'>
+ * <li>.gwt-DecoratedTabBar { the tab bar itself }</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarFirst { the left edge of the bar }</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarRest { the right edge of the bar }</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarItem { unselected tabs }</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarItem-wrapper { table cell around tab }</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarItem-selected { additional style for
+ * selected tabs } </li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarItem-wrapper-selected { table cell
+ * around selected tab }</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarItem .topLeft { top left corner of the
+ * tab}</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarItem .topCenter { top center of the tab}</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarItem .topRight { top right corner of the
+ * tab}</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarItem .middleLeft { left side of the tab }</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarItem .middleCenter { center of the tab,
+ * where the tab text or widget resides }</li>
+ * <li>.gwt-DecoratedTabBar .gwt-TabBarItem .middleRight { right side of the
+ * tab }</li>
+ * </ul>
+ */
+public class DecoratedTabBar extends TabBar {
+  static String[] TAB_ROW_STYLES = {"top", "middle"};
+
+  static final String STYLENAME_DEFAULT = "gwt-DecoratedTabBar";
+
+  /**
+   * Creates an empty {@link DecoratedTabBar}.
+   */
+  public DecoratedTabBar() {
+    super();
+    setStylePrimaryName(STYLENAME_DEFAULT);
+  }
+
+  @Override
+  protected SimplePanel createTabTextWrapper() {
+    return new DecoratorPanel(TAB_ROW_STYLES, 1);
+  }
+}
diff --git a/user/src/com/google/gwt/user/client/ui/DecoratedTabPanel.java b/user/src/com/google/gwt/user/client/ui/DecoratedTabPanel.java
new file mode 100644
index 0000000..5ec9fb8
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/ui/DecoratedTabPanel.java
@@ -0,0 +1,45 @@
+/*
+ * 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
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client.ui;
+
+/**
+ * A {@link TabPanel} that uses a {@link DecoratedTabBar} with rounded corners.
+ * 
+ * <h3>CSS Style Rules</h3>
+ * <ul class='css'>
+ * <li>.gwt-DecoratedTabPanel { the tab panel itself }</li>
+ * <li>.gwt-TabPanelBottom { the bottom section of the tab panel (the deck
+ * containing the widget) }</li>
+ * </ul>
+ * 
+ * <p>
+ * <h3>Example</h3>
+ * {@example com.google.gwt.examples.TabPanelExample}
+ * </p>
+ */
+public class DecoratedTabPanel extends TabPanel {
+  private static final String DEFAULT_STYLENAME = "gwt-DecoratedTabPanel";
+
+  public DecoratedTabPanel() {
+    setStylePrimaryName(DEFAULT_STYLENAME);
+    getTabBar().setStylePrimaryName(DecoratedTabBar.STYLENAME_DEFAULT);
+  }
+
+  @Override
+  protected SimplePanel createTabTextWrapper() {
+    return new DecoratorPanel(DecoratedTabBar.TAB_ROW_STYLES, 1);
+  }
+}
diff --git a/user/src/com/google/gwt/user/client/ui/DecoratorPanel.java b/user/src/com/google/gwt/user/client/ui/DecoratorPanel.java
index 0ec52cf..2fdb849 100644
--- a/user/src/com/google/gwt/user/client/ui/DecoratorPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DecoratorPanel.java
@@ -162,11 +162,6 @@
     setStyleName(DEFAULT_STYLENAME);
   }
 
-  @Override
-  protected Element getContainerElement() {
-    return containerElem;
-  }
-
   /**
    * Get a specific Element from the panel.
    * 
@@ -174,8 +169,14 @@
    * @param cell the cell index
    * @return the Element at the given row and cell
    */
-  Element getCellElement(int row, int cell) {
+  protected Element getCellElement(int row, int cell) {
     Element tr = DOM.getChild(tbody, row);
-    return DOM.getChild(tr, cell);
+    Element td = DOM.getChild(tr, cell);
+    return DOM.getFirstChild(td);
+  }
+
+  @Override
+  protected Element getContainerElement() {
+    return containerElem;
   }
 }
diff --git a/user/src/com/google/gwt/user/client/ui/DialogBox.java b/user/src/com/google/gwt/user/client/ui/DialogBox.java
index d759046..a3d8b4d 100644
--- a/user/src/com/google/gwt/user/client/ui/DialogBox.java
+++ b/user/src/com/google/gwt/user/client/ui/DialogBox.java
@@ -41,7 +41,7 @@
  * {@example com.google.gwt.examples.DialogBoxExample}
  * </p>
  */
-public class DialogBox extends PopupPanel implements HasHTML, HasText,
+public class DialogBox extends DecoratedPopupPanel implements HasHTML, HasText,
     MouseListener {
   /**
    * The default style name.
@@ -201,6 +201,6 @@
   protected void onEnsureDebugId(String baseID) {
     super.onEnsureDebugId(baseID);
     caption.ensureDebugId(baseID + "-caption");
-    ensureDebugId(getContainerElement(), baseID, "content");
+    ensureDebugId(getCellElement(1, 1), baseID, "content");
   }
 }
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 002fcdf..5e55a79 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuBar.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuBar.java
@@ -517,7 +517,7 @@
     // Create a new popup for this item, and position it next to
     // the item (below if this is a horizontal menu bar, to the
     // right if it's a vertical bar).
-    popup = new PopupPanel(true) {
+    popup = new DecoratedPopupPanel(true) {
       {
         setWidget(item.getSubMenu());
         item.getSubMenu().onShow();
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 c81c919..d223f64 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
@@ -45,11 +45,8 @@
  * <li>.gwt-PopupPanel { the outside of the popup }</li>
  * <li>.gwt-PopupPanel .content { the wrapper around the content }</li>
  * </ul>
- * <p>
- * The styles that apply to {@link DecoratorPanel} also apply to PopupPanel.
- * </p>
  */
-public class PopupPanel extends DecoratorPanel implements SourcesPopupEvents,
+public class PopupPanel extends SimplePanel implements SourcesPopupEvents,
     EventPreview, HasAnimation {
   /**
    * The type of animation to use when opening the popup.
@@ -77,7 +74,7 @@
      * The {@link PopupPanel} being affected.
      */
     private PopupPanel curPanel = null;
-    
+
     /**
      * A boolean indicating whether we are showing or hiding the popup.
      */
@@ -95,6 +92,7 @@
         impl.onHide(curPanel.getElement());
       }
       impl.setClip(curPanel.getElement(), "rect(auto, auto, auto, auto)");
+      DOM.setStyleAttribute(curPanel.getElement(), "overflow", "visible");
       curPanel = null;
     }
 
@@ -113,6 +111,7 @@
         RootPanel.get().remove(curPanel);
         impl.onHide(curPanel.getElement());
       }
+      DOM.setStyleAttribute(curPanel.getElement(), "overflow", "visible");
       curPanel = null;
     }
 
@@ -133,6 +132,7 @@
       }
       offsetHeight = curPanel.getOffsetHeight();
       offsetWidth = curPanel.getOffsetWidth();
+      DOM.setStyleAttribute(curPanel.getElement(), "overflow", "hidden");
       onUpdate(0.0);
     }
 
@@ -270,7 +270,6 @@
     setPopupPosition(0, 0);
     setStyleName(DEFAULT_STYLENAME);
     setStyleName(getContainerElement(), "content");
-    DOM.setStyleAttribute(getElement(), "overflow", "hidden");
   }
 
   /**
@@ -285,7 +284,8 @@
   }
 
   /**
-   * Creates an empty popup panel, specifying its "auto-hide" property.
+   * Creates an empty popup panel, specifying its "auto-hide" and "modal"
+   * properties.
    * 
    * @param autoHide <code>true</code> if the popup should be automatically
    *          hidden when the user clicks outside of it
@@ -311,7 +311,7 @@
   public void center() {
     boolean initiallyShowing = showing;
     boolean initiallyAnimated = isAnimationEnabled;
-    
+
     if (!initiallyShowing) {
       setVisible(false);
       setAnimationEnabled(false);
@@ -667,6 +667,32 @@
   }
 
   /**
+   * We control size by setting our child widget's size. However, if we don't
+   * currently have a child, we record the size the user wanted so that when we
+   * do get a child, we can set it correctly. Until size is explicitly cleared,
+   * any child put into the popup will be given that size.
+   */
+  void maybeUpdateSize() {
+    // For subclasses of PopupPanel, we want the default behavior of setWidth
+    // and setHeight to change the dimensions of PopupPanel's child widget.
+    // We do this because PopupPanel's child widget is the first widget in
+    // the hierarchy which provides structure to the panel. DialogBox is
+    // an example of this. We want to set the dimensions on DialogBox's
+    // FlexTable, which is PopupPanel's child widget. However, it is not
+    // DialogBox's child widget. To make sure that we are actually getting
+    // PopupPanel's child widget, we have to use super.getWidget().
+    Widget w = super.getWidget();
+    if (w != null) {
+      if (desiredHeight != null) {
+        w.setHeight(desiredHeight);
+      }
+      if (desiredWidth != null) {
+        w.setWidth(desiredWidth);
+      }
+    }
+  }
+
+  /**
    * Remove focus from an Element.
    * 
    * @param elt The Element on which <code>blur()</code> will be invoked
@@ -694,30 +720,4 @@
       popupListeners.firePopupClosed(this, autoClosed);
     }
   }
-
-  /**
-   * We control size by setting our child widget's size. However, if we don't
-   * currently have a child, we record the size the user wanted so that when we
-   * do get a child, we can set it correctly. Until size is explicitly cleared,
-   * any child put into the popup will be given that size.
-   */
-  private void maybeUpdateSize() {
-    // For subclasses of PopupPanel, we want the default behavior of setWidth
-    // and setHeight to change the dimensions of PopupPanel's child widget.
-    // We do this because PopupPanel's child widget is the first widget in
-    // the hierarchy which provides structure to the panel. DialogBox is
-    // an example of this. We want to set the dimensions on DialogBox's
-    // FlexTable, which is PopupPanel's child widget. However, it is not
-    // DialogBox's child widget. To make sure that we are actually getting
-    // PopupPanel's child widget, we have to use super.getWidget().
-    Widget w = super.getWidget();
-    if (w != null) {
-      if (desiredHeight != null) {
-        w.setHeight(desiredHeight);
-      }
-      if (desiredWidth != null) {
-        w.setWidth(desiredWidth);
-      }
-    }
-  }
 }
diff --git a/user/src/com/google/gwt/user/client/ui/StackPanel.java b/user/src/com/google/gwt/user/client/ui/StackPanel.java
index 2c18ac1..5a00409 100644
--- a/user/src/com/google/gwt/user/client/ui/StackPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/StackPanel.java
@@ -206,13 +206,11 @@
     }
 
     Element tdWrapper = DOM.getChild(DOM.getChild(body, index * 2), 0);
-    Element tbody = DOM.getFirstChild(DOM.getFirstChild(tdWrapper));
-    Element tr = DOM.getChild(tbody, 1);
-    Element td = DOM.getChild(tr, 1);
+    Element headerElem = DOM.getFirstChild(tdWrapper);
     if (asHTML) {
-      DOM.setInnerHTML(td, text);
+      DOM.setInnerHTML(getHeaderTextElem(headerElem), text);
     } else {
-      DOM.setInnerText(td, text);
+      DOM.setInnerText(getHeaderTextElem(headerElem), text);
     }
   }
 
@@ -251,40 +249,31 @@
 
     int numHeaders = DOM.getChildCount(body) >> 1;
     for (int i = 0; i < numHeaders; i++) {
-      Element headerElem = DOM.getFirstChild(DOM.getChild(body, 2 * i));
+      Element tdWrapper = DOM.getFirstChild(DOM.getChild(body, 2 * i));
+      Element headerElem = DOM.getFirstChild(tdWrapper);
       Element bodyElem = DOM.getFirstChild(DOM.getChild(body, 2 * i + 1));
-      ensureDebugId(headerElem, baseID, "text-wrapper" + i);
+      ensureDebugId(tdWrapper, baseID, "text-wrapper" + i);
       ensureDebugId(bodyElem, baseID, "content" + i);
-
-      // Set the ID on the inner most container of the stack item
-      Element table = DOM.getFirstChild(headerElem);
-      Element tbody = DOM.getFirstChild(DOM.getFirstChild(headerElem));
-      Element tr = DOM.getChild(tbody, 1);
-      Element td = DOM.getChild(tr, 1);
-      ensureDebugId(td, baseID, "text" + i);
+      ensureDebugId(getHeaderTextElem(headerElem), baseID, "text" + i);
     }
   }
 
   /**
    * @return a header element
    */
-  private Element createHeaderElem() {
-    // Create the table
-    Element table = DOM.createTable();
-    Element tbody = DOM.createTBody();
-    DOM.appendChild(table, tbody);
-    DOM.setStyleAttribute(table, "width", "100%");
-    DOM.setElementPropertyInt(table, "cellSpacing", 0);
-    DOM.setElementPropertyInt(table, "cellPadding", 0);
+  Element createHeaderElem() {
+    return DOM.createDiv();
+  }
 
-    // Add the top row
-    DOM.appendChild(tbody, DecoratorPanel.createTR("top"));
-
-    // Add the middle row
-    DOM.appendChild(tbody, DecoratorPanel.createTR("middle"));
-
-    // Return the table
-    return table;
+  /**
+   * Get the element that holds the header text given the header element created
+   * by #createHeaderElement.
+   * 
+   * @param headerElem the header element
+   * @return the element around the header text
+   */
+  Element getHeaderTextElem(Element headerElem) {
+    return headerElem;
   }
 
   private int findDividerIndex(Element elem) {
diff --git a/user/src/com/google/gwt/user/client/ui/SuggestBox.java b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
index 87cdbd4..9a4c338 100644
--- a/user/src/com/google/gwt/user/client/ui/SuggestBox.java
+++ b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
@@ -195,7 +195,7 @@
    * SuggestionMenu as its widget, and the position of the SuggestBox's TextBox
    * is needed in order to correctly position the popup.
    */
-  private class SuggestionPopup extends PopupPanel {
+  private class SuggestionPopup extends DecoratedPopupPanel {
 
     private static final String STYLENAME_DEFAULT = "gwt-SuggestBoxPopup";
 
diff --git a/user/src/com/google/gwt/user/client/ui/TabBar.java b/user/src/com/google/gwt/user/client/ui/TabBar.java
index 943a2b1..d1e6a94 100644
--- a/user/src/com/google/gwt/user/client/ui/TabBar.java
+++ b/user/src/com/google/gwt/user/client/ui/TabBar.java
@@ -44,33 +44,38 @@
 public class TabBar extends Composite implements SourcesTabEvents,
     ClickListener, KeyboardListener {
   /**
-   * <code>ClickDecoratorPanel</code> decorates any widget with the minimal
+   * <code>ClickDelegatePanel</code> decorates any widget with the minimal
    * amount of machinery to receive clicks for delegation to the parent.
    * {@link SourcesClickEvents} is not implemented due to the fact that only a
    * single observer is needed.
    */
-  private static final class ClickDecoratorPanel extends DecoratorPanel {
-    /**
-     * The styles applied to the {@link DecoratorPanel}.  We only need to six
-     * box the tabs because we only expect to have rounded corners on the top.
-     */
-    private static String[] ROW_STYLES = {"top", "middle"};
+  private class ClickDelegatePanel extends Composite {
+    private SimplePanel focusablePanel;
+    private ClickListener clickDelegate;
+    private KeyboardListener keyDelegate;
 
-    ClickListener clickDelegate;
-    KeyboardListener keyDelegate;
-
-    ClickDecoratorPanel(Widget child, ClickListener cDelegate, KeyboardListener kDelegate) {
-      super(ROW_STYLES, 1);
+    ClickDelegatePanel(Widget child, ClickListener cDelegate,
+        KeyboardListener kDelegate) {
       this.clickDelegate = cDelegate;
       this.keyDelegate = kDelegate;
-      SimplePanel focusablePanel = new SimplePanel(FocusPanel.impl.createFocusable());
 
+      focusablePanel = new SimplePanel(FocusPanel.impl.createFocusable());
       focusablePanel.setWidget(child);
-      setWidget(focusablePanel);
+      SimplePanel wrapperWidget = createTabTextWrapper(); 
+      if (wrapperWidget == null) {
+        initWidget(focusablePanel);
+      } else {
+        wrapperWidget.setWidget(focusablePanel);
+        initWidget(wrapperWidget);
+      }
 
       sinkEvents(Event.ONCLICK | Event.ONKEYDOWN);
     }
 
+    public SimplePanel getFocusablePanel() {
+      return focusablePanel;
+    }
+
     @Override
     public void onBrowserEvent(Event event) {
       // No need for call to super.
@@ -185,16 +190,16 @@
     if (index >= getTabCount()) {
       return null;
     }
-    ClickDecoratorPanel decPanel = (ClickDecoratorPanel) panel.getWidget(index + 1);
-    SimplePanel focusablePanel = (SimplePanel) decPanel.getWidget();
+    ClickDelegatePanel delPanel = (ClickDelegatePanel) panel.getWidget(index + 1);
+    SimplePanel focusablePanel = delPanel.getFocusablePanel();
     Widget widget = focusablePanel.getWidget();
     if (widget instanceof HTML) {
       return ((HTML) widget).getHTML();
     } else if (widget instanceof Label) {
       return ((Label) widget).getText();
     } else {
-      // This will be a ClickDecorator holding a user-supplied widget.
-      return DOM.getInnerHTML(decPanel.getContainerElement());
+      // This will be a focusable panel holding a user-supplied widget.
+      return focusablePanel.getElement().getParentElement().getInnerHTML();
     }
   }
 
@@ -311,6 +316,17 @@
   }
 
   /**
+   * Create a {@link SimplePanel} that will wrap the contents in a tab.
+   * Subclasses can use this method to wrap tabs in decorator panels.
+   * 
+   * @return a {@link SimplePanel} to wrap the tab contents, or null to leave
+   *         tabs unwrapped
+   */
+  protected SimplePanel createTabTextWrapper() {
+    return null;
+  }
+
+  /**
    * Inserts a new tab at the specified index.
    * 
    * @param widget widget to be used in the new tab.
@@ -319,17 +335,17 @@
   protected void insertTabWidget(Widget widget, int beforeIndex) {
     checkInsertBeforeTabIndex(beforeIndex);
 
-    ClickDecoratorPanel decWidget = new ClickDecoratorPanel(widget, this, this);
-    decWidget.setStyleName(STYLENAME_DEFAULT);
+    ClickDelegatePanel delWidget = new ClickDelegatePanel(widget, this, this);
+    delWidget.setStyleName(STYLENAME_DEFAULT);
 
-     // Add a11y role "tab"
-    SimplePanel focusablePanel = (SimplePanel) decWidget.getWidget();
+    // Add a11y role "tab"
+    SimplePanel focusablePanel = delWidget.getFocusablePanel();
     Accessibility.setRole(focusablePanel.getElement(), Accessibility.ROLE_TAB);
-    
-    panel.insert(decWidget, beforeIndex + 1);
-    
-    setStyleName(DOM.getParent(decWidget.getElement()),
-        STYLENAME_DEFAULT + "-wrapper", true);
+
+    panel.insert(delWidget, beforeIndex + 1);
+
+    setStyleName(DOM.getParent(delWidget.getElement()), STYLENAME_DEFAULT
+        + "-wrapper", true);
   }
 
   /**
@@ -347,9 +363,10 @@
 
     int numTabs = getTabCount();
     for (int i = 0; i < numTabs; i++) {
-      DecoratorPanel decPanel = (DecoratorPanel) panel.getWidget(i + 1);
-      ensureDebugId(decPanel.getContainerElement(), baseID, "tab" + i);
-      ensureDebugId(DOM.getParent(decPanel.getElement()), baseID, "tab-wrapper"
+      ClickDelegatePanel delPanel = (ClickDelegatePanel) panel.getWidget(i + 1);
+      SimplePanel focusablePanel = delPanel.getFocusablePanel();
+      ensureDebugId(focusablePanel.getContainerElement(), baseID, "tab" + i);
+      ensureDebugId(DOM.getParent(delPanel.getElement()), baseID, "tab-wrapper"
           + i);
     }
   }
@@ -367,13 +384,13 @@
   }
 
   /**
-   * Selects the tab corresponding to the widget for the tab. To be clear
-   * the widget for the tab is not the widget INSIDE of the tab; it is the
-   * widget used to represent the tab itself.
-   *
+   * Selects the tab corresponding to the widget for the tab. To be clear the
+   * widget for the tab is not the widget INSIDE of the tab; it is the widget
+   * used to represent the tab itself.
+   * 
    * @param tabWidget The widget for the tab to be selected
-   * @return true if the tab corresponding to the widget for the tab could located and selected,
-   *         false otherwise
+   * @return true if the tab corresponding to the widget for the tab could
+   *         located and selected, false otherwise
    */
   private boolean selectTabByTabWidget(Widget tabWidget) {
     int numTabs = panel.getWidgetCount() - 1;
@@ -386,7 +403,7 @@
 
     return false;
   }
-   
+
   private void setSelectionStyle(Widget item, boolean selected) {
     if (item != null) {
       if (selected) {
diff --git a/user/src/com/google/gwt/user/client/ui/TabPanel.java b/user/src/com/google/gwt/user/client/ui/TabPanel.java
index 743fffa..e58f78a 100644
--- a/user/src/com/google/gwt/user/client/ui/TabPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/TabPanel.java
@@ -48,7 +48,6 @@
  */
 public class TabPanel extends Composite implements TabListener,
     SourcesTabEvents, HasWidgets, IndexedPanel {
-
   /**
    * This extension of DeckPanel overrides the public mutator methods to prevent
    * external callers from adding to the state of the DeckPanel.
@@ -138,7 +137,7 @@
    * This extension of TabPanel overrides the public mutator methods to prevent
    * external callers from modifying the state of the TabBar.
    */
-  private static class UnmodifiableTabBar extends TabBar {
+  private class UnmodifiableTabBar extends TabBar {
     @Override
     public void insertTab(String text, boolean asHTML, int beforeIndex) {
       throw new UnsupportedOperationException(
@@ -151,6 +150,14 @@
           "Use TabPanel.insert() to alter the TabBar");
     }
 
+    public void insertTabProtected(String text, boolean asHTML, int beforeIndex) {
+      super.insertTab(text, asHTML, beforeIndex);
+    }
+
+    public void insertTabProtected(Widget widget, int beforeIndex) {
+      super.insertTab(widget, beforeIndex);
+    }
+
     @Override
     public void removeTab(int index) {
       // It's possible for removeTab() to function correctly, but it's
@@ -160,18 +167,14 @@
           "Use TabPanel.remove() to alter the TabBar");
     }
 
-    protected void insertTabProtected(String text, boolean asHTML,
-        int beforeIndex) {
-      super.insertTab(text, asHTML, beforeIndex);
-    }
-
-    protected void insertTabProtected(Widget widget, int beforeIndex) {
-      super.insertTab(widget, beforeIndex);
-    }
-
-    protected void removeTabProtected(int index) {
+    public void removeTabProtected(int index) {
       super.removeTab(index);
     }
+
+    @Override
+    protected SimplePanel createTabTextWrapper() {
+      return TabPanel.this.createTabTextWrapper();
+    }
   }
 
   private UnmodifiableTabBar tabBar = new UnmodifiableTabBar();
@@ -373,6 +376,17 @@
   }
 
   /**
+   * Create a {@link SimplePanel} that will wrap the contents in a tab.
+   * Subclasses can use this method to wrap tabs in decorator panels.
+   * 
+   * @return a {@link SimplePanel} to wrap the tab contents, or null to leave
+   *         tabs unwrapped
+   */
+  protected SimplePanel createTabTextWrapper() {
+    return null;
+  }
+
+  /**
    * <b>Affected Elements:</b>
    * <ul>
    * <li>-bar = The tab bar.</li>
diff --git a/user/test/com/google/gwt/user/UISuite.java b/user/test/com/google/gwt/user/UISuite.java
index 1106526..c63ee5f 100644
--- a/user/test/com/google/gwt/user/UISuite.java
+++ b/user/test/com/google/gwt/user/UISuite.java
@@ -26,6 +26,10 @@
 import com.google.gwt.user.client.ui.CustomButtonTest;
 import com.google.gwt.user.client.ui.DOMTest;
 import com.google.gwt.user.client.ui.DeckPanelTest;
+import com.google.gwt.user.client.ui.DecoratedPopupTest;
+import com.google.gwt.user.client.ui.DecoratedStackPanelTest;
+import com.google.gwt.user.client.ui.DecoratedTabBarTest;
+import com.google.gwt.user.client.ui.DecoratedTabPanelTest;
 import com.google.gwt.user.client.ui.DecoratorPanelTest;
 import com.google.gwt.user.client.ui.DelegatingKeyboardListenerCollectionTest;
 import com.google.gwt.user.client.ui.DialogBoxTest;
@@ -85,6 +89,10 @@
     suite.addTestSuite(CookieTest.class);
     suite.addTestSuite(CustomButtonTest.class);
     suite.addTestSuite(DeckPanelTest.class);
+    suite.addTestSuite(DecoratedPopupTest.class);
+    suite.addTestSuite(DecoratedStackPanelTest.class);
+    suite.addTestSuite(DecoratedTabBarTest.class);
+    suite.addTestSuite(DecoratedTabPanelTest.class);
     suite.addTestSuite(DecoratorPanelTest.class);
     suite.addTestSuite(DelegatingKeyboardListenerCollectionTest.class);
     suite.addTestSuite(DialogBoxTest.class);
diff --git a/user/test/com/google/gwt/user/client/ui/DecoratedPopupTest.java b/user/test/com/google/gwt/user/client/ui/DecoratedPopupTest.java
new file mode 100644
index 0000000..bc20531
--- /dev/null
+++ b/user/test/com/google/gwt/user/client/ui/DecoratedPopupTest.java
@@ -0,0 +1,26 @@
+/*
+ * 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
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client.ui;
+
+/**
+ * Test cases for {@link DecoratedPopupPanel}.
+ */
+public class DecoratedPopupTest extends PopupTest {
+  @Override
+  protected PopupPanel createPopupPanel() {
+    return new DecoratedPopupPanel();
+  }
+}
diff --git a/user/test/com/google/gwt/user/client/ui/DecoratedStackPanelTest.java b/user/test/com/google/gwt/user/client/ui/DecoratedStackPanelTest.java
new file mode 100644
index 0000000..0413276
--- /dev/null
+++ b/user/test/com/google/gwt/user/client/ui/DecoratedStackPanelTest.java
@@ -0,0 +1,26 @@
+/*
+ * 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
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client.ui;
+
+/**
+ * Test cases for {@link DecoratedStackPanel}.
+ */
+public class DecoratedStackPanelTest extends StackPanelTest {
+  @Override
+  protected StackPanel createStackPanel() {
+    return new DecoratedStackPanel();
+  }
+}
diff --git a/user/test/com/google/gwt/user/client/ui/DecoratedTabBarTest.java b/user/test/com/google/gwt/user/client/ui/DecoratedTabBarTest.java
new file mode 100644
index 0000000..e1a9ac1
--- /dev/null
+++ b/user/test/com/google/gwt/user/client/ui/DecoratedTabBarTest.java
@@ -0,0 +1,26 @@
+/*
+ * 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
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client.ui;
+
+/**
+ * Test cases for {@link DecoratedTabBar}.
+ */
+public class DecoratedTabBarTest extends TabBarTest {
+  @Override
+  protected TabBar createTabBar() {
+    return new DecoratedTabBar();
+  }
+}
diff --git a/user/test/com/google/gwt/user/client/ui/DecoratedTabPanelTest.java b/user/test/com/google/gwt/user/client/ui/DecoratedTabPanelTest.java
new file mode 100644
index 0000000..a623a26
--- /dev/null
+++ b/user/test/com/google/gwt/user/client/ui/DecoratedTabPanelTest.java
@@ -0,0 +1,26 @@
+/*
+ * 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
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client.ui;
+
+/**
+ * Tests the {@link DecoratedTabPanel}.
+ */
+public class DecoratedTabPanelTest extends TabPanelTest {
+  @Override
+  protected TabPanel createTabPanel() {
+    return new DecoratedTabPanel();
+  }
+}
diff --git a/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java b/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java
index f0c478c..23187e7 100644
--- a/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java
@@ -59,14 +59,18 @@
     // Check the styles of each row
     for (int i = 0; i < rowStyles.length; i++) {
       String rowStyle = rowStyles[i];
-      assertStyleName(DOM.getParent(panel.getCellElement(i, 0)), rowStyle);
-      assertStyleName(panel.getCellElement(i, 0), rowStyle + "Left");
-      assertStyleName(panel.getCellElement(i, 1), rowStyle + "Center");
-      assertStyleName(panel.getCellElement(i, 2), rowStyle + "Right");
+      assertStyleName(DOM.getParent(DOM.getParent(panel.getCellElement(i, 0))),
+          rowStyle);
+      assertStyleName(DOM.getParent(panel.getCellElement(i, 0)), rowStyle
+          + "Left");
+      assertStyleName(DOM.getParent(panel.getCellElement(i, 1)), rowStyle
+          + "Center");
+      assertStyleName(DOM.getParent(panel.getCellElement(i, 2)), rowStyle
+          + "Right");
     }
 
     // Check the container element
-    assertTrue(DOM.getFirstChild(panel.getCellElement(2, 1)) == panel.getContainerElement());
+    assertTrue(panel.getCellElement(2, 1) == panel.getContainerElement());
   }
 
   /**
@@ -79,13 +83,17 @@
     // Check the styles of each row
     for (int i = 0; i < rowStyles.length; i++) {
       String rowStyle = rowStyles[i];
-      assertStyleName(DOM.getParent(panel.getCellElement(i, 0)), rowStyle);
-      assertStyleName(panel.getCellElement(i, 0), rowStyle + "Left");
-      assertStyleName(panel.getCellElement(i, 1), rowStyle + "Center");
-      assertStyleName(panel.getCellElement(i, 2), rowStyle + "Right");
+      assertStyleName(DOM.getParent(DOM.getParent(panel.getCellElement(i, 0))),
+          rowStyle);
+      assertStyleName(DOM.getParent(panel.getCellElement(i, 0)), rowStyle
+          + "Left");
+      assertStyleName(DOM.getParent(panel.getCellElement(i, 1)), rowStyle
+          + "Center");
+      assertStyleName(DOM.getParent(panel.getCellElement(i, 2)), rowStyle
+          + "Right");
     }
 
     // Check the container element
-    assertTrue(DOM.getFirstChild(panel.getCellElement(1, 1)) == panel.getContainerElement());
+    assertTrue(panel.getCellElement(1, 1) == panel.getContainerElement());
   }
 }
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 ad989d5..d0e862f 100644
--- a/user/test/com/google/gwt/user/client/ui/PopupTest.java
+++ b/user/test/com/google/gwt/user/client/ui/PopupTest.java
@@ -43,8 +43,8 @@
    * Test the basic accessors.
    */
   public void testAccessors() {
-    PopupPanel popup = new PopupPanel();
-    
+    PopupPanel popup = createPopupPanel();
+
     // Animation enabled
     assertFalse(popup.isAnimationEnabled());
     popup.setAnimationEnabled(true);
@@ -55,7 +55,7 @@
     // Get rid of window margins so we can test absolute position.
     Window.setMargin("0px");
 
-    PopupPanel popup = new PopupPanel();
+    PopupPanel popup = createPopupPanel();
     popup.setAnimationEnabled(false);
     Label lbl = new Label("foo");
 
@@ -102,7 +102,7 @@
     });
     popup.hide();
   }
-  
+
   public void testSeparateContainers() {
     TestablePopupPanel p1 = new TestablePopupPanel();
     TestablePopupPanel p2 = new TestablePopupPanel();
@@ -110,4 +110,11 @@
     assertTrue(p2.getContainerElement() != null);
     assertFalse(p1.getContainerElement() == p2.getContainerElement());
   }
+
+  /**
+   * Create a new PopupPanel.
+   */
+  protected PopupPanel createPopupPanel() {
+    return new PopupPanel();
+  }
 }
diff --git a/user/test/com/google/gwt/user/client/ui/StackPanelTest.java b/user/test/com/google/gwt/user/client/ui/StackPanelTest.java
index d449523..925e0f9 100644
--- a/user/test/com/google/gwt/user/client/ui/StackPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/StackPanelTest.java
@@ -22,7 +22,7 @@
 import com.google.gwt.user.client.Element;
 
 /**
- * Tests <code>ListBox</code>. Needs many, many more tests.
+ * Test cases for {@link StackPanel}.
  */
 public class StackPanelTest extends GWTTestCase {
 
@@ -51,11 +51,11 @@
   }
 
   public void testAttachDetachOrder() {
-    HasWidgetsTester.testAll(new StackPanel(), new Adder());
+    HasWidgetsTester.testAll(createStackPanel(), new Adder());
   }
 
   public void testDebugId() {
-    final StackPanel p = new StackPanel();
+    final StackPanel p = createStackPanel();
     Label a = new Label("a");
     Label b = new Label("b");
     Label c = new Label("c");
@@ -86,6 +86,7 @@
         Element td0 = DOM.getElementById("gwt-debug-myStack-text-wrapper0");
         Element td1 = DOM.getElementById("gwt-debug-myStack-text-wrapper1");
         Element td2 = DOM.getElementById("gwt-debug-myStack-text-wrapper2");
+
         assertEquals(p.getElement(),
             DOM.getParent(DOM.getParent(DOM.getParent(td0))));
         assertEquals(p.getElement(),
@@ -93,6 +94,7 @@
         assertEquals(p.getElement(),
             DOM.getParent(DOM.getParent(DOM.getParent(td2))));
 
+        RootPanel.get().remove(p);
         finishTest();
       }
     });
@@ -103,7 +105,7 @@
    * Tests getSelectedStack.
    */
   public void testGetSelectedStack() {
-    StackPanel p = new StackPanel();
+    StackPanel p = createStackPanel();
     assertEquals(-1, p.getSelectedIndex());
     Label a = new Label("a");
     Label b = new Label("b");
@@ -124,7 +126,7 @@
    * Tests new remove implementation for StackPanel.
    */
   public void testRemove() {
-    StackPanel p = new StackPanel();
+    StackPanel p = createStackPanel();
     Label a = new Label("a");
     Label b = new Label("b");
     Label c = new Label("c");
@@ -154,4 +156,11 @@
     p.remove(a);
     assertEquals("d", curContents(p));
   }
+
+  /**
+   * Create a new stack panel.
+   */
+  protected StackPanel createStackPanel() {
+    return new StackPanel();
+  }
 }
diff --git a/user/test/com/google/gwt/user/client/ui/TabBarTest.java b/user/test/com/google/gwt/user/client/ui/TabBarTest.java
index c5c57b7..a84c5e9 100644
--- a/user/test/com/google/gwt/user/client/ui/TabBarTest.java
+++ b/user/test/com/google/gwt/user/client/ui/TabBarTest.java
@@ -23,22 +23,6 @@
  * TODO: document me.
  */
 public class TabBarTest extends GWTTestCase {
-
-  /**
-   * Get a specific grand parent of the Element.
-   *
-   * @param elem the element
-   * @param level the level above the element
-   * @return the grand parent
-   */
-  static Element getGrandParent(Element elem, int level) {
-    Element grandParent = elem;
-    for (int i = 0; i < level; i++) {
-      grandParent = DOM.getParent(grandParent);
-    }
-    return grandParent;
-  }
-  
   int selected;
   int beforeSelection;
 
@@ -48,7 +32,8 @@
   }
 
   public void testDebugId() {
-    TabBar bar = new TabBar();
+    // Create a tab bar with a few tabs
+    TabBar bar = createTabBar();
     Label tab0 = new Label("My Tab 0");
     bar.addTab(tab0);
     Label tab1 = new Label("My Tab 1");
@@ -56,22 +41,22 @@
     Label tab2 = new Label("My Tab 2");
     bar.addTab(tab2);
 
+    // Verify the debug IDs are on the correct elements
     bar.ensureDebugId("myBar");
+    HorizontalPanel hPanel = (HorizontalPanel) bar.getWidget();
+    Element tr = DOM.getFirstChild(hPanel.getBody());
     UIObjectTest.assertDebugId("myBar", bar.getElement());
-    UIObjectTest.assertDebugId("myBar-tab0", getGrandParent(tab0.getElement(), 2));
-    UIObjectTest.assertDebugId("myBar-tab-wrapper0", getGrandParent(
-        tab0.getElement(), 7));
-    UIObjectTest.assertDebugId("myBar-tab1", getGrandParent(tab1.getElement(), 2));
-    UIObjectTest.assertDebugId("myBar-tab-wrapper1", getGrandParent(
-        tab1.getElement(), 7));
-    UIObjectTest.assertDebugId("myBar-tab2", getGrandParent(tab2.getElement(), 2));
-    UIObjectTest.assertDebugId("myBar-tab-wrapper2", getGrandParent(
-        tab2.getElement(), 7));
+    UIObjectTest.assertDebugId("myBar-tab0", DOM.getParent(tab0.getElement()));
+    UIObjectTest.assertDebugId("myBar-tab-wrapper0", DOM.getChild(tr, 1));
+    UIObjectTest.assertDebugId("myBar-tab1", DOM.getParent(tab1.getElement()));
+    UIObjectTest.assertDebugId("myBar-tab-wrapper1", DOM.getChild(tr, 2));
+    UIObjectTest.assertDebugId("myBar-tab2", DOM.getParent(tab2.getElement()));
+    UIObjectTest.assertDebugId("myBar-tab-wrapper2", DOM.getChild(tr, 3));
   }
 
   public void testSelect() {
     // Create a tab bar with three items.
-    final TabBar bar = new TabBar();
+    final TabBar bar = createTabBar();
     bar.addTab("foo");
     bar.addTab("bar");
     bar.addTab("baz");
@@ -113,7 +98,7 @@
   }
 
   public void testGetHTML() {
-    final TabBar bar = new TabBar();
+    final TabBar bar = createTabBar();
     bar.addTab("foo");
     bar.addTab("<b>bar</b>", true);
     bar.addTab("baz");
@@ -122,4 +107,25 @@
     bar.removeTab(1);
     assertEquals("baz", bar.getTabHTML(1));
   }
+
+  /**
+   * Verify that if a tab contains a widget, {@link TabBar#getTabHTML(int)}
+   * returns the HTML of the focusable element with the widget inside of it.
+   */
+  public void testGetHTMLWithWidget() {
+    TabBar bar = createTabBar();
+    Button myButton = new Button("My Button");
+    bar.addTab(myButton);
+
+    Widget focusablePanel = myButton.getParent();
+    assertEquals(focusablePanel.getElement().getParentElement().getInnerHTML(),
+        bar.getTabHTML(0));
+  }
+
+  /**
+   * Create a new, empty tab bar.
+   */
+  protected TabBar createTabBar() {
+    return new TabBar();
+  }
 }
diff --git a/user/test/com/google/gwt/user/client/ui/TabPanelTest.java b/user/test/com/google/gwt/user/client/ui/TabPanelTest.java
index a912705..5e3e166 100644
--- a/user/test/com/google/gwt/user/client/ui/TabPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/TabPanelTest.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
 
 import java.util.Iterator;
 
@@ -37,11 +38,11 @@
   }
 
   public void testAttachDetachOrder() {
-    HasWidgetsTester.testAll(new TabPanel(), new Adder());
+    HasWidgetsTester.testAll(createTabPanel(), new Adder());
   }
 
   public void testDebugId() {
-    TabPanel panel = new TabPanel();
+    TabPanel panel = createTabPanel();
     Label content0 = new Label("content0");
     Label tab0 = new Label("tab0");
     panel.add(content0, tab0);
@@ -60,22 +61,21 @@
         panel.getDeckPanel().getElement());
 
     // Check the tabs
+    HorizontalPanel hPanel = (HorizontalPanel) panel.getTabBar().getWidget();
+    Element tr = DOM.getFirstChild(hPanel.getBody());
     UIObjectTest.assertDebugId("myPanel-bar-tab0",
-        TabBarTest.getGrandParent(tab0.getElement(), 2));
-    UIObjectTest.assertDebugId("myPanel-bar-tab-wrapper0",
-        DOM.getParent(tab0.getParent().getParent().getElement()));
+        DOM.getParent(tab0.getElement()));
+    UIObjectTest.assertDebugId("myPanel-bar-tab-wrapper0", DOM.getChild(tr, 1));
     UIObjectTest.assertDebugId("myPanel-bar-tab1",
-        TabBarTest.getGrandParent(tab1.getElement(), 2));
-    UIObjectTest.assertDebugId("myPanel-bar-tab-wrapper1",
-        DOM.getParent(tab1.getParent().getParent().getElement()));
+        DOM.getParent(tab1.getElement()));
+    UIObjectTest.assertDebugId("myPanel-bar-tab-wrapper1", DOM.getChild(tr, 2));
     UIObjectTest.assertDebugId("myPanel-bar-tab2",
-        TabBarTest.getGrandParent(tab2.getElement(), 2));
-    UIObjectTest.assertDebugId("myPanel-bar-tab-wrapper2",
-        DOM.getParent(tab2.getParent().getParent().getElement()));
+        DOM.getParent(tab2.getElement()));
+    UIObjectTest.assertDebugId("myPanel-bar-tab-wrapper2", DOM.getChild(tr, 3));
   }
 
   public void testInsertMultipleTimes() {
-    TabPanel p = new TabPanel();
+    TabPanel p = createTabPanel();
 
     TextBox tb = new TextBox();
     p.add(tb, "Title");
@@ -114,7 +114,7 @@
   }
 
   public void testInsertWithHTML() {
-    TabPanel p = new TabPanel();
+    TabPanel p = createTabPanel();
     Label l = new Label();
     p.add(l, "three");
     p.insert(new HTML("<b>hello</b>"), "two", true, 0);
@@ -126,7 +126,7 @@
    * Tests to ensure that arbitrary widgets can be added/inserted effectively.
    */
   public void testInsertWithWidgets() {
-    TabPanel p = new TabPanel();
+    TabPanel p = createTabPanel();
 
     TextBox wa = new TextBox();
     CheckBox wb = new CheckBox();
@@ -146,7 +146,7 @@
   }
 
   public void testIterator() {
-    TabPanel p = new TabPanel();
+    TabPanel p = createTabPanel();
     HTML foo = new HTML("foo");
     HTML bar = new HTML("bar");
     HTML baz = new HTML("baz");
@@ -175,7 +175,7 @@
   }
 
   public void testSelectionEvents() {
-    TabPanel p = new TabPanel();
+    TabPanel p = createTabPanel();
     RootPanel.get().add(p);
 
     p.add(new Button("foo"), "foo");
@@ -201,7 +201,7 @@
   }
 
   public void testUnmodifiableDeckPanelSubclasses() {
-    TabPanel p = new TabPanel();
+    TabPanel p = createTabPanel();
     DeckPanel d = p.getDeckPanel();
 
     try {
@@ -227,7 +227,7 @@
   }
 
   public void testUnmodifiableTabBarSubclasses() {
-    TabPanel p = new TabPanel();
+    TabPanel p = createTabPanel();
     TabBar b = p.getTabBar();
 
     try {
@@ -279,4 +279,11 @@
       // Expected behavior
     }
   }
+
+  /**
+   * Create a new, empty tab panel.
+   */
+  protected TabPanel createTabPanel() {
+    return new TabPanel();
+  }
 }
