diff --git a/user/src/com/google/gwt/user/TitledPanel.gwt.xml b/user/src/com/google/gwt/user/TitledPanel.gwt.xml
new file mode 100644
index 0000000..785daf4
--- /dev/null
+++ b/user/src/com/google/gwt/user/TitledPanel.gwt.xml
@@ -0,0 +1,37 @@
+<!--                                                                        -->
+<!-- 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   -->
+<!-- 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. License for the specific language governing permissions and   -->
+<!-- limitations under the License.                                         -->
+
+<!-- Deferred binding rules for browser selection.                          -->
+<!--                                                                        -->
+<!-- This module is typically inherited via com.google.gwt.user.User        -->
+<!--                                                                        -->
+<module>
+  <inherits name="com.google.gwt.core.Core"/>
+  <inherits name="com.google.gwt.user.UserAgent"/>
+
+  <!-- Mozilla has a different implementation to handle rendering issues -->
+  <replace-with class="com.google.gwt.user.client.ui.TitledPanel.TitledPanelImplMozilla">
+    <when-type-is class="com.google.gwt.user.client.ui.TitledPanel.TitledPanelImpl"/>
+    <any>
+      <when-property-is name="user.agent" value="gecko"/>
+      <when-property-is name="user.agent" value="gecko1_8"/>
+    </any>
+  </replace-with>
+
+  <!-- Safari has a different implementation to handle rendering issues -->
+  <replace-with class="com.google.gwt.user.client.ui.TitledPanel.TitledPanelImplSafari">
+    <when-type-is class="com.google.gwt.user.client.ui.TitledPanel.TitledPanelImpl"/>
+    <when-property-is name="user.agent" value="safari"/>
+  </replace-with>
+</module>
diff --git a/user/src/com/google/gwt/user/User.gwt.xml b/user/src/com/google/gwt/user/User.gwt.xml
index c6364d9..252649e 100644
--- a/user/src/com/google/gwt/user/User.gwt.xml
+++ b/user/src/com/google/gwt/user/User.gwt.xml
@@ -1,5 +1,5 @@
 <!--
-  Copyright 2007 Google Inc.
+  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
@@ -32,4 +32,5 @@
    <inherits name="com.google.gwt.user.RichText"/>
    <inherits name="com.google.gwt.user.SplitPanel"/>
    <inherits name="com.google.gwt.user.ListBox" />
+   <inherits name="com.google.gwt.user.TitledPanel" />
 </module>
diff --git a/user/src/com/google/gwt/user/client/ui/TitledPanel.java b/user/src/com/google/gwt/user/client/ui/TitledPanel.java
new file mode 100644
index 0000000..4135875
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/ui/TitledPanel.java
@@ -0,0 +1,127 @@
+/*
+ * 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.core.client.GWT;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.DeferredCommand;
+import com.google.gwt.user.client.Element;
+
+/**
+ * A panel that wraps its contents in a border with a title that appears in the
+ * upper left corner of the border. This is an implementation of the fieldset
+ * HTML element.
+ */
+public class TitledPanel extends SimplePanel {
+  /**
+   * Implementation class for TitledPanel.
+   */
+  public static class TitledPanelImpl {
+    public void setCaption(Element fieldset, Element legend, String caption) {
+      if ((caption != "") && (caption != null)) {
+        DOM.setInnerHTML(legend, caption);
+        DOM.insertChild(fieldset, legend, 0);
+      } else if (DOM.getParent(legend) != null) {
+        DOM.removeChild(fieldset, legend);
+      }
+    }
+  }
+
+  /**
+   * Implementation class for TitledPanel that handles Mozilla rendering issues.
+   */
+  public static class TitledPanelImplMozilla extends TitledPanelImpl {
+    @Override
+    public void setCaption(final Element fieldset, Element legend, String caption) {
+      DOM.setStyleAttribute(fieldset, "display", "none");
+      super.setCaption(fieldset, legend, caption);
+      DOM.setStyleAttribute(fieldset, "display", "");
+    }
+  }
+  
+  /**
+   * Implementation class for TitledPanel that handles Safari rendering issues.
+   */
+  public static class TitledPanelImplSafari extends TitledPanelImpl {
+    @Override
+    public void setCaption(final Element fieldset, Element legend, String caption) {
+      DOM.setStyleAttribute(fieldset, "visibility", "hidden");
+      super.setCaption(fieldset, legend, caption);
+      DeferredCommand.addCommand(new Command() {
+        public void execute() {
+          DOM.setStyleAttribute(fieldset, "visibility", "");
+        }
+      });
+    }
+  }
+
+  /**
+   * The implementation instance.
+   */
+  private static TitledPanelImpl impl = (TitledPanelImpl) GWT.create(TitledPanelImpl.class);
+
+  /**
+   * The legend used as the title.
+   */
+  private Element legend;
+
+  /**
+   * The title at the top of the border.
+   */
+  private String caption;
+
+  /**
+   * Constructor.
+   * 
+   * @param caption the title to display
+   */
+  public TitledPanel(String caption) {
+    super(DOM.createElement("fieldset"));
+    legend = DOM.createElement("legend");
+    DOM.appendChild(getElement(), legend);
+    setCaption(caption);
+  }
+
+  /**
+   * Constructor.
+   * 
+   * @param caption the title to display
+   * @param w the widget to add to the panel
+   */
+  public TitledPanel(String caption, Widget w) {
+    this(caption);
+    setWidget(w);
+  }
+
+  /**
+   * @return the title on top of the border
+   */
+  public String getCaption() {
+    return this.caption;
+  }
+
+  /**
+   * Set the title in the border. Pass in null or an empty string to remove the
+   * title completely, leaving just a box.
+   * 
+   * @param caption the new title
+   */
+  public void setCaption(String caption) {
+    this.caption = caption;
+    impl.setCaption(getElement(), legend, caption);
+  }
+}
diff --git a/user/test/com/google/gwt/user/UISuite.java b/user/test/com/google/gwt/user/UISuite.java
index 4551140..3391780 100644
--- a/user/test/com/google/gwt/user/UISuite.java
+++ b/user/test/com/google/gwt/user/UISuite.java
@@ -46,6 +46,7 @@
 import com.google.gwt.user.client.ui.TabBarTest;
 import com.google.gwt.user.client.ui.TabPanelTest;
 import com.google.gwt.user.client.ui.TextAreaTest;
+import com.google.gwt.user.client.ui.TitledPanelTest;
 import com.google.gwt.user.client.ui.TreeTest;
 import com.google.gwt.user.client.ui.UIObjectTest;
 import com.google.gwt.user.client.ui.VerticalPanelTest;
@@ -96,6 +97,7 @@
     suite.addTestSuite(TabBarTest.class);
     suite.addTestSuite(TabPanelTest.class);
     suite.addTestSuite(TextAreaTest.class);
+    suite.addTestSuite(TitledPanelTest.class);
     suite.addTestSuite(TreeTest.class);
     suite.addTestSuite(UIObjectTest.class);
     suite.addTestSuite(VerticalPanelTest.class);
diff --git a/user/test/com/google/gwt/user/client/ui/TitledPanelTest.java b/user/test/com/google/gwt/user/client/ui/TitledPanelTest.java
new file mode 100644
index 0000000..1b28a29
--- /dev/null
+++ b/user/test/com/google/gwt/user/client/ui/TitledPanelTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.junit.client.GWTTestCase;
+import com.google.gwt.user.client.DOM;
+
+/**
+ * Tests {@link TitledPanel}.
+ */
+public class TitledPanelTest extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.user.User";
+  }
+  
+  /**
+   * Test the basic setting and getting of the title.
+   */
+  public void testSetCaption() {
+    // Null title
+    TitledPanel panel1 = new TitledPanel(null);
+    assertNull(panel1.getCaption());
+    assertNull(DOM.getFirstChild(panel1.getElement()));
+    panel1.setCaption("");
+    assertEquals("", panel1.getCaption());
+    assertNull(DOM.getFirstChild(panel1.getElement()));
+    
+    // Actual title
+    TitledPanel panel2 = new TitledPanel("my panel2");
+    assertEquals("my panel2", panel2.getCaption());
+    assertNotNull(DOM.getFirstChild(panel2.getElement()));
+    panel2.setCaption("my cool panel 2");
+    assertEquals("my cool panel 2", panel2.getCaption());
+    assertNotNull(DOM.getFirstChild(panel2.getElement()));
+  }
+  
+  /**
+   * Test the setting and removal of a widget.
+   */
+  public void testSetWidget() {
+    // No Widget constructor
+    TitledPanel panel1 = new TitledPanel("no widget");
+    assertNull(panel1.getWidget());
+    
+    // Widget constructor
+    HTML widget2 = new HTML("widget 2");
+    TitledPanel panel2 = new TitledPanel("has widget", widget2);
+    assertEquals(widget2, panel2.getWidget());
+    
+    // Set widget
+    HTML widget3 = new HTML("widget 3");
+    TitledPanel panel3 = new TitledPanel("set widget", null);
+    assertNull(panel3.getWidget());
+    panel3.setWidget(widget3);
+    assertEquals(widget3, panel3.getWidget());
+    panel3.remove(widget3);
+    assertNull(panel3.getWidget());
+  }
+}
