Adding all supported element builders to the ElementBuilder API.  This is a follow-on change for r10412, which introduced the core ElementBuilder libraries.

For each Element type, we introduce five new files:
1. The builder interface (ex. AnchorBuilder)
2. The HTML based implementation (ex. HtmlAnchorBuilder)
3. The DOM based implementation (ex. DomAnchorBuilder)
4. The JRE test that tests the HTML based implementation (ex. HtmlAnchorBuilderTest)
5. The GWT test that tests both the HTML and DOM based implementations (ex. GwtAnchorBuilderTest)

I generated the files using a script that looks for setters in the Element JSO and converts them to builder methods by dropping the "set" prefix from the setter.  Setter methods that take booleans do not take an argument in the builder because you cannot unset the attribute.  For example, InputElement#setDisabled(boolean) became InputBuilder#disabled(), and adds the "disabled" attribute to the element.  The script generated all five files mentioned above for each Element JSO.  I then manually reviewed them and made some modifications for exceptions, such as HtmlStylesBuilder.cssSrc(String), which actually inlines the text instead of setting an attribute.  Some Elements do not support setting inner text of html (ex. StyleBuilder), so they throw an UnsupportedOperationException.  Other elements forbid a closing tag (ex. BRBuilder and HRBuilder), so they also throw UnsupportedOperationExceptions if you try to set inner text or html.

There are some changes to existing files.  The ElementBuilderFactory classes now have createXXX methods for each element (ex. createAnchorElement()), and ElementBuilderBase has an associated startXXX method (ex. startAnchor()). 	All of the Element JSOs have package protected static TAG names (ex. AnchorElement.TAG).  We use the tags in the HTML based implementation, so I made all of the static Strings public (a few of the newer ones were already public).  In some cases, there is one builder class that represents multiple element types.  For example, HeadingBuilder builds "h1", "h2", "h3"...  For these, we have the one HeadingBuilder (just like we have one HeadingElement), but we have startH1(), startH2(), startH3() method for convenience.

We now handle elements that forbid end tags by self closing the start tag ("<area />" versus "<area></area>").  Elements that forbid the end tag throw an UnsupportedOperationException if you try to set inner html/text, or append a child element.  Some builders also override text(String)/html(String) if they forbid text or html, but still allow en end tag.

Test cases have also been simplified.  Each ElementBuilder used to have three tests: one JRE test, one GWT test for the HTML implementation, and one GWT test for the DOM version.  In addition, the latter two had to override two package protected methods.  Now, there are only two versions: the JRE version and the GWT version.  The GWT version only overrides getModuleName(), and the base test class iterates over both ElementBuilderFactory implementations.  This makes it easier to add new builders and reduces the number of files significantly.

Review at http://gwt-code-reviews.appspot.com/1463812

Review by: rchandia@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10433 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/dom/builder/client/DomAnchorBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomAnchorBuilder.java
new file mode 100644
index 0000000..b290670
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomAnchorBuilder.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.AnchorBuilder;
+import com.google.gwt.dom.client.AnchorElement;
+
+/**
+ * DOM-based implementation of {@link AnchorBuilder}.
+ */
+public class DomAnchorBuilder extends DomElementBuilderBase<AnchorBuilder, AnchorElement> implements
+    AnchorBuilder {
+
+  DomAnchorBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public AnchorBuilder accessKey(String accessKey) {
+    assertCanAddAttribute().setAccessKey(accessKey);
+    return this;
+  }
+
+  @Override
+  public AnchorBuilder href(String href) {
+    assertCanAddAttribute().setHref(href);
+    return this;
+  }
+
+  @Override
+  public AnchorBuilder hreflang(String hreflang) {
+    assertCanAddAttribute().setHreflang(hreflang);
+    return this;
+  }
+
+  @Override
+  public AnchorBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+
+  @Override
+  public AnchorBuilder rel(String rel) {
+    assertCanAddAttribute().setRel(rel);
+    return this;
+  }
+
+  @Override
+  public AnchorBuilder target(String target) {
+    assertCanAddAttribute().setTarget(target);
+    return this;
+  }
+
+  @Override
+  public AnchorBuilder type(String type) {
+    assertCanAddAttribute().setType(type);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomAreaBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomAreaBuilder.java
new file mode 100644
index 0000000..417eeeb
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomAreaBuilder.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.AreaBuilder;
+import com.google.gwt.dom.client.AreaElement;
+
+/**
+ * DOM-based implementation of {@link AreaBuilder}.
+ */
+public class DomAreaBuilder extends DomElementBuilderBase<AreaBuilder, AreaElement> implements
+    AreaBuilder {
+
+  DomAreaBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public AreaBuilder accessKey(String accessKey) {
+    assertCanAddAttribute().setAccessKey(accessKey);
+    return this;
+  }
+
+  @Override
+  public AreaBuilder alt(String alt) {
+    assertCanAddAttribute().setAlt(alt);
+    return this;
+  }
+
+  @Override
+  public AreaBuilder coords(String coords) {
+    assertCanAddAttribute().setCoords(coords);
+    return this;
+  }
+
+  @Override
+  public AreaBuilder href(String href) {
+    assertCanAddAttribute().setHref(href);
+    return this;
+  }
+
+  @Override
+  public AreaBuilder shape(String shape) {
+    assertCanAddAttribute().setShape(shape);
+    return this;
+  }
+
+  @Override
+  public AreaBuilder target(String target) {
+    assertCanAddAttribute().setTarget(target);
+    return this;
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomAudioBuilder.java
similarity index 61%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomAudioBuilder.java
index e49c505..e39bd34 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomAudioBuilder.java
@@ -13,15 +13,18 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.AudioBuilder;
+import com.google.gwt.dom.client.AudioElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link AudioBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomAudioBuilder extends DomMediaBuilderBase<AudioBuilder, AudioElement> implements
+    AudioBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomAudioBuilder(DomBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomBRBuilder.java
similarity index 62%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomBRBuilder.java
index e49c505..997924f 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomBRBuilder.java
@@ -13,15 +13,17 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.BRBuilder;
+import com.google.gwt.dom.client.BRElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link BRBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomBRBuilder extends DomElementBuilderBase<BRBuilder, BRElement> implements BRBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomBRBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomBaseBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomBaseBuilder.java
new file mode 100644
index 0000000..07e001e
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomBaseBuilder.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.BaseBuilder;
+import com.google.gwt.dom.client.BaseElement;
+
+/**
+ * DOM-based implementation of {@link BaseBuilder}.
+ */
+public class DomBaseBuilder extends DomElementBuilderBase<BaseBuilder, BaseElement> implements
+    BaseBuilder {
+
+  DomBaseBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public BaseBuilder href(String href) {
+    assertCanAddAttribute().setHref(href);
+    return this;
+  }
+
+  @Override
+  public BaseBuilder target(String target) {
+    assertCanAddAttribute().setTarget(target);
+    return this;
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomBodyBuilder.java
similarity index 61%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomBodyBuilder.java
index e49c505..00ded31 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomBodyBuilder.java
@@ -13,15 +13,18 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.BodyBuilder;
+import com.google.gwt.dom.client.BodyElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link BodyBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomBodyBuilder extends DomElementBuilderBase<BodyBuilder, BodyElement> implements
+    BodyBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomBodyBuilder(DomBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomBuilderFactory.java b/user/src/com/google/gwt/dom/builder/client/DomBuilderFactory.java
index 72e7e33..e242307 100644
--- a/user/src/com/google/gwt/dom/builder/client/DomBuilderFactory.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomBuilderFactory.java
@@ -15,11 +15,10 @@
  */
 package com.google.gwt.dom.builder.client;
 
-import com.google.gwt.dom.builder.shared.DivBuilder;
 import com.google.gwt.dom.builder.shared.ElementBuilder;
 import com.google.gwt.dom.builder.shared.ElementBuilderFactory;
-import com.google.gwt.dom.builder.shared.OptionBuilder;
-import com.google.gwt.dom.builder.shared.SelectBuilder;
+import com.google.gwt.dom.builder.shared.InputBuilder;
+import com.google.gwt.dom.builder.shared.TableColBuilder;
 
 /**
  * Factory for creating element builders that construct elements using DOM
@@ -54,21 +53,346 @@
   }
 
   @Override
-  public DivBuilder createDivBuilder() {
+  public DomAnchorBuilder createAnchorBuilder() {
+    return impl().startAnchor();
+  }
+
+  @Override
+  public DomAreaBuilder createAreaBuilder() {
+    return impl().startArea();
+  }
+
+  @Override
+  public DomAudioBuilder createAudioBuilder() {
+    return impl().startAudio();
+  }
+
+  @Override
+  public DomBaseBuilder createBaseBuilder() {
+    return impl().startBase();
+  }
+
+  @Override
+  public DomQuoteBuilder createBlockQuoteBuilder() {
+    return impl().startBlockQuote();
+  }
+
+  @Override
+  public DomBodyBuilder createBodyBuilder() {
+    return impl().startBody();
+  }
+
+  @Override
+  public DomBRBuilder createBRBuilder() {
+    return impl().startBR();
+  }
+
+  @Override
+  public InputBuilder createButtonInputBuilder() {
+    return impl().startButtonInput();
+  }
+
+  @Override
+  public DomCanvasBuilder createCanvasBuilder() {
+    return impl().startCanvas();
+  }
+
+  @Override
+  public InputBuilder createCheckInputBuilder() {
+    return impl().startCheckInput();
+  }
+
+  @Override
+  public DomTableColBuilder createColBuilder() {
+    return impl().startCol();
+  }
+
+  @Override
+  public TableColBuilder createColGroupBuilder() {
+    return impl().startColGroup();
+  }
+
+  @Override
+  public DomDivBuilder createDivBuilder() {
     return impl().startDiv();
   }
 
   @Override
-  public OptionBuilder createOptionBuilder() {
+  public DomDListBuilder createDListBuilder() {
+    return impl().startDList();
+  }
+
+  @Override
+  public DomFieldSetBuilder createFieldSetBuilder() {
+    return impl().startFieldSet();
+  }
+
+  @Override
+  public InputBuilder createFileInputBuilder() {
+    return impl().startFileInput();
+  }
+
+  @Override
+  public DomFormBuilder createFormBuilder() {
+    return impl().startForm();
+  }
+
+  @Override
+  public DomFrameBuilder createFrameBuilder() {
+    return impl().startFrame();
+  }
+
+  @Override
+  public DomFrameSetBuilder createFrameSetBuilder() {
+    return impl().startFrameSet();
+  }
+
+  @Override
+  public DomHeadingBuilder createH1Builder() {
+    return impl().startH1();
+  }
+
+  @Override
+  public DomHeadingBuilder createH2Builder() {
+    return impl().startH2();
+  }
+
+  @Override
+  public DomHeadingBuilder createH3Builder() {
+    return impl().startH3();
+  }
+
+  @Override
+  public DomHeadingBuilder createH4Builder() {
+    return impl().startH4();
+  }
+
+  @Override
+  public DomHeadingBuilder createH5Builder() {
+    return impl().startH5();
+  }
+
+  @Override
+  public DomHeadingBuilder createH6Builder() {
+    return impl().startH6();
+  }
+
+  @Override
+  public DomHeadBuilder createHeadBuilder() {
+    return impl().startHead();
+  }
+
+  @Override
+  public InputBuilder createHiddenInputBuilder() {
+    return impl().startHiddenInput();
+  }
+
+  @Override
+  public DomHRBuilder createHRBuilder() {
+    return impl().startHR();
+  }
+
+  @Override
+  public DomIFrameBuilder createIFrameBuilder() {
+    return impl().startIFrame();
+  }
+
+  @Override
+  public DomImageBuilder createImageBuilder() {
+    return impl().startImage();
+  }
+
+  @Override
+  public InputBuilder createImageInputBuilder() {
+    return impl().startImageInput();
+  }
+
+  @Override
+  public DomLabelBuilder createLabelBuilder() {
+    return impl().startLabel();
+  }
+
+  @Override
+  public DomLegendBuilder createLegendBuilder() {
+    return impl().startLegend();
+  }
+
+  @Override
+  public DomLIBuilder createLIBuilder() {
+    return impl().startLI();
+  }
+
+  @Override
+  public DomLinkBuilder createLinkBuilder() {
+    return impl().startLink();
+  }
+
+  @Override
+  public DomMapBuilder createMapBuilder() {
+    return impl().startMap();
+  }
+
+  @Override
+  public DomMetaBuilder createMetaBuilder() {
+    return impl().startMeta();
+  }
+
+  @Override
+  public DomOListBuilder createOListBuilder() {
+    return impl().startOList();
+  }
+
+  @Override
+  public DomOptGroupBuilder createOptGroupBuilder() {
+    return impl().startOptGroup();
+  }
+
+  @Override
+  public DomOptionBuilder createOptionBuilder() {
     return impl().startOption();
   }
 
   @Override
-  public SelectBuilder createSelectBuilder() {
+  public DomParagraphBuilder createParagraphBuilder() {
+    return impl().startParagraph();
+  }
+
+  @Override
+  public DomParamBuilder createParamBuilder() {
+    return impl().startParam();
+  }
+
+  @Override
+  public InputBuilder createPasswordInputBuilder() {
+    return impl().startPasswordInput();
+  }
+
+  @Override
+  public DomPreBuilder createPreBuilder() {
+    return impl().startPre();
+  }
+
+  @Override
+  public DomButtonBuilder createPushButtonBuilder() {
+    return impl().startPushButton();
+  }
+
+  @Override
+  public DomQuoteBuilder createQuoteBuilder() {
+    return impl().startQuote();
+  }
+
+  @Override
+  public InputBuilder createRadioInputBuilder(String name) {
+    return impl().startRadioInput(name);
+  }
+
+  @Override
+  public DomButtonBuilder createResetButtonBuilder() {
+    return impl().startResetButton();
+  }
+
+  @Override
+  public InputBuilder createResetInputBuilder() {
+    return impl().startResetInput();
+  }
+
+  @Override
+  public DomScriptBuilder createScriptBuilder() {
+    return impl().startScript();
+  }
+
+  @Override
+  public DomSelectBuilder createSelectBuilder() {
     return impl().startSelect();
   }
 
   @Override
+  public DomSourceBuilder createSourceBuilder() {
+    return impl().startSource();
+  }
+
+  @Override
+  public DomSpanBuilder createSpanBuilder() {
+    return impl().startSpan();
+  }
+
+  @Override
+  public DomStyleBuilder createStyleBuilder() {
+    return impl().startStyle();
+  }
+
+  @Override
+  public DomButtonBuilder createSubmitButtonBuilder() {
+    return impl().startSubmitButton();
+  }
+
+  @Override
+  public InputBuilder createSubmitInputBuilder() {
+    return impl().startSubmitInput();
+  }
+
+  @Override
+  public DomTableBuilder createTableBuilder() {
+    return impl().startTable();
+  }
+
+  @Override
+  public DomTableCaptionBuilder createTableCaptionBuilder() {
+    return impl().startTableCaption();
+  }
+
+  @Override
+  public DomTableSectionBuilder createTBodyBuilder() {
+    return impl().startTBody();
+  }
+
+  @Override
+  public DomTableCellBuilder createTDBuilder() {
+    return impl().startTD();
+  }
+
+  @Override
+  public DomTextAreaBuilder createTextAreaBuilder() {
+    return impl().startTextArea();
+  }
+
+  @Override
+  public InputBuilder createTextInputBuilder() {
+    return impl().startTextInput();
+  }
+
+  @Override
+  public DomTableSectionBuilder createTFootBuilder() {
+    return impl().startTFoot();
+  }
+
+  @Override
+  public DomTableCellBuilder createTHBuilder() {
+    return impl().startTH();
+  }
+
+  @Override
+  public DomTableSectionBuilder createTHeadBuilder() {
+    return impl().startTHead();
+  }
+
+  @Override
+  public DomTableRowBuilder createTRBuilder() {
+    return impl().startTR();
+  }
+
+  @Override
+  public DomUListBuilder createUListBuilder() {
+    return impl().startUList();
+  }
+
+  @Override
+  public DomVideoBuilder createVideoBuilder() {
+    return impl().startVideo();
+  }
+
+  @Override
   public ElementBuilder trustedCreate(String tagName) {
     return impl().trustedStart(tagName);
   }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java b/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java
index 7b97fc0..916d6b4 100644
--- a/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java
@@ -17,10 +17,16 @@
 
 import com.google.gwt.dom.builder.shared.ElementBuilderBase;
 import com.google.gwt.dom.builder.shared.ElementBuilderImpl;
+import com.google.gwt.dom.builder.shared.InputBuilder;
 import com.google.gwt.dom.builder.shared.StylesBuilder;
+import com.google.gwt.dom.client.ButtonElement;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.InputElement;
+import com.google.gwt.dom.client.QuoteElement;
 import com.google.gwt.dom.client.Style;
+import com.google.gwt.dom.client.TableColElement;
+import com.google.gwt.dom.client.TableSectionElement;
 import com.google.gwt.safehtml.shared.SafeHtml;
 
 import java.util.ArrayList;
@@ -38,11 +44,55 @@
    * Less common element builders are created lazily to avoid unnecessary object
    * creation.
    */
-  private final DomDivBuilder divElementBuilder = new DomDivBuilder(this);
+  private DomAnchorBuilder anchorBuilder;
+  private DomAreaBuilder areaBuilder;
+  private DomAudioBuilder audioBuilder;
+  private DomBaseBuilder baseBuilder;
+  private DomBodyBuilder bodyBuilder;
+  private DomBRBuilder brBuilder;
+  private DomButtonBuilder buttonBuilder;
+  private DomCanvasBuilder canvasBuilder;
+  private final DomDivBuilder divBuilder = new DomDivBuilder(this);
+  private DomDListBuilder dListBuilder;
   private final DomElementBuilder elementBuilder = new DomElementBuilder(this);
-  private DomOptionBuilder optionElementBuilder;
-  private DomSelectBuilder selectElementBuilder;
-  private final StylesBuilder styleBuilder = new DomStylesBuilder(this);
+  private DomFieldSetBuilder fieldSetBuilder;
+  private DomFormBuilder formBuilder;
+  private DomFrameBuilder frameBuilder;
+  private DomFrameSetBuilder frameSetBuilder;
+  private DomHeadBuilder headBuilder;
+  private DomHeadingBuilder headingBuilder;
+  private DomHRBuilder hrBuilder;
+  private DomIFrameBuilder iFrameBuilder;
+  private DomImageBuilder imageBuilder;
+  private final DomInputBuilder inputBuilder = new DomInputBuilder(this);
+  private DomLabelBuilder labelBuilder;
+  private DomLegendBuilder legendBuilder;
+  private final DomLIBuilder liBuilder = new DomLIBuilder(this);
+  private DomLinkBuilder linkBuilder;
+  private DomMapBuilder mapBuilder;
+  private DomMetaBuilder metaBuilder;
+  private DomOListBuilder oListBuilder;
+  private final DomOptionBuilder optionBuilder = new DomOptionBuilder(this);
+  private DomOptGroupBuilder optGroupBuilder;
+  private DomParagraphBuilder paragraphBuilder;
+  private DomParamBuilder paramBuilder;
+  private DomPreBuilder preBuilder;
+  private DomQuoteBuilder quoteBuilder;
+  private DomScriptBuilder scriptBuilder;
+  private DomSelectBuilder selectBuilder;
+  private DomSourceBuilder sourceBuilder;
+  private final DomSpanBuilder spanBuilder = new DomSpanBuilder(this);
+  private final StylesBuilder stylesBuilder = new DomStylesBuilder(this);
+  private DomStyleBuilder styleBuilder;
+  private DomTableBuilder tableBuilder;
+  private final DomTableCellBuilder tableCellBuilder = new DomTableCellBuilder(this);
+  private DomTableCaptionBuilder tableCaptionBuilder;
+  private DomTableColBuilder tableColBuilder;
+  private final DomTableRowBuilder tableRowBuilder = new DomTableRowBuilder(this);
+  private DomTableSectionBuilder tableSectionBuilder;
+  private DomTextAreaBuilder textAreaBuilder;
+  private DomUListBuilder uListBuilder;
+  private DomVideoBuilder videoBuilder;
 
   private Element root;
 
@@ -63,27 +113,389 @@
     return builder;
   }
 
+  public DomAnchorBuilder startAnchor() {
+    if (anchorBuilder == null) {
+      anchorBuilder = new DomAnchorBuilder(this);
+    }
+    return start(Document.get().createAnchorElement(), anchorBuilder);
+  }
+
+  public DomAreaBuilder startArea() {
+    if (areaBuilder == null) {
+      areaBuilder = new DomAreaBuilder(this);
+    }
+    return start(Document.get().createAreaElement(), areaBuilder);
+  }
+
+  public DomAudioBuilder startAudio() {
+    if (audioBuilder == null) {
+      audioBuilder = new DomAudioBuilder(this);
+    }
+    return start(Document.get().createAudioElement(), audioBuilder);
+  }
+
+  public DomBaseBuilder startBase() {
+    if (baseBuilder == null) {
+      baseBuilder = new DomBaseBuilder(this);
+    }
+    return start(Document.get().createBaseElement(), baseBuilder);
+  }
+
+  public DomQuoteBuilder startBlockQuote() {
+    return startQuote(Document.get().createBlockQuoteElement());
+  }
+
+  public DomBodyBuilder startBody() {
+    if (bodyBuilder == null) {
+      bodyBuilder = new DomBodyBuilder(this);
+    }
+    return start(Document.get().createElement("body"), bodyBuilder);
+  }
+
+  public DomBRBuilder startBR() {
+    if (brBuilder == null) {
+      brBuilder = new DomBRBuilder(this);
+    }
+    return start(Document.get().createBRElement(), brBuilder);
+  }
+
+  public InputBuilder startButtonInput() {
+    return startInput(Document.get().createButtonInputElement());
+  }
+
+  public DomCanvasBuilder startCanvas() {
+    if (canvasBuilder == null) {
+      canvasBuilder = new DomCanvasBuilder(this);
+    }
+    return start(Document.get().createCanvasElement(), canvasBuilder);
+  }
+
+  public InputBuilder startCheckInput() {
+    return startInput(Document.get().createCheckInputElement());
+  }
+
+  public DomTableColBuilder startCol() {
+    return startTableCol(Document.get().createColElement());
+  }
+
+  public DomTableColBuilder startColGroup() {
+    return startTableCol(Document.get().createColGroupElement());
+  }
+
   public DomDivBuilder startDiv() {
-    return start(Document.get().createDivElement(), divElementBuilder);
+    return start(Document.get().createDivElement(), divBuilder);
+  }
+
+  public DomDListBuilder startDList() {
+    if (dListBuilder == null) {
+      dListBuilder = new DomDListBuilder(this);
+    }
+    return start(Document.get().createDLElement(), dListBuilder);
+  }
+
+  public DomFieldSetBuilder startFieldSet() {
+    if (fieldSetBuilder == null) {
+      fieldSetBuilder = new DomFieldSetBuilder(this);
+    }
+    return start(Document.get().createFieldSetElement(), fieldSetBuilder);
+  }
+
+  public InputBuilder startFileInput() {
+    return startInput(Document.get().createFileInputElement());
+  }
+
+  public DomFormBuilder startForm() {
+    if (formBuilder == null) {
+      formBuilder = new DomFormBuilder(this);
+    }
+    return start(Document.get().createFormElement(), formBuilder);
+  }
+
+  public DomFrameBuilder startFrame() {
+    if (frameBuilder == null) {
+      frameBuilder = new DomFrameBuilder(this);
+    }
+    return start(Document.get().createFrameElement(), frameBuilder);
+  }
+
+  public DomFrameSetBuilder startFrameSet() {
+    if (frameSetBuilder == null) {
+      frameSetBuilder = new DomFrameSetBuilder(this);
+    }
+    return start(Document.get().createFrameSetElement(), frameSetBuilder);
+  }
+
+  public DomHeadingBuilder startH1() {
+    return startHeading(1);
+  }
+
+  public DomHeadingBuilder startH2() {
+    return startHeading(2);
+  }
+
+  public DomHeadingBuilder startH3() {
+    return startHeading(3);
+  }
+
+  public DomHeadingBuilder startH4() {
+    return startHeading(4);
+  }
+
+  public DomHeadingBuilder startH5() {
+    return startHeading(5);
+  }
+
+  public DomHeadingBuilder startH6() {
+    return startHeading(6);
+  }
+
+  public DomHeadBuilder startHead() {
+    if (headBuilder == null) {
+      headBuilder = new DomHeadBuilder(this);
+    }
+    return start(Document.get().createHeadElement(), headBuilder);
+  }
+
+  public InputBuilder startHiddenInput() {
+    return startInput(Document.get().createHiddenInputElement());
+  }
+
+  public DomHRBuilder startHR() {
+    if (hrBuilder == null) {
+      hrBuilder = new DomHRBuilder(this);
+    }
+    return start(Document.get().createHRElement(), hrBuilder);
+  }
+
+  public DomIFrameBuilder startIFrame() {
+    if (iFrameBuilder == null) {
+      iFrameBuilder = new DomIFrameBuilder(this);
+    }
+    return start(Document.get().createIFrameElement(), iFrameBuilder);
+  }
+
+  public DomImageBuilder startImage() {
+    if (imageBuilder == null) {
+      imageBuilder = new DomImageBuilder(this);
+    }
+    return start(Document.get().createImageElement(), imageBuilder);
+  }
+
+  public InputBuilder startImageInput() {
+    return startInput(Document.get().createImageInputElement());
+  }
+
+  /**
+   * Start an input using the specified InputElement.
+   */
+  public DomInputBuilder startInput(InputElement input) {
+    return start(input, inputBuilder);
+  }
+
+  public DomLabelBuilder startLabel() {
+    if (labelBuilder == null) {
+      labelBuilder = new DomLabelBuilder(this);
+    }
+    return start(Document.get().createLabelElement(), labelBuilder);
+  }
+
+  public DomLegendBuilder startLegend() {
+    if (legendBuilder == null) {
+      legendBuilder = new DomLegendBuilder(this);
+    }
+    return start(Document.get().createLegendElement(), legendBuilder);
+  }
+
+  public DomLIBuilder startLI() {
+    return start(Document.get().createLIElement(), liBuilder);
+  }
+
+  public DomLinkBuilder startLink() {
+    if (linkBuilder == null) {
+      linkBuilder = new DomLinkBuilder(this);
+    }
+    return start(Document.get().createLinkElement(), linkBuilder);
+  }
+
+  public DomMapBuilder startMap() {
+    if (mapBuilder == null) {
+      mapBuilder = new DomMapBuilder(this);
+    }
+    return start(Document.get().createMapElement(), mapBuilder);
+  }
+
+  public DomMetaBuilder startMeta() {
+    if (metaBuilder == null) {
+      metaBuilder = new DomMetaBuilder(this);
+    }
+    return start(Document.get().createMetaElement(), metaBuilder);
+  }
+
+  public DomOListBuilder startOList() {
+    if (oListBuilder == null) {
+      oListBuilder = new DomOListBuilder(this);
+    }
+    return start(Document.get().createOLElement(), oListBuilder);
+  }
+
+  public DomOptGroupBuilder startOptGroup() {
+    if (optGroupBuilder == null) {
+      optGroupBuilder = new DomOptGroupBuilder(this);
+    }
+    return start(Document.get().createOptGroupElement(), optGroupBuilder);
   }
 
   public DomOptionBuilder startOption() {
-    if (optionElementBuilder == null) {
-      optionElementBuilder = new DomOptionBuilder(this);
+    return start(Document.get().createOptionElement(), optionBuilder);
+  }
+
+  public DomParagraphBuilder startParagraph() {
+    if (paragraphBuilder == null) {
+      paragraphBuilder = new DomParagraphBuilder(this);
     }
-    return start(Document.get().createOptionElement(), optionElementBuilder);
+    return start(Document.get().createPElement(), paragraphBuilder);
+  }
+
+  public DomParamBuilder startParam() {
+    if (paramBuilder == null) {
+      paramBuilder = new DomParamBuilder(this);
+    }
+    return start(Document.get().createParamElement(), paramBuilder);
+  }
+
+  public InputBuilder startPasswordInput() {
+    return startInput(Document.get().createPasswordInputElement());
+  }
+
+  public DomPreBuilder startPre() {
+    if (preBuilder == null) {
+      preBuilder = new DomPreBuilder(this);
+    }
+    return start(Document.get().createPreElement(), preBuilder);
+  }
+
+  public DomButtonBuilder startPushButton() {
+    return startButton(Document.get().createPushButtonElement());
+  }
+
+  public DomQuoteBuilder startQuote() {
+    return startQuote(Document.get().createQElement());
+  }
+
+  public InputBuilder startRadioInput(String name) {
+    return startInput(Document.get().createRadioInputElement(name));
+  }
+
+  public DomButtonBuilder startResetButton() {
+    return startButton(Document.get().createResetButtonElement());
+  }
+
+  public InputBuilder startResetInput() {
+    return startInput(Document.get().createSubmitInputElement());
+  }
+
+  public DomScriptBuilder startScript() {
+    if (scriptBuilder == null) {
+      scriptBuilder = new DomScriptBuilder(this);
+    }
+    return start(Document.get().createScriptElement(), scriptBuilder);
   }
 
   public DomSelectBuilder startSelect() {
-    if (selectElementBuilder == null) {
-      selectElementBuilder = new DomSelectBuilder(this);
+    if (selectBuilder == null) {
+      selectBuilder = new DomSelectBuilder(this);
     }
-    return start(Document.get().createSelectElement(), selectElementBuilder);
+    return start(Document.get().createSelectElement(), selectBuilder);
+  }
+
+  public DomSourceBuilder startSource() {
+    if (sourceBuilder == null) {
+      sourceBuilder = new DomSourceBuilder(this);
+    }
+    return start(Document.get().createSourceElement(), sourceBuilder);
+  }
+
+  public DomSpanBuilder startSpan() {
+    return start(Document.get().createSpanElement(), spanBuilder);
+  }
+
+  public DomStyleBuilder startStyle() {
+    if (styleBuilder == null) {
+      styleBuilder = new DomStyleBuilder(this);
+    }
+    return start(Document.get().createStyleElement(), styleBuilder);
+  }
+
+  public DomButtonBuilder startSubmitButton() {
+    return startButton(Document.get().createSubmitButtonElement());
+  }
+
+  public InputBuilder startSubmitInput() {
+    return startInput(Document.get().createSubmitInputElement());
+  }
+
+  public DomTableBuilder startTable() {
+    if (tableBuilder == null) {
+      tableBuilder = new DomTableBuilder(this);
+    }
+    return start(Document.get().createTableElement(), tableBuilder);
+  }
+
+  public DomTableCaptionBuilder startTableCaption() {
+    if (tableCaptionBuilder == null) {
+      tableCaptionBuilder = new DomTableCaptionBuilder(this);
+    }
+    return start(Document.get().createCaptionElement(), tableCaptionBuilder);
+  }
+
+  public DomTableSectionBuilder startTBody() {
+    return startTableSection(Document.get().createTBodyElement());
+  }
+
+  public DomTableCellBuilder startTD() {
+    return start(Document.get().createTDElement(), tableCellBuilder);
+  }
+
+  public DomTextAreaBuilder startTextArea() {
+    if (textAreaBuilder == null) {
+      textAreaBuilder = new DomTextAreaBuilder(this);
+    }
+    return start(Document.get().createTextAreaElement(), textAreaBuilder);
+  }
+
+  public DomTableSectionBuilder startTFoot() {
+    return startTableSection(Document.get().createTFootElement());
+  }
+
+  public DomTableCellBuilder startTH() {
+    return start(Document.get().createTHElement(), tableCellBuilder);
+  }
+
+  public DomTableSectionBuilder startTHead() {
+    return startTableSection(Document.get().createTHeadElement());
+  }
+
+  public DomTableRowBuilder startTR() {
+    return start(Document.get().createTRElement(), tableRowBuilder);
+  }
+
+  public DomUListBuilder startUList() {
+    if (uListBuilder == null) {
+      uListBuilder = new DomUListBuilder(this);
+    }
+    return start(Document.get().createULElement(), uListBuilder);
+  }
+
+  public DomVideoBuilder startVideo() {
+    if (videoBuilder == null) {
+      videoBuilder = new DomVideoBuilder(this);
+    }
+    return start(Document.get().createVideoElement(), videoBuilder);
   }
 
   @Override
   public StylesBuilder style() {
-    return styleBuilder;
+    return stylesBuilder;
   }
 
   public DomElementBuilder trustedStart(String tagName) {
@@ -107,6 +519,11 @@
   }
 
   @Override
+  protected void doEndStartTagImpl() {
+    // No-op.
+  }
+
+  @Override
   protected void doEndTagImpl(String tagName) {
     // No-op.
   }
@@ -131,6 +548,12 @@
     getCurrentElement().setInnerText(text);
   }
 
+  @Override
+  protected void lockCurrentElement() {
+    // Overridden for visibility.
+    super.lockCurrentElement();
+  }
+
   /**
    * Assert that the builder is in a state where an attribute can be added.
    * 
@@ -163,6 +586,10 @@
     return currentElement;
   }
 
+  InputBuilder startTextInput() {
+    return startInput(Document.get().createTextInputElement());
+  }
+
   private void popElement() {
     Element toRet = getCurrentElement();
     int itemCount = stackElements.size(); // Greater than or equal to one.
@@ -202,4 +629,54 @@
 
     return builder;
   }
-}
\ No newline at end of file
+
+  /**
+   * Start a button using the specified {@link ButtonElement}.
+   */
+  private DomButtonBuilder startButton(ButtonElement button) {
+    if (buttonBuilder == null) {
+      buttonBuilder = new DomButtonBuilder(this);
+    }
+    return start(button, buttonBuilder);
+  }
+
+  /**
+   * Start one of the many headers.
+   */
+  private DomHeadingBuilder startHeading(int level) {
+    if (headingBuilder == null) {
+      headingBuilder = new DomHeadingBuilder(this);
+    }
+    return start(Document.get().createHElement(level), headingBuilder);
+  }
+
+  /**
+   * Start a quote or blockquote.
+   */
+  private DomQuoteBuilder startQuote(QuoteElement quote) {
+    if (quoteBuilder == null) {
+      quoteBuilder = new DomQuoteBuilder(this);
+    }
+    return start(quote, quoteBuilder);
+  }
+
+  /**
+   * Start a table col or colgroup.
+   */
+  private DomTableColBuilder startTableCol(TableColElement element) {
+    if (tableColBuilder == null) {
+      tableColBuilder = new DomTableColBuilder(this);
+    }
+    return start(element, tableColBuilder);
+  }
+
+  /**
+   * Start a table section using the specified {@link TableSectionElement}.
+   */
+  private DomTableSectionBuilder startTableSection(TableSectionElement section) {
+    if (tableSectionBuilder == null) {
+      tableSectionBuilder = new DomTableSectionBuilder(this);
+    }
+    return start(section, tableSectionBuilder);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomButtonBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomButtonBuilder.java
new file mode 100644
index 0000000..de62eeb
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomButtonBuilder.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.ButtonBuilder;
+import com.google.gwt.dom.client.ButtonElement;
+
+/**
+ * DOM-based implementation of {@link ButtonBuilder}.
+ */
+public class DomButtonBuilder extends DomElementBuilderBase<ButtonBuilder, ButtonElement> implements
+    ButtonBuilder {
+
+  DomButtonBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public ButtonBuilder accessKey(String accessKey) {
+    assertCanAddAttribute().setAccessKey(accessKey);
+    return this;
+  }
+
+  @Override
+  public ButtonBuilder disabled() {
+    assertCanAddAttribute().setDisabled(true);
+    return this;
+  }
+
+  @Override
+  public ButtonBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+
+  @Override
+  public ButtonBuilder value(String value) {
+    assertCanAddAttribute().setValue(value);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomCanvasBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomCanvasBuilder.java
new file mode 100644
index 0000000..ffd9013
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomCanvasBuilder.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.CanvasBuilder;
+import com.google.gwt.dom.client.CanvasElement;
+
+/**
+ * DOM-based implementation of {@link CanvasBuilder}.
+ */
+public class DomCanvasBuilder extends DomElementBuilderBase<CanvasBuilder, CanvasElement> implements
+    CanvasBuilder {
+
+  DomCanvasBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public CanvasBuilder height(int height) {
+    assertCanAddAttribute().setHeight(height);
+    return this;
+  }
+
+  @Override
+  public CanvasBuilder width(int width) {
+    assertCanAddAttribute().setWidth(width);
+    return this;
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomDListBuilder.java
similarity index 60%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomDListBuilder.java
index e49c505..57505bdf 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomDListBuilder.java
@@ -13,15 +13,18 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.DListBuilder;
+import com.google.gwt.dom.client.DListElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link DListBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomDListBuilder extends DomElementBuilderBase<DListBuilder, DListElement> implements
+    DListBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomDListBuilder(DomBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomDivBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomDivBuilder.java
index f0bb3e3..757bfdf 100644
--- a/user/src/com/google/gwt/dom/builder/client/DomDivBuilder.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomDivBuilder.java
@@ -19,7 +19,7 @@
 import com.google.gwt.dom.client.DivElement;
 
 /**
- * Implementation of {@link DivBuilder}.
+ * DOM-based implementation of {@link DivBuilder}.
  */
 public class DomDivBuilder extends DomElementBuilderBase<DivBuilder, DivElement>
     implements DivBuilder {
diff --git a/user/src/com/google/gwt/dom/builder/client/DomElementBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomElementBuilder.java
index 88d9b76..e3de3f9 100644
--- a/user/src/com/google/gwt/dom/builder/client/DomElementBuilder.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomElementBuilder.java
@@ -19,7 +19,7 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * Implementation of {@link ElementBuilder}.
+ * DOM-based implementation of {@link ElementBuilder}.
  */
 public class DomElementBuilder extends DomElementBuilderBase<ElementBuilder, Element> implements
     ElementBuilder {
diff --git a/user/src/com/google/gwt/dom/builder/client/DomElementBuilderBase.java b/user/src/com/google/gwt/dom/builder/client/DomElementBuilderBase.java
index 6fb6ea5..6978f7e 100644
--- a/user/src/com/google/gwt/dom/builder/client/DomElementBuilderBase.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomElementBuilderBase.java
@@ -15,14 +15,57 @@
  */
 package com.google.gwt.dom.builder.client;
 
+import com.google.gwt.dom.builder.shared.AbstractElementBuilderBase;
+import com.google.gwt.dom.builder.shared.AnchorBuilder;
+import com.google.gwt.dom.builder.shared.AreaBuilder;
+import com.google.gwt.dom.builder.shared.AudioBuilder;
+import com.google.gwt.dom.builder.shared.BRBuilder;
+import com.google.gwt.dom.builder.shared.BaseBuilder;
+import com.google.gwt.dom.builder.shared.BodyBuilder;
+import com.google.gwt.dom.builder.shared.ButtonBuilder;
+import com.google.gwt.dom.builder.shared.CanvasBuilder;
+import com.google.gwt.dom.builder.shared.DListBuilder;
 import com.google.gwt.dom.builder.shared.DivBuilder;
 import com.google.gwt.dom.builder.shared.ElementBuilder;
 import com.google.gwt.dom.builder.shared.ElementBuilderBase;
+import com.google.gwt.dom.builder.shared.FieldSetBuilder;
+import com.google.gwt.dom.builder.shared.FormBuilder;
+import com.google.gwt.dom.builder.shared.FrameBuilder;
+import com.google.gwt.dom.builder.shared.FrameSetBuilder;
+import com.google.gwt.dom.builder.shared.HRBuilder;
+import com.google.gwt.dom.builder.shared.HeadBuilder;
+import com.google.gwt.dom.builder.shared.HeadingBuilder;
+import com.google.gwt.dom.builder.shared.IFrameBuilder;
+import com.google.gwt.dom.builder.shared.ImageBuilder;
+import com.google.gwt.dom.builder.shared.InputBuilder;
+import com.google.gwt.dom.builder.shared.LIBuilder;
+import com.google.gwt.dom.builder.shared.LabelBuilder;
+import com.google.gwt.dom.builder.shared.LegendBuilder;
+import com.google.gwt.dom.builder.shared.LinkBuilder;
+import com.google.gwt.dom.builder.shared.MapBuilder;
+import com.google.gwt.dom.builder.shared.MetaBuilder;
+import com.google.gwt.dom.builder.shared.OListBuilder;
+import com.google.gwt.dom.builder.shared.OptGroupBuilder;
 import com.google.gwt.dom.builder.shared.OptionBuilder;
+import com.google.gwt.dom.builder.shared.ParagraphBuilder;
+import com.google.gwt.dom.builder.shared.ParamBuilder;
+import com.google.gwt.dom.builder.shared.PreBuilder;
+import com.google.gwt.dom.builder.shared.QuoteBuilder;
+import com.google.gwt.dom.builder.shared.ScriptBuilder;
 import com.google.gwt.dom.builder.shared.SelectBuilder;
-import com.google.gwt.dom.builder.shared.StylesBuilder;
+import com.google.gwt.dom.builder.shared.SourceBuilder;
+import com.google.gwt.dom.builder.shared.SpanBuilder;
+import com.google.gwt.dom.builder.shared.StyleBuilder;
+import com.google.gwt.dom.builder.shared.TableBuilder;
+import com.google.gwt.dom.builder.shared.TableCaptionBuilder;
+import com.google.gwt.dom.builder.shared.TableCellBuilder;
+import com.google.gwt.dom.builder.shared.TableColBuilder;
+import com.google.gwt.dom.builder.shared.TableRowBuilder;
+import com.google.gwt.dom.builder.shared.TableSectionBuilder;
+import com.google.gwt.dom.builder.shared.TextAreaBuilder;
+import com.google.gwt.dom.builder.shared.UListBuilder;
+import com.google.gwt.dom.builder.shared.VideoBuilder;
 import com.google.gwt.dom.client.Element;
-import com.google.gwt.safehtml.shared.SafeHtml;
 
 /**
  * Implementation of {@link ElementBuilderBase} that delegates to a
@@ -33,11 +76,11 @@
  * {@link Element} being built.
  * </p>
  * 
- * @param <T> the builder type returned from build methods
+ * @param <R> the builder type returned from build methods
  * @param <E> the {@link Element} type
  */
-public class DomElementBuilderBase<T extends ElementBuilderBase<?>, E extends Element> implements
-    ElementBuilderBase<T> {
+public class DomElementBuilderBase<R extends ElementBuilderBase<?>, E extends Element> extends
+    AbstractElementBuilderBase<R> {
 
   private final DomBuilderImpl delegate;
 
@@ -47,126 +90,404 @@
    * @param delegate the delegate that builds the element
    */
   DomElementBuilderBase(DomBuilderImpl delegate) {
+    this(delegate, false);
+  }
+
+  /**
+   * Construct a new {@link DomElementBuilderBase}.
+   * 
+   * @param delegate the delegate that builds the element
+   * @param isEndTagForbidden true if the end tag is forbidden for this element
+   */
+  DomElementBuilderBase(DomBuilderImpl delegate, boolean isEndTagForbidden) {
+    super(delegate, isEndTagForbidden);
     this.delegate = delegate;
   }
 
   @Override
-  public T attribute(String name, int value) {
-    return attribute(name, String.valueOf(value));
-  }
-
-  @Override
-  public T attribute(String name, String value) {
+  public R attribute(String name, String value) {
     assertCanAddAttribute().setAttribute(name, value);
     return getReturnBuilder();
   }
 
   @Override
-  public T className(String className) {
+  public R className(String className) {
     assertCanAddAttribute().setClassName(className);
     return getReturnBuilder();
   }
 
   @Override
-  public T dir(String dir) {
+  public R dir(String dir) {
     assertCanAddAttribute().setDir(dir);
     return getReturnBuilder();
   }
 
   @Override
-  public T draggable(String draggable) {
+  public R draggable(String draggable) {
     assertCanAddAttribute().setDraggable(draggable);
     return getReturnBuilder();
   }
 
-  @SuppressWarnings("unchecked")
   @Override
-  public <B extends ElementBuilderBase<?>> B end() {
-    // An explicit cast is required to satisfy some javac compilers.
-    return (B) delegate.end();
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public <B extends ElementBuilderBase<?>> B end(String tagName) {
-    return (B) delegate.end(tagName);
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public <B extends ElementBuilderBase<?>> B endDiv() {
-    return (B) end("div");
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public <B extends ElementBuilderBase<?>> B endOption() {
-    return (B) end("option");
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public <B extends ElementBuilderBase<?>> B endSelect() {
-    return (B) end("select");
-  }
-
-  @Override
-  public Element finish() {
-    return delegate.finish();
-  }
-
-  @Override
-  public T html(SafeHtml html) {
-    delegate.html(html);
-    return getReturnBuilder();
-  }
-
-  @Override
-  public T id(String id) {
+  public R id(String id) {
     assertCanAddAttribute().setId(id);
     return getReturnBuilder();
   }
 
   @Override
-  public T lang(String lang) {
+  public R lang(String lang) {
     assertCanAddAttribute().setLang(lang);
     return getReturnBuilder();
   }
 
   @Override
+  public AnchorBuilder startAnchor() {
+    return delegate.startAnchor();
+  }
+
+  @Override
+  public AreaBuilder startArea() {
+    return delegate.startArea();
+  }
+
+  @Override
+  public AudioBuilder startAudio() {
+    return delegate.startAudio();
+  }
+
+  @Override
+  public BaseBuilder startBase() {
+    return delegate.startBase();
+  }
+
+  @Override
+  public QuoteBuilder startBlockQuote() {
+    return delegate.startBlockQuote();
+  }
+
+  @Override
+  public BodyBuilder startBody() {
+    return delegate.startBody();
+  }
+
+  @Override
+  public BRBuilder startBR() {
+    return delegate.startBR();
+  }
+
+  @Override
+  public InputBuilder startButtonInput() {
+    return delegate.startButtonInput();
+  }
+
+  @Override
+  public CanvasBuilder startCanvas() {
+    return delegate.startCanvas();
+  }
+
+  @Override
+  public InputBuilder startCheckInput() {
+    return delegate.startCheckInput();
+  }
+
+  @Override
+  public TableColBuilder startCol() {
+    return delegate.startCol();
+  }
+
+  @Override
+  public TableColBuilder startColGroup() {
+    return delegate.startColGroup();
+  }
+
+  @Override
   public DivBuilder startDiv() {
     return delegate.startDiv();
   }
 
   @Override
+  public DListBuilder startDList() {
+    return delegate.startDList();
+  }
+
+  @Override
+  public FieldSetBuilder startFieldSet() {
+    return delegate.startFieldSet();
+  }
+
+  @Override
+  public InputBuilder startFileInput() {
+    return delegate.startFileInput();
+  }
+
+  @Override
+  public FormBuilder startForm() {
+    return delegate.startForm();
+  }
+
+  @Override
+  public FrameBuilder startFrame() {
+    return delegate.startFrame();
+  }
+
+  @Override
+  public FrameSetBuilder startFrameSet() {
+    return delegate.startFrameSet();
+  }
+
+  @Override
+  public HeadingBuilder startH1() {
+    return delegate.startH1();
+  }
+
+  @Override
+  public HeadingBuilder startH2() {
+    return delegate.startH2();
+  }
+
+  @Override
+  public HeadingBuilder startH3() {
+    return delegate.startH3();
+  }
+
+  @Override
+  public HeadingBuilder startH4() {
+    return delegate.startH4();
+  }
+
+  @Override
+  public HeadingBuilder startH5() {
+    return delegate.startH5();
+  }
+
+  @Override
+  public HeadingBuilder startH6() {
+    return delegate.startH6();
+  }
+
+  @Override
+  public HeadBuilder startHead() {
+    return delegate.startHead();
+  }
+
+  @Override
+  public InputBuilder startHiddenInput() {
+    return delegate.startHiddenInput();
+  }
+
+  @Override
+  public HRBuilder startHR() {
+    return delegate.startHR();
+  }
+
+  @Override
+  public IFrameBuilder startIFrame() {
+    return delegate.startIFrame();
+  }
+
+  @Override
+  public ImageBuilder startImage() {
+    return delegate.startImage();
+  }
+
+  @Override
+  public InputBuilder startImageInput() {
+    return delegate.startImageInput();
+  }
+
+  @Override
+  public LabelBuilder startLabel() {
+    return delegate.startLabel();
+  }
+
+  @Override
+  public LegendBuilder startLegend() {
+    return delegate.startLegend();
+  }
+
+  @Override
+  public LIBuilder startLI() {
+    return delegate.startLI();
+  }
+
+  @Override
+  public LinkBuilder startLink() {
+    return delegate.startLink();
+  }
+
+  @Override
+  public MapBuilder startMap() {
+    return delegate.startMap();
+  }
+
+  @Override
+  public MetaBuilder startMeta() {
+    return delegate.startMeta();
+  }
+
+  @Override
+  public OListBuilder startOList() {
+    return delegate.startOList();
+  }
+
+  @Override
+  public OptGroupBuilder startOptGroup() {
+    return delegate.startOptGroup();
+  }
+
+  @Override
   public OptionBuilder startOption() {
     return delegate.startOption();
   }
 
   @Override
+  public ParagraphBuilder startParagraph() {
+    return delegate.startParagraph();
+  }
+
+  @Override
+  public ParamBuilder startParam() {
+    return delegate.startParam();
+  }
+
+  @Override
+  public InputBuilder startPasswordInput() {
+    return delegate.startPasswordInput();
+  }
+
+  @Override
+  public PreBuilder startPre() {
+    return delegate.startPre();
+  }
+
+  @Override
+  public ButtonBuilder startPushButton() {
+    return delegate.startPushButton();
+  }
+
+  @Override
+  public QuoteBuilder startQuote() {
+    return delegate.startQuote();
+  }
+
+  @Override
+  public InputBuilder startRadioInput(String name) {
+    return delegate.startRadioInput(name);
+  }
+
+  @Override
+  public ButtonBuilder startResetButton() {
+    return delegate.startResetButton();
+  }
+
+  @Override
+  public InputBuilder startResetInput() {
+    return delegate.startResetInput();
+  }
+
+  @Override
+  public ScriptBuilder startScript() {
+    return delegate.startScript();
+  }
+
+  @Override
   public SelectBuilder startSelect() {
     return delegate.startSelect();
   }
 
   @Override
-  public StylesBuilder style() {
-    return delegate.style();
+  public SourceBuilder startSource() {
+    return delegate.startSource();
   }
 
   @Override
-  public T tabIndex(int tabIndex) {
+  public SpanBuilder startSpan() {
+    return delegate.startSpan();
+  }
+
+  @Override
+  public StyleBuilder startStyle() {
+    return delegate.startStyle();
+  }
+
+  @Override
+  public ButtonBuilder startSubmitButton() {
+    return delegate.startSubmitButton();
+  }
+
+  @Override
+  public InputBuilder startSubmitInput() {
+    return delegate.startSubmitInput();
+  }
+
+  @Override
+  public TableBuilder startTable() {
+    return delegate.startTable();
+  }
+
+  @Override
+  public TableCaptionBuilder startTableCaption() {
+    return delegate.startTableCaption();
+  }
+
+  @Override
+  public TableSectionBuilder startTBody() {
+    return delegate.startTBody();
+  }
+
+  @Override
+  public TableCellBuilder startTD() {
+    return delegate.startTD();
+  }
+
+  @Override
+  public TextAreaBuilder startTextArea() {
+    return delegate.startTextArea();
+  }
+
+  @Override
+  public InputBuilder startTextInput() {
+    return delegate.startTextInput();
+  }
+
+  @Override
+  public TableSectionBuilder startTFoot() {
+    return delegate.startTFoot();
+  }
+
+  @Override
+  public TableCellBuilder startTH() {
+    return delegate.startTH();
+  }
+
+  @Override
+  public TableSectionBuilder startTHead() {
+    return delegate.startTHead();
+  }
+
+  @Override
+  public TableRowBuilder startTR() {
+    return delegate.startTR();
+  }
+
+  @Override
+  public UListBuilder startUList() {
+    return delegate.startUList();
+  }
+
+  @Override
+  public VideoBuilder startVideo() {
+    return delegate.startVideo();
+  }
+
+  @Override
+  public R tabIndex(int tabIndex) {
     assertCanAddAttribute().setTabIndex(tabIndex);
     return getReturnBuilder();
   }
 
   @Override
-  public T text(String text) {
-    delegate.text(text);
-    return getReturnBuilder();
-  }
-
-  @Override
-  public T title(String title) {
+  public R title(String title) {
     assertCanAddAttribute().setTitle(title);
     return getReturnBuilder();
   }
@@ -189,13 +510,7 @@
     return delegate.assertCanAddAttribute().<E> cast();
   }
 
-  /**
-   * Get the builder to return from build methods.
-   * 
-   * @return the return builder
-   */
-  @SuppressWarnings("unchecked")
-  private T getReturnBuilder() {
-    return (T) this;
+  DomBuilderImpl getDelegate() {
+    return delegate;
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomFieldSetBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomFieldSetBuilder.java
new file mode 100644
index 0000000..e26d36c
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomFieldSetBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.FieldSetBuilder;
+import com.google.gwt.dom.client.FieldSetElement;
+
+/**
+ * DOM-based implementation of {@link FieldSetBuilder}.
+ */
+public class DomFieldSetBuilder extends DomElementBuilderBase<FieldSetBuilder, FieldSetElement>
+    implements FieldSetBuilder {
+
+  DomFieldSetBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomFormBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomFormBuilder.java
new file mode 100644
index 0000000..60f461a
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomFormBuilder.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.FormBuilder;
+import com.google.gwt.dom.client.FormElement;
+
+/**
+ * DOM-based implementation of {@link FormBuilder}.
+ */
+public class DomFormBuilder extends DomElementBuilderBase<FormBuilder, FormElement> implements
+    FormBuilder {
+
+  DomFormBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public FormBuilder acceptCharset(String acceptCharset) {
+    assertCanAddAttribute().setAcceptCharset(acceptCharset);
+    return this;
+  }
+
+  @Override
+  public FormBuilder action(String action) {
+    assertCanAddAttribute().setAction(action);
+    return this;
+  }
+
+  @Override
+  public FormBuilder enctype(String enctype) {
+    assertCanAddAttribute().setEnctype(enctype);
+    return this;
+  }
+
+  @Override
+  public FormBuilder method(String method) {
+    assertCanAddAttribute().setMethod(method);
+    return this;
+  }
+
+  @Override
+  public FormBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+
+  @Override
+  public FormBuilder target(String target) {
+    assertCanAddAttribute().setTarget(target);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomFrameBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomFrameBuilder.java
new file mode 100644
index 0000000..0f7022f
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomFrameBuilder.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.FrameBuilder;
+import com.google.gwt.dom.client.FrameElement;
+
+/**
+ * DOM-based implementation of {@link FrameBuilder}.
+ */
+public class DomFrameBuilder extends DomElementBuilderBase<FrameBuilder, FrameElement> implements
+    FrameBuilder {
+
+  DomFrameBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public FrameBuilder frameBorder(int frameBorder) {
+    assertCanAddAttribute().setFrameBorder(frameBorder);
+    return this;
+  }
+
+  @Override
+  public FrameBuilder longDesc(String longDesc) {
+    assertCanAddAttribute().setLongDesc(longDesc);
+    return this;
+  }
+
+  @Override
+  public FrameBuilder marginHeight(int marginHeight) {
+    assertCanAddAttribute().setMarginHeight(marginHeight);
+    return this;
+  }
+
+  @Override
+  public FrameBuilder marginWidth(int marginWidth) {
+    assertCanAddAttribute().setMarginWidth(marginWidth);
+    return this;
+  }
+
+  @Override
+  public FrameBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+
+  @Override
+  public FrameBuilder noResize() {
+    assertCanAddAttribute().setNoResize(true);
+    return this;
+  }
+
+  @Override
+  public FrameBuilder scrolling(String scrolling) {
+    assertCanAddAttribute().setScrolling(scrolling);
+    return this;
+  }
+
+  @Override
+  public FrameBuilder src(String src) {
+    assertCanAddAttribute().setSrc(src);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomFrameSetBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomFrameSetBuilder.java
new file mode 100644
index 0000000..010e101
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomFrameSetBuilder.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.FrameSetBuilder;
+import com.google.gwt.dom.client.FrameSetElement;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * DOM-based implementation of {@link FrameSetBuilder}.
+ */
+public class DomFrameSetBuilder extends DomElementBuilderBase<FrameSetBuilder, FrameSetElement>
+    implements FrameSetBuilder {
+
+  DomFrameSetBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public FrameSetBuilder cols(String cols) {
+    assertCanAddAttribute().setCols(cols);
+    return this;
+  }
+
+  @Override
+  public FrameSetBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public FrameSetBuilder rows(String rows) {
+    assertCanAddAttribute().setRows(rows);
+    return this;
+  }
+
+  @Override
+  public FrameSetBuilder text(String text) {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomHRBuilder.java
similarity index 62%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomHRBuilder.java
index e49c505..50550b5 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomHRBuilder.java
@@ -13,15 +13,17 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HRBuilder;
+import com.google.gwt.dom.client.HRElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link HRBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomHRBuilder extends DomElementBuilderBase<HRBuilder, HRElement> implements HRBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomHRBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomHeadBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomHeadBuilder.java
new file mode 100644
index 0000000..a4edf89
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomHeadBuilder.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HeadBuilder;
+import com.google.gwt.dom.client.HeadElement;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * DOM-based implementation of {@link HeadBuilder}.
+ */
+public class DomHeadBuilder extends DomElementBuilderBase<HeadBuilder, HeadElement> implements
+    HeadBuilder {
+
+  DomHeadBuilder(DomBuilderImpl delegate) {
+    super(delegate, false);
+  }
+
+  @Override
+  public HeadBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public HeadBuilder text(String text) {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomHeadingBuilder.java
similarity index 60%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomHeadingBuilder.java
index e49c505..2a94cba 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomHeadingBuilder.java
@@ -13,15 +13,18 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HeadingBuilder;
+import com.google.gwt.dom.client.HeadingElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link HeadingBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomHeadingBuilder extends DomElementBuilderBase<HeadingBuilder, HeadingElement>
+    implements HeadingBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomHeadingBuilder(DomBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomIFrameBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomIFrameBuilder.java
new file mode 100644
index 0000000..64493a4
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomIFrameBuilder.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlIFrameBuilder;
+import com.google.gwt.dom.builder.shared.IFrameBuilder;
+import com.google.gwt.dom.client.IFrameElement;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * DOM-based implementation of {@link IFrameBuilder}.
+ */
+public class DomIFrameBuilder extends DomElementBuilderBase<IFrameBuilder, IFrameElement> implements
+    IFrameBuilder {
+
+  DomIFrameBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public IFrameBuilder frameBorder(int frameBorder) {
+    assertCanAddAttribute().setFrameBorder(frameBorder);
+    return this;
+  }
+
+  @Override
+  public HtmlIFrameBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean isChildElementSupported() {
+    return false;
+  }
+
+  @Override
+  public IFrameBuilder marginHeight(int marginHeight) {
+    assertCanAddAttribute().setMarginHeight(marginHeight);
+    return this;
+  }
+
+  @Override
+  public IFrameBuilder marginWidth(int marginWidth) {
+    assertCanAddAttribute().setMarginWidth(marginWidth);
+    return this;
+  }
+
+  @Override
+  public IFrameBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+
+  @Override
+  public IFrameBuilder noResize() {
+    assertCanAddAttribute().setNoResize(true);
+    return this;
+  }
+
+  @Override
+  public IFrameBuilder scrolling(String scrolling) {
+    assertCanAddAttribute().setScrolling(scrolling);
+    return this;
+  }
+
+  @Override
+  public IFrameBuilder src(String src) {
+    assertCanAddAttribute().setSrc(src);
+    return this;
+  }
+
+  @Override
+  public HtmlIFrameBuilder text(String text) {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomImageBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomImageBuilder.java
new file mode 100644
index 0000000..324d779
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomImageBuilder.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.ImageBuilder;
+import com.google.gwt.dom.client.ImageElement;
+
+/**
+ * DOM-based implementation of {@link ImageBuilder}.
+ */
+public class DomImageBuilder extends DomElementBuilderBase<ImageBuilder, ImageElement> implements
+    ImageBuilder {
+
+  DomImageBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public ImageBuilder alt(String alt) {
+    assertCanAddAttribute().setAlt(alt);
+    return this;
+  }
+
+  @Override
+  public ImageBuilder height(int height) {
+    assertCanAddAttribute().setHeight(height);
+    return this;
+  }
+
+  @Override
+  public ImageBuilder isMap() {
+    assertCanAddAttribute().setIsMap(true);
+    return this;
+  }
+
+  @Override
+  public ImageBuilder src(String src) {
+    assertCanAddAttribute().setSrc(src);
+    return this;
+  }
+
+  @Override
+  public ImageBuilder width(int width) {
+    assertCanAddAttribute().setWidth(width);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomInputBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomInputBuilder.java
new file mode 100644
index 0000000..4616819
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomInputBuilder.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.InputBuilder;
+import com.google.gwt.dom.client.InputElement;
+
+/**
+ * DOM-based implementation of {@link InputBuilder}.
+ */
+public class DomInputBuilder extends DomElementBuilderBase<InputBuilder, InputElement> implements
+    InputBuilder {
+
+  DomInputBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public InputBuilder accept(String accept) {
+    assertCanAddAttribute().setAccept(accept);
+    return this;
+  }
+
+  @Override
+  public InputBuilder accessKey(String accessKey) {
+    assertCanAddAttribute().setAccessKey(accessKey);
+    return this;
+  }
+
+  @Override
+  public InputBuilder alt(String alt) {
+    assertCanAddAttribute().setAlt(alt);
+    return this;
+  }
+
+  @Override
+  public InputBuilder checked() {
+    assertCanAddAttribute().setChecked(true);
+    return this;
+  }
+
+  @Override
+  public InputBuilder defaultChecked() {
+    assertCanAddAttribute().setDefaultChecked(true);
+    return this;
+  }
+
+  @Override
+  public InputBuilder defaultValue(String defaultValue) {
+    assertCanAddAttribute().setDefaultValue(defaultValue);
+    return this;
+  }
+
+  @Override
+  public InputBuilder disabled() {
+    assertCanAddAttribute().setDisabled(true);
+    return this;
+  }
+
+  @Override
+  public InputBuilder maxLength(int maxLength) {
+    assertCanAddAttribute().setMaxLength(maxLength);
+    return this;
+  }
+
+  @Override
+  public InputBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+
+  @Override
+  public InputBuilder readOnly() {
+    assertCanAddAttribute().setReadOnly(true);
+    return this;
+  }
+
+  @Override
+  public InputBuilder size(int size) {
+    assertCanAddAttribute().setSize(size);
+    return this;
+  }
+
+  @Override
+  public InputBuilder src(String src) {
+    assertCanAddAttribute().setSrc(src);
+    return this;
+  }
+
+  @Override
+  public InputBuilder value(String value) {
+    assertCanAddAttribute().setValue(value);
+    return this;
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomLIBuilder.java
similarity index 62%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomLIBuilder.java
index e49c505..95d8db9 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomLIBuilder.java
@@ -13,15 +13,17 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.LIBuilder;
+import com.google.gwt.dom.client.LIElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link LIBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomLIBuilder extends DomElementBuilderBase<LIBuilder, LIElement> implements LIBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomLIBuilder(DomBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomLabelBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomLabelBuilder.java
new file mode 100644
index 0000000..684dda5
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomLabelBuilder.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.LabelBuilder;
+import com.google.gwt.dom.client.LabelElement;
+
+/**
+ * DOM-based implementation of {@link LabelBuilder}.
+ */
+public class DomLabelBuilder extends DomElementBuilderBase<LabelBuilder, LabelElement> implements
+    LabelBuilder {
+
+  DomLabelBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public LabelBuilder accessKey(String accessKey) {
+    assertCanAddAttribute().setAccessKey(accessKey);
+    return this;
+  }
+
+  @Override
+  public LabelBuilder htmlFor(String htmlFor) {
+    assertCanAddAttribute().setHtmlFor(htmlFor);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomLegendBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomLegendBuilder.java
new file mode 100644
index 0000000..2b7d9ae
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomLegendBuilder.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.LegendBuilder;
+import com.google.gwt.dom.client.LegendElement;
+
+/**
+ * DOM-based implementation of {@link LegendBuilder}.
+ */
+public class DomLegendBuilder extends DomElementBuilderBase<LegendBuilder, LegendElement> implements
+    LegendBuilder {
+
+  DomLegendBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public LegendBuilder accessKey(String accessKey) {
+    assertCanAddAttribute().setAccessKey(accessKey);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomLinkBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomLinkBuilder.java
new file mode 100644
index 0000000..8476db8
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomLinkBuilder.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.LinkBuilder;
+import com.google.gwt.dom.client.LinkElement;
+
+/**
+ * DOM-based implementation of {@link LinkBuilder}.
+ */
+public class DomLinkBuilder extends DomElementBuilderBase<LinkBuilder, LinkElement> implements
+    LinkBuilder {
+
+  DomLinkBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public LinkBuilder disabled() {
+    assertCanAddAttribute().setDisabled(true);
+    return this;
+  }
+
+  @Override
+  public LinkBuilder href(String href) {
+    assertCanAddAttribute().setHref(href);
+    return this;
+  }
+
+  @Override
+  public LinkBuilder hreflang(String hreflang) {
+    assertCanAddAttribute().setHreflang(hreflang);
+    return this;
+  }
+
+  @Override
+  public LinkBuilder media(String media) {
+    assertCanAddAttribute().setMedia(media);
+    return this;
+  }
+
+  @Override
+  public LinkBuilder rel(String rel) {
+    assertCanAddAttribute().setRel(rel);
+    return this;
+  }
+
+  @Override
+  public LinkBuilder target(String target) {
+    assertCanAddAttribute().setTarget(target);
+    return this;
+  }
+
+  @Override
+  public LinkBuilder type(String type) {
+    assertCanAddAttribute().setType(type);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomMapBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomMapBuilder.java
new file mode 100644
index 0000000..312975b
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomMapBuilder.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.MapBuilder;
+import com.google.gwt.dom.client.MapElement;
+
+/**
+ * DOM-based implementation of {@link MapBuilder}.
+ */
+public class DomMapBuilder extends DomElementBuilderBase<MapBuilder, MapElement> implements
+    MapBuilder {
+
+  DomMapBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public MapBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomMediaBuilderBase.java b/user/src/com/google/gwt/dom/builder/client/DomMediaBuilderBase.java
new file mode 100644
index 0000000..eb61702
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomMediaBuilderBase.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.MediaBuilder;
+import com.google.gwt.dom.client.MediaElement;
+
+/**
+ * Base class for HTML-based implementations of {@link MediaBuilder}.
+ * 
+ * @param <R> the builder type returned from build methods
+ * @param <E> the {@link MediaElement} type
+ */
+public class DomMediaBuilderBase<R extends MediaBuilder<?>, E extends MediaElement> extends
+    DomElementBuilderBase<R, E> implements MediaBuilder<R> {
+
+  DomMediaBuilderBase(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public R autoplay() {
+    assertCanAddAttribute().setAutoplay(true);
+    return getReturnBuilder();
+  }
+
+  @Override
+  public R controls() {
+    assertCanAddAttribute().setControls(true);
+    return getReturnBuilder();
+  }
+
+  @Override
+  public R loop() {
+    assertCanAddAttribute().setLoop(true);
+    return getReturnBuilder();
+  }
+
+  @Override
+  public R muted() {
+    assertCanAddAttribute().setMuted(true);
+    return getReturnBuilder();
+  }
+
+  @Override
+  public R preload(String preload) {
+    assertCanAddAttribute().setPreload(preload);
+    return getReturnBuilder();
+  }
+
+  @Override
+  public R src(String url) {
+    assertCanAddAttribute().setSrc(url);
+    return getReturnBuilder();
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomMetaBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomMetaBuilder.java
new file mode 100644
index 0000000..9cf7e5b
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomMetaBuilder.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.MetaBuilder;
+import com.google.gwt.dom.client.MetaElement;
+
+/**
+ * DOM-based implementation of {@link MetaBuilder}.
+ */
+public class DomMetaBuilder extends DomElementBuilderBase<MetaBuilder, MetaElement> implements
+    MetaBuilder {
+
+  DomMetaBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public MetaBuilder content(String content) {
+    assertCanAddAttribute().setContent(content);
+    return this;
+  }
+
+  @Override
+  public MetaBuilder httpEquiv(String httpEquiv) {
+    assertCanAddAttribute().setHttpEquiv(httpEquiv);
+    return this;
+  }
+
+  @Override
+  public MetaBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomModBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomModBuilder.java
new file mode 100644
index 0000000..24ca18e
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomModBuilder.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.ModBuilder;
+import com.google.gwt.dom.client.ModElement;
+
+/**
+ * DOM-based implementation of {@link ModBuilder}.
+ */
+public class DomModBuilder extends DomElementBuilderBase<ModBuilder, ModElement> implements ModBuilder {
+
+  DomModBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public ModBuilder cite(String cite) {
+    assertCanAddAttribute().setCite(cite);
+    return this;
+  }
+
+  @Override
+  public ModBuilder dateTime(String dateTime) {
+    assertCanAddAttribute().setDateTime(dateTime);
+    return this;
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomOListBuilder.java
similarity index 60%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomOListBuilder.java
index e49c505..eb0c5a4 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomOListBuilder.java
@@ -13,15 +13,18 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.OListBuilder;
+import com.google.gwt.dom.client.OListElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link OListBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomOListBuilder extends DomElementBuilderBase<OListBuilder, OListElement> implements
+    OListBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomOListBuilder(DomBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomOptGroupBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomOptGroupBuilder.java
new file mode 100644
index 0000000..44e80ea
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomOptGroupBuilder.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.OptGroupBuilder;
+import com.google.gwt.dom.client.OptGroupElement;
+
+/**
+ * DOM-based implementation of {@link OptGroupBuilder}.
+ */
+public class DomOptGroupBuilder extends DomElementBuilderBase<OptGroupBuilder, OptGroupElement>
+    implements OptGroupBuilder {
+
+  DomOptGroupBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public OptGroupBuilder disabled() {
+    assertCanAddAttribute().setDisabled(true);
+    return this;
+  }
+
+  @Override
+  public OptGroupBuilder label(String label) {
+    assertCanAddAttribute().setLabel(label);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomOptionBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomOptionBuilder.java
index cd5d2a7..da1c52c 100644
--- a/user/src/com/google/gwt/dom/builder/client/DomOptionBuilder.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomOptionBuilder.java
@@ -19,7 +19,7 @@
 import com.google.gwt.dom.client.OptionElement;
 
 /**
- * Implementation of {@link OptionBuilder}.
+ * DOM-based implementation of {@link OptionBuilder}.
  */
 public class DomOptionBuilder extends
     DomElementBuilderBase<OptionBuilder, OptionElement> implements OptionBuilder {
diff --git a/user/src/com/google/gwt/dom/builder/client/DomParagraphBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomParagraphBuilder.java
new file mode 100644
index 0000000..6b291fc
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomParagraphBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.ParagraphBuilder;
+import com.google.gwt.dom.client.ParagraphElement;
+
+/**
+ * DOM-based implementation of {@link ParagraphBuilder}.
+ */
+public class DomParagraphBuilder extends DomElementBuilderBase<ParagraphBuilder, ParagraphElement>
+    implements ParagraphBuilder {
+
+  DomParagraphBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomParamBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomParamBuilder.java
new file mode 100644
index 0000000..fb4e063
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomParamBuilder.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.ParamBuilder;
+import com.google.gwt.dom.client.ParamElement;
+
+/**
+ * DOM-based implementation of {@link ParamBuilder}.
+ */
+public class DomParamBuilder extends DomElementBuilderBase<ParamBuilder, ParamElement> implements ParamBuilder {
+
+  DomParamBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public ParamBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+
+  @Override
+  public ParamBuilder value(String value) {
+    assertCanAddAttribute().setValue(value);
+    return this;
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomPreBuilder.java
similarity index 61%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomPreBuilder.java
index e49c505..3a2668b 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomPreBuilder.java
@@ -13,15 +13,18 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.PreBuilder;
+import com.google.gwt.dom.client.PreElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link PreBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomPreBuilder extends DomElementBuilderBase<PreBuilder, PreElement> implements
+    PreBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomPreBuilder(DomBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomQuoteBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomQuoteBuilder.java
new file mode 100644
index 0000000..8c72073
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomQuoteBuilder.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.QuoteBuilder;
+import com.google.gwt.dom.client.QuoteElement;
+
+/**
+ * DOM-based implementation of {@link QuoteBuilder}.
+ */
+public class DomQuoteBuilder extends DomElementBuilderBase<QuoteBuilder, QuoteElement> implements
+    QuoteBuilder {
+
+  DomQuoteBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public QuoteBuilder cite(String cite) {
+    assertCanAddAttribute().setCite(cite);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomScriptBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomScriptBuilder.java
new file mode 100644
index 0000000..6b9446c
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomScriptBuilder.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.ScriptBuilder;
+import com.google.gwt.dom.client.ScriptElement;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * DOM-based implementation of {@link ScriptBuilder}.
+ */
+public class DomScriptBuilder extends DomElementBuilderBase<ScriptBuilder, ScriptElement> implements
+    ScriptBuilder {
+
+  DomScriptBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public ScriptBuilder defer(String defer) {
+    assertCanAddAttribute().setDefer(defer);
+    return this;
+  }
+
+  @Override
+  public ScriptBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public boolean isChildElementSupported() {
+    return false;
+  }
+
+  @Override
+  public ScriptBuilder src(String src) {
+    assertCanAddAttribute().setSrc(src);
+    return this;
+  }
+
+  @Override
+  public ScriptBuilder text(String text) {
+    assertCanAddAttribute().setText(text);
+    /*
+     * The HTML version appends text inline, so we prevent additional attributes
+     * after setting the text.
+     */
+    getDelegate().lockCurrentElement();
+    return this;
+  }
+
+  @Override
+  public ScriptBuilder type(String type) {
+    assertCanAddAttribute().setType(type);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomSelectBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomSelectBuilder.java
index a94f2d6..4ec94a2 100644
--- a/user/src/com/google/gwt/dom/builder/client/DomSelectBuilder.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomSelectBuilder.java
@@ -19,18 +19,54 @@
 import com.google.gwt.dom.client.SelectElement;
 
 /**
- * Implementation of {@link SelectBuilder}.
+ * DOM-based implementation of {@link SelectBuilder}.
  */
-public class DomSelectBuilder extends
-    DomElementBuilderBase<SelectBuilder, SelectElement> implements SelectBuilder {
+public class DomSelectBuilder extends DomElementBuilderBase<SelectBuilder, SelectElement> implements
+    SelectBuilder {
 
   DomSelectBuilder(DomBuilderImpl delegate) {
     super(delegate);
   }
 
   @Override
+  public SelectBuilder disabled() {
+    assertCanAddAttribute().setDisabled(true);
+    return this;
+  }
+
+  @Override
+  public SelectBuilder multiple() {
+    assertCanAddAttribute().setMultiple(true);
+    return this;
+  }
+
+  @Override
+  public SelectBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+
+  @Override
+  public SelectBuilder selectedIndex(int index) {
+    assertCanAddAttribute().setSelectedIndex(index);
+    return this;
+  }
+
+  @Override
   public SelectBuilder size(int size) {
     assertCanAddAttribute().setSize(size);
     return this;
   }
+
+  @Override
+  public SelectBuilder type(String type) {
+    assertCanAddAttribute().setType(type);
+    return this;
+  }
+
+  @Override
+  public SelectBuilder value(String value) {
+    assertCanAddAttribute().setValue(value);
+    return this;
+  }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomSourceBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomSourceBuilder.java
new file mode 100644
index 0000000..d2d2253
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomSourceBuilder.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.SourceBuilder;
+import com.google.gwt.dom.client.SourceElement;
+
+/**
+ * DOM-based implementation of {@link SourceBuilder}.
+ */
+public class DomSourceBuilder extends DomElementBuilderBase<SourceBuilder, SourceElement> implements
+    SourceBuilder {
+
+  DomSourceBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public SourceBuilder src(String url) {
+    assertCanAddAttribute().setSrc(url);
+    return this;
+  }
+
+  @Override
+  public SourceBuilder type(String type) {
+    assertCanAddAttribute().setType(type);
+    return this;
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomSpanBuilder.java
similarity index 61%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomSpanBuilder.java
index e49c505..6f539dd 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomSpanBuilder.java
@@ -13,15 +13,18 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.SpanBuilder;
+import com.google.gwt.dom.client.SpanElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link SpanBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomSpanBuilder extends DomElementBuilderBase<SpanBuilder, SpanElement> implements
+    SpanBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomSpanBuilder(DomBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomStyleBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomStyleBuilder.java
new file mode 100644
index 0000000..e68a397
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomStyleBuilder.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.StyleBuilder;
+import com.google.gwt.dom.client.StyleElement;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * DOM-based implementation of {@link StyleBuilder}.
+ */
+public class DomStyleBuilder extends DomElementBuilderBase<StyleBuilder, StyleElement> implements
+    StyleBuilder {
+
+  DomStyleBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public StyleBuilder cssText(String cssText) {
+    assertCanAddAttribute().setCssText(cssText);
+    /*
+     * The HTML version appends text inline, so we prevent additional attributes
+     * after setting the text.
+     */
+    getDelegate().lockCurrentElement();
+    return this;
+  }
+
+  @Override
+  public StyleBuilder disabled() {
+    assertCanAddAttribute().setDisabled(true);
+    return this;
+  }
+
+  @Override
+  public StyleBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public boolean isChildElementSupported() {
+    return false;
+  }
+
+  @Override
+  public StyleBuilder media(String media) {
+    assertCanAddAttribute().setMedia(media);
+    return this;
+  }
+
+  @Override
+  public StyleBuilder text(String text) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public StyleBuilder type(String type) {
+    assertCanAddAttribute().setType(type);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomTableBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomTableBuilder.java
new file mode 100644
index 0000000..18286ce
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomTableBuilder.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.TableBuilder;
+import com.google.gwt.dom.client.TableElement;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * DOM-based implementation of {@link TableBuilder}.
+ */
+public class DomTableBuilder extends DomElementBuilderBase<TableBuilder, TableElement> implements
+    TableBuilder {
+
+  DomTableBuilder(DomBuilderImpl delegate) {
+    super(delegate, false);
+  }
+
+  @Override
+  public TableBuilder border(int border) {
+    assertCanAddAttribute().setBorder(border);
+    return this;
+  }
+
+  @Override
+  public TableBuilder cellPadding(int cellPadding) {
+    assertCanAddAttribute().setCellPadding(cellPadding);
+    return this;
+  }
+
+  @Override
+  public TableBuilder cellSpacing(int cellSpacing) {
+    assertCanAddAttribute().setCellSpacing(cellSpacing);
+    return this;
+  }
+
+  @Override
+  public TableBuilder frame(String frame) {
+    assertCanAddAttribute().setFrame(frame);
+    return this;
+  }
+
+  @Override
+  public TableBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableBuilder rules(String rules) {
+    assertCanAddAttribute().setRules(rules);
+    return this;
+  }
+
+  @Override
+  public TableBuilder text(String text) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableBuilder width(String width) {
+    assertCanAddAttribute().setWidth(width);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomTableCaptionBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomTableCaptionBuilder.java
new file mode 100644
index 0000000..f31b897
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomTableCaptionBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.TableCaptionBuilder;
+import com.google.gwt.dom.client.TableCaptionElement;
+
+/**
+ * DOM-based implementation of {@link TableCaptionBuilder}.
+ */
+public class DomTableCaptionBuilder extends
+    DomElementBuilderBase<TableCaptionBuilder, TableCaptionElement> implements TableCaptionBuilder {
+
+  DomTableCaptionBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomTableCellBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomTableCellBuilder.java
new file mode 100644
index 0000000..74a9bb7
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomTableCellBuilder.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.TableCellBuilder;
+import com.google.gwt.dom.client.TableCellElement;
+
+/**
+ * DOM-based implementation of {@link TableCellBuilder}.
+ */
+public class DomTableCellBuilder extends DomElementBuilderBase<TableCellBuilder, TableCellElement>
+    implements TableCellBuilder {
+
+  DomTableCellBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public TableCellBuilder align(String align) {
+    assertCanAddAttribute().setAlign(align);
+    return this;
+  }
+
+  @Override
+  public TableCellBuilder ch(String ch) {
+    assertCanAddAttribute().setCh(ch);
+    return this;
+  }
+
+  @Override
+  public TableCellBuilder chOff(String chOff) {
+    assertCanAddAttribute().setChOff(chOff);
+    return this;
+  }
+
+  @Override
+  public TableCellBuilder colSpan(int colSpan) {
+    assertCanAddAttribute().setColSpan(colSpan);
+    return this;
+  }
+
+  @Override
+  public TableCellBuilder headers(String headers) {
+    assertCanAddAttribute().setHeaders(headers);
+    return this;
+  }
+
+  @Override
+  public TableCellBuilder rowSpan(int rowSpan) {
+    assertCanAddAttribute().setRowSpan(rowSpan);
+    return this;
+  }
+
+  @Override
+  public TableCellBuilder vAlign(String vAlign) {
+    assertCanAddAttribute().setVAlign(vAlign);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomTableColBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomTableColBuilder.java
new file mode 100644
index 0000000..15a1aa1
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomTableColBuilder.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.TableColBuilder;
+import com.google.gwt.dom.client.TableColElement;
+
+/**
+ * DOM-based implementation of {@link TableColBuilder}.
+ */
+public class DomTableColBuilder extends DomElementBuilderBase<TableColBuilder, TableColElement>
+    implements TableColBuilder {
+
+  DomTableColBuilder(DomBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public TableColBuilder align(String align) {
+    assertCanAddAttribute().setAlign(align);
+    return this;
+  }
+
+  @Override
+  public TableColBuilder ch(String ch) {
+    assertCanAddAttribute().setCh(ch);
+    return this;
+  }
+
+  @Override
+  public TableColBuilder chOff(String chOff) {
+    assertCanAddAttribute().setChOff(chOff);
+    return this;
+  }
+
+  @Override
+  public TableColBuilder span(int span) {
+    assertCanAddAttribute().setSpan(span);
+    return this;
+  }
+
+  @Override
+  public TableColBuilder vAlign(String vAlign) {
+    assertCanAddAttribute().setVAlign(vAlign);
+    return this;
+  }
+
+  @Override
+  public TableColBuilder width(String width) {
+    assertCanAddAttribute().setWidth(width);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomTableRowBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomTableRowBuilder.java
new file mode 100644
index 0000000..5d8bc25
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomTableRowBuilder.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.TableRowBuilder;
+import com.google.gwt.dom.client.TableRowElement;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * DOM-based implementation of {@link TableRowBuilder}.
+ */
+public class DomTableRowBuilder extends DomElementBuilderBase<TableRowBuilder, TableRowElement>
+    implements TableRowBuilder {
+
+  DomTableRowBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public TableRowBuilder align(String align) {
+    assertCanAddAttribute().setAlign(align);
+    return this;
+  }
+
+  @Override
+  public TableRowBuilder ch(String ch) {
+    assertCanAddAttribute().setCh(ch);
+    return this;
+  }
+
+  @Override
+  public TableRowBuilder chOff(String chOff) {
+    assertCanAddAttribute().setChOff(chOff);
+    return this;
+  }
+
+  @Override
+  public TableRowBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableRowBuilder text(String text) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableRowBuilder vAlign(String vAlign) {
+    assertCanAddAttribute().setVAlign(vAlign);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomTableSectionBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomTableSectionBuilder.java
new file mode 100644
index 0000000..c5b384e
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomTableSectionBuilder.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.TableSectionBuilder;
+import com.google.gwt.dom.client.TableSectionElement;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * DOM-based implementation of {@link TableSectionBuilder}.
+ */
+public class DomTableSectionBuilder extends
+    DomElementBuilderBase<TableSectionBuilder, TableSectionElement> implements TableSectionBuilder {
+
+  DomTableSectionBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public TableSectionBuilder align(String align) {
+    assertCanAddAttribute().setAlign(align);
+    return this;
+  }
+
+  @Override
+  public TableSectionBuilder ch(String ch) {
+    assertCanAddAttribute().setCh(ch);
+    return this;
+  }
+
+  @Override
+  public TableSectionBuilder chOff(String chOff) {
+    assertCanAddAttribute().setChOff(chOff);
+    return this;
+  }
+
+  @Override
+  public TableSectionBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableSectionBuilder text(String text) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableSectionBuilder vAlign(String vAlign) {
+    assertCanAddAttribute().setVAlign(vAlign);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/client/DomTextAreaBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomTextAreaBuilder.java
new file mode 100644
index 0000000..68e503f
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomTextAreaBuilder.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.TextAreaBuilder;
+import com.google.gwt.dom.client.TextAreaElement;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * DOM-based implementation of {@link TextAreaBuilder}.
+ */
+public class DomTextAreaBuilder extends DomElementBuilderBase<TextAreaBuilder, TextAreaElement>
+    implements TextAreaBuilder {
+
+  DomTextAreaBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public TextAreaBuilder accessKey(String accessKey) {
+    assertCanAddAttribute().setAccessKey(accessKey);
+    return this;
+  }
+
+  @Override
+  public TextAreaBuilder cols(int cols) {
+    assertCanAddAttribute().setCols(cols);
+    return this;
+  }
+
+  @Override
+  public TextAreaBuilder defaultValue(String defaultValue) {
+    assertCanAddAttribute().setDefaultValue(defaultValue);
+    return this;
+  }
+
+  @Override
+  public TextAreaBuilder disabled() {
+    assertCanAddAttribute().setDisabled(true);
+    return this;
+  }
+
+  @Override
+  public TextAreaBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public boolean isChildElementSupported() {
+    return false;
+  }
+
+  @Override
+  public TextAreaBuilder name(String name) {
+    assertCanAddAttribute().setName(name);
+    return this;
+  }
+
+  @Override
+  public TextAreaBuilder readOnly() {
+    assertCanAddAttribute().setReadOnly(true);
+    return this;
+  }
+
+  @Override
+  public TextAreaBuilder rows(int rows) {
+    assertCanAddAttribute().setRows(rows);
+    return this;
+  }
+
+  @Override
+  public TextAreaBuilder value(String value) {
+    assertCanAddAttribute().setValue(value);
+    return this;
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/client/DomUListBuilder.java
similarity index 60%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/client/DomUListBuilder.java
index e49c505..2742019 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomUListBuilder.java
@@ -13,15 +13,18 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.UListBuilder;
+import com.google.gwt.dom.client.UListElement;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * DOM-based implementation of {@link UListBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class DomUListBuilder extends DomElementBuilderBase<UListBuilder, UListElement> implements
+    UListBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  DomUListBuilder(DomBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/client/DomVideoBuilder.java b/user/src/com/google/gwt/dom/builder/client/DomVideoBuilder.java
new file mode 100644
index 0000000..78ec3ed
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/client/DomVideoBuilder.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.VideoBuilder;
+import com.google.gwt.dom.client.VideoElement;
+
+/**
+ * DOM-based implementation of {@link VideoBuilder}.
+ */
+public class DomVideoBuilder extends DomMediaBuilderBase<VideoBuilder, VideoElement> implements
+    VideoBuilder {
+
+  DomVideoBuilder(DomBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public VideoBuilder height(int height) {
+    assertCanAddAttribute().setHeight(height);
+    return this;
+  }
+
+  @Override
+  public VideoBuilder poster(String url) {
+    assertCanAddAttribute().setPoster(url);
+    return this;
+  }
+
+  @Override
+  public VideoBuilder width(int width) {
+    assertCanAddAttribute().setWidth(width);
+    return this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/AbstractElementBuilderBase.java b/user/src/com/google/gwt/dom/builder/shared/AbstractElementBuilderBase.java
new file mode 100644
index 0000000..d212f8f
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/AbstractElementBuilderBase.java
@@ -0,0 +1,494 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.dom.client.AnchorElement;
+import com.google.gwt.dom.client.AreaElement;
+import com.google.gwt.dom.client.AudioElement;
+import com.google.gwt.dom.client.BRElement;
+import com.google.gwt.dom.client.BaseElement;
+import com.google.gwt.dom.client.BodyElement;
+import com.google.gwt.dom.client.ButtonElement;
+import com.google.gwt.dom.client.CanvasElement;
+import com.google.gwt.dom.client.DListElement;
+import com.google.gwt.dom.client.DivElement;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.FieldSetElement;
+import com.google.gwt.dom.client.FormElement;
+import com.google.gwt.dom.client.FrameElement;
+import com.google.gwt.dom.client.FrameSetElement;
+import com.google.gwt.dom.client.HRElement;
+import com.google.gwt.dom.client.HeadElement;
+import com.google.gwt.dom.client.HeadingElement;
+import com.google.gwt.dom.client.IFrameElement;
+import com.google.gwt.dom.client.ImageElement;
+import com.google.gwt.dom.client.InputElement;
+import com.google.gwt.dom.client.LIElement;
+import com.google.gwt.dom.client.LabelElement;
+import com.google.gwt.dom.client.LegendElement;
+import com.google.gwt.dom.client.LinkElement;
+import com.google.gwt.dom.client.MapElement;
+import com.google.gwt.dom.client.MetaElement;
+import com.google.gwt.dom.client.OListElement;
+import com.google.gwt.dom.client.OptGroupElement;
+import com.google.gwt.dom.client.OptionElement;
+import com.google.gwt.dom.client.ParagraphElement;
+import com.google.gwt.dom.client.ParamElement;
+import com.google.gwt.dom.client.PreElement;
+import com.google.gwt.dom.client.QuoteElement;
+import com.google.gwt.dom.client.ScriptElement;
+import com.google.gwt.dom.client.SelectElement;
+import com.google.gwt.dom.client.SourceElement;
+import com.google.gwt.dom.client.SpanElement;
+import com.google.gwt.dom.client.StyleElement;
+import com.google.gwt.dom.client.TableCaptionElement;
+import com.google.gwt.dom.client.TableCellElement;
+import com.google.gwt.dom.client.TableColElement;
+import com.google.gwt.dom.client.TableElement;
+import com.google.gwt.dom.client.TableRowElement;
+import com.google.gwt.dom.client.TableSectionElement;
+import com.google.gwt.dom.client.TextAreaElement;
+import com.google.gwt.dom.client.UListElement;
+import com.google.gwt.dom.client.VideoElement;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * Abstract base class for implementations of {@link ElementBuilderBase}.
+ * 
+ * <p>
+ * Subclasses of {@link AbstractElementBuilderBase} act as typed wrappers around
+ * a shared implementation that handles the actual building. The wrappers merely
+ * delegate to the shared implementation, so wrapper instances can be reused,
+ * avoiding object creation. This approach is necessary so that the return value
+ * of common methods, such as {@link #id(String)}, return a typed builder
+ * instead of the generic {@link ElementBuilderBase}.
+ * </p>
+ * 
+ * @param <R> the builder type returned from build methods
+ */
+public abstract class AbstractElementBuilderBase<R extends ElementBuilderBase<?>> implements
+    ElementBuilderBase<R> {
+
+  private final ElementBuilderImpl delegate;
+  private final boolean isEndTagForbidden;
+
+  protected AbstractElementBuilderBase(ElementBuilderImpl delegate, boolean isEndTagForbidden) {
+    this.delegate = delegate;
+    this.isEndTagForbidden = isEndTagForbidden;
+  }
+
+  @Override
+  public R attribute(String name, int value) {
+    return attribute(name, String.valueOf(value));
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B end() {
+    // An explicit cast is required to satisfy some javac compilers.
+    return (B) delegate.end();
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B end(String tagName) {
+    return (B) delegate.end(tagName);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endAnchor() {
+    return (B) end(AnchorElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endArea() {
+    return (B) end(AreaElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endAudio() {
+    return (B) end(AudioElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endBase() {
+    return (B) end(BaseElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endBlockQuote() {
+    return (B) end(QuoteElement.TAG_BLOCKQUOTE);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endBody() {
+    return (B) end(BodyElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endBR() {
+    return (B) end(BRElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endButton() {
+    return (B) end(ButtonElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endCanvas() {
+    return (B) end(CanvasElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endCol() {
+    return (B) end(TableColElement.TAG_COL);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endColGroup() {
+    return (B) end(TableColElement.TAG_COLGROUP);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endDiv() {
+    return (B) end(DivElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endDList() {
+    return (B) end(DListElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endFieldSet() {
+    return (B) end(FieldSetElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endForm() {
+    return (B) end(FormElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endFrame() {
+    return (B) end(FrameElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endFrameSet() {
+    return (B) end(FrameSetElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endH1() {
+    return (B) end(HeadingElement.TAG_H1);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endH2() {
+    return (B) end(HeadingElement.TAG_H2);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endH3() {
+    return (B) end(HeadingElement.TAG_H3);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endH4() {
+    return (B) end(HeadingElement.TAG_H4);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endH5() {
+    return (B) end(HeadingElement.TAG_H5);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endH6() {
+    return (B) end(HeadingElement.TAG_H6);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endHead() {
+    return (B) end(HeadElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endHR() {
+    return (B) end(HRElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endIFrame() {
+    return (B) end(IFrameElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endImage() {
+    return (B) end(ImageElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endInput() {
+    return (B) end(InputElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endLabel() {
+    return (B) end(LabelElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endLegend() {
+    return (B) end(LegendElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endLI() {
+    return (B) end(LIElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endLink() {
+    return (B) end(LinkElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endMap() {
+    return (B) end(MapElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endMeta() {
+    return (B) end(MetaElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endOList() {
+    return (B) end(OListElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endOptGroup() {
+    return (B) end(OptGroupElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endOption() {
+    return (B) end(OptionElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endParagraph() {
+    return (B) end(ParagraphElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endParam() {
+    return (B) end(ParamElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endPre() {
+    return (B) end(PreElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endQuote() {
+    return (B) end(QuoteElement.TAG_Q);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endScript() {
+    return (B) end(ScriptElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endSelect() {
+    return (B) end(SelectElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endSource() {
+    return (B) end(SourceElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endSpan() {
+    return (B) end(SpanElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endStyle() {
+    return (B) end(StyleElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endTable() {
+    return (B) end(TableElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endTableCaption() {
+    return (B) end(TableCaptionElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endTBody() {
+    return (B) end(TableSectionElement.TAG_TBODY);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endTD() {
+    return (B) end(TableCellElement.TAG_TD);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endTextArea() {
+    return (B) end(TextAreaElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endTFoot() {
+    return (B) end(TableSectionElement.TAG_TFOOT);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endTH() {
+    return (B) end(TableCellElement.TAG_TH);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endTHead() {
+    return (B) end(TableSectionElement.TAG_THEAD);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endTR() {
+    return (B) end(TableRowElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endUList() {
+    return (B) end(UListElement.TAG);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <B extends ElementBuilderBase<?>> B endVideo() {
+    return (B) end(VideoElement.TAG);
+  }
+
+  @Override
+  public Element finish() {
+    return delegate.finish();
+  }
+
+  @Override
+  public R html(SafeHtml html) {
+    delegate.html(html);
+    return getReturnBuilder();
+  }
+
+  @Override
+  public boolean isChildElementSupported() {
+    return !isEndTagForbidden;
+  }
+
+  @Override
+  public boolean isEndTagForbidden() {
+    return isEndTagForbidden;
+  }
+
+  @Override
+  public StylesBuilder style() {
+    return delegate.style();
+  }
+
+  @Override
+  public R text(String text) {
+    delegate.text(text);
+    return getReturnBuilder();
+  }
+
+  /**
+   * Get the builder to return from build methods.
+   * 
+   * @return the return builder
+   */
+  @SuppressWarnings("unchecked")
+  protected R getReturnBuilder() {
+    return (R) this;
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/AnchorBuilder.java b/user/src/com/google/gwt/dom/builder/shared/AnchorBuilder.java
new file mode 100644
index 0000000..f26ad97
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/AnchorBuilder.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an anchor element.
+ */
+public interface AnchorBuilder extends ElementBuilderBase<AnchorBuilder> {
+
+  /**
+   * A single character access key to give access to the form control.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-accesskey">W3C
+   *      HTML Specification</a>
+   */
+  AnchorBuilder accessKey(String accessKey);
+
+  /**
+   * The absolute URI of the linked resource.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-href">W3C
+   *      HTML Specification</a>
+   */
+  AnchorBuilder href(String href);
+
+  /**
+   * Language code of the linked resource.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-hreflang">W3C
+   *      HTML Specification</a>
+   */
+  AnchorBuilder hreflang(String hreflang);
+
+  /**
+   * Anchor name.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-name-A">W3C
+   *      HTML Specification</a>
+   */
+  AnchorBuilder name(String name);
+
+  /**
+   * Forward link type.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-rel">W3C
+   *      HTML Specification</a>
+   */
+  AnchorBuilder rel(String rel);
+
+  /**
+   * Frame to render the resource in.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-target">W3C
+   *      HTML Specification</a>
+   */
+  AnchorBuilder target(String target);
+
+  /**
+   * Advisory content type.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-type-A">W3C
+   *      HTML Specification</a>
+   */
+  AnchorBuilder type(String type);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/AreaBuilder.java b/user/src/com/google/gwt/dom/builder/shared/AreaBuilder.java
new file mode 100644
index 0000000..3095dbc
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/AreaBuilder.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an area element.
+ */
+public interface AreaBuilder extends ElementBuilderBase<AreaBuilder> {
+
+  /**
+   * A single character access key to give access to the form control.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-accesskey">W3C
+   *      HTML Specification</a>
+   */
+  AreaBuilder accessKey(String accessKey);
+
+  /**
+   * Alternate text for user agents not rendering the normal content of this
+   * element.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-alt">W3C
+   *      HTML Specification</a>
+   */
+  AreaBuilder alt(String alt);
+
+  /**
+   * Comma-separated list of lengths, defining an active region geometry. See
+   * also shape for the shape of the region.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-coords">W3C
+   *      HTML Specification</a>
+   */
+  AreaBuilder coords(String coords);
+
+  /**
+   * The URI of the linked resource.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-href">W3C
+   *      HTML Specification</a>
+   */
+  AreaBuilder href(String href);
+
+  /**
+   * The shape of the active area. The coordinates are given by coords.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-shape">W3C
+   *      HTML Specification</a>
+   */
+  AreaBuilder shape(String shape);
+
+  /**
+   * Frame to render the resource in.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-target">W3C
+   *      HTML Specification</a>
+   */
+  AreaBuilder target(String target);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/AudioBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/AudioBuilder.java
index e49c505..1a512f5 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/AudioBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an audio element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface AudioBuilder extends MediaBuilder<AudioBuilder> {
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/BRBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/BRBuilder.java
index e49c505..96774a1 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/BRBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an br element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface BRBuilder extends ElementBuilderBase<BRBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/BaseBuilder.java b/user/src/com/google/gwt/dom/builder/shared/BaseBuilder.java
new file mode 100644
index 0000000..5bbb90b
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/BaseBuilder.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an base element.
+ */
+public interface BaseBuilder extends ElementBuilderBase<BaseBuilder> {
+
+  /**
+   * The base URI See the href attribute definition in HTML 4.01.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-href-BASE">W3C
+   *      HTML Specification</a>
+   */
+  BaseBuilder href(String href);
+
+  /**
+   * The default target frame.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-target">W3C
+   *      HTML Specification</a>
+   */
+  BaseBuilder target(String target);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/BodyBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/BodyBuilder.java
index e49c505..21cc6ef 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/BodyBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an body element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface BodyBuilder extends ElementBuilderBase<BodyBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/ButtonBuilder.java b/user/src/com/google/gwt/dom/builder/shared/ButtonBuilder.java
new file mode 100644
index 0000000..81f80b2
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/ButtonBuilder.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an button element.
+ */
+public interface ButtonBuilder extends ElementBuilderBase<ButtonBuilder> {
+
+  /**
+   * A single character access key to give access to the form control.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-accesskey">W3C
+   *      HTML Specification</a>
+   */
+  ButtonBuilder accessKey(String accessKey);
+
+  /**
+   * Prevents the user from selecting this button.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-disabled">W3C
+   *      HTML Specification</a>
+   */
+  ButtonBuilder disabled();
+
+  /**
+   * Form control or object name when submitted with a form.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-name-BUTTON">W3C
+   *      HTML Specification</a>
+   */
+  ButtonBuilder name(String name);
+
+  /**
+   * The current form control value.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-value-BUTTON">W3C
+   *      HTML Specification</a>
+   */
+  ButtonBuilder value(String value);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/CanvasBuilder.java
similarity index 63%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/CanvasBuilder.java
index e49c505..e6104a6 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/CanvasBuilder.java
@@ -16,12 +16,21 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an canvas element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public interface CanvasBuilder extends ElementBuilderBase<CanvasBuilder> {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+  /**
+   * Sets the height of the canvas.
+   * 
+   * @param height the height, in pixels
+   */
+  CanvasBuilder height(int height);
+
+  /**
+   * Sets the width of the canvas.
+   * 
+   * @param width the width, in pixels
+   */
+  CanvasBuilder width(int width);
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/DListBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/DListBuilder.java
index e49c505..7c0ec7a 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/DListBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an definition list element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface DListBuilder extends ElementBuilderBase<DListBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/ElementBuilderBase.java b/user/src/com/google/gwt/dom/builder/shared/ElementBuilderBase.java
index 9797326..498159d 100644
--- a/user/src/com/google/gwt/dom/builder/shared/ElementBuilderBase.java
+++ b/user/src/com/google/gwt/dom/builder/shared/ElementBuilderBase.java
@@ -127,6 +127,149 @@
    *           specified class
    * @see #end()
    */
+  <B extends ElementBuilderBase<?>> B endAnchor();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endArea();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endAudio();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endBase();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endBlockQuote();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endBody();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endBR();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endButton();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endCanvas();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endCol();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endColGroup();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
   <B extends ElementBuilderBase<?>> B endDiv();
 
   /**
@@ -140,6 +283,318 @@
    *           specified class
    * @see #end()
    */
+  <B extends ElementBuilderBase<?>> B endDList();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endFieldSet();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endForm();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endFrame();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endFrameSet();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endH1();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endH2();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endH3();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endH4();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endH5();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endH6();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endHead();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endHR();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endIFrame();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endImage();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endInput();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endLabel();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endLegend();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endLI();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endLink();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endMap();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endMeta();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endOList();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endOptGroup();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
   <B extends ElementBuilderBase<?>> B endOption();
 
   /**
@@ -153,9 +608,256 @@
    *           specified class
    * @see #end()
    */
+  <B extends ElementBuilderBase<?>> B endParagraph();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endParam();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endPre();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endQuote();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endScript();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
   <B extends ElementBuilderBase<?>> B endSelect();
 
   /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endSource();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endSpan();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endStyle();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endTable();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endTableCaption();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endTBody();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endTD();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endTextArea();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endTFoot();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endTH();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endTHead();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endTR();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endUList();
+
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
+  <B extends ElementBuilderBase<?>> B endVideo();
+
+  /**
    * Return the built DOM as an {@link Element}.
    * 
    * <p>
@@ -188,6 +890,22 @@
   T id(String id);
 
   /**
+   * Check if child elements are supported.
+   * 
+   * @return true if supported, false if not.
+   */
+  boolean isChildElementSupported();
+
+  /**
+   * Check if an end tag is forbidden for this element. If the end tag is
+   * forbidden, then setting inner html or text or appending an element will
+   * trigger an {@link UnsupportedOperationException}.
+   * 
+   * @return true if forbidden, false if not
+   */
+  boolean isEndTagForbidden();
+
+  /**
    * Language code defined in RFC 1766.
    * 
    * @return this builder
@@ -195,6 +913,90 @@
   T lang(String lang);
 
   /**
+   * Append a anchor element.
+   * 
+   * @return the builder for the new element
+   */
+  AnchorBuilder startAnchor();
+
+  /**
+   * Append a area element.
+   * 
+   * @return the builder for the new element
+   */
+  AreaBuilder startArea();
+
+  /**
+   * Append a audio element.
+   * 
+   * @return the builder for the new element
+   */
+  AudioBuilder startAudio();
+
+  /**
+   * Append a base element.
+   * 
+   * @return the builder for the new element
+   */
+  BaseBuilder startBase();
+
+  /**
+   * Append a block quote element.
+   * 
+   * @return the builder for the new element
+   */
+  QuoteBuilder startBlockQuote();
+
+  /**
+   * Append a body element.
+   * 
+   * @return the builder for the new element
+   */
+  BodyBuilder startBody();
+
+  /**
+   * Append a br element.
+   * 
+   * @return the builder for the new element
+   */
+  BRBuilder startBR();
+
+  /**
+   * Append an &lt;input type='button'&gt; element.
+   * 
+   * @return the builder for the new element
+   */
+  InputBuilder startButtonInput();
+
+  /**
+   * Append a canvas element.
+   * 
+   * @return the builder for the new element
+   */
+  CanvasBuilder startCanvas();
+
+  /**
+   * Append an &lt;input type='check'&gt; element.
+   * 
+   * @return the builder for the new element
+   */
+  InputBuilder startCheckInput();
+
+  /**
+   * Append a tablecol element.
+   * 
+   * @return the builder for the new element
+   */
+  TableColBuilder startCol();
+
+  /**
+   * Append a tablecol element.
+   * 
+   * @return the builder for the new element
+   */
+  TableColBuilder startColGroup();
+
+  /**
    * Append a div element.
    * 
    * @return the builder for the new element
@@ -202,6 +1004,188 @@
   DivBuilder startDiv();
 
   /**
+   * Append a dlist element.
+   * 
+   * @return the builder for the new element
+   */
+  DListBuilder startDList();
+
+  /**
+   * Append a fieldset element.
+   * 
+   * @return the builder for the new element
+   */
+  FieldSetBuilder startFieldSet();
+
+  /**
+   * Append an &lt;input type='file'&gt; element.
+   * 
+   * @return the builder for the new element
+   */
+  InputBuilder startFileInput();
+
+  /**
+   * Append a form element.
+   * 
+   * @return the builder for the new element
+   */
+  FormBuilder startForm();
+
+  /**
+   * Append a frame element.
+   * 
+   * @return the builder for the new element
+   */
+  FrameBuilder startFrame();
+
+  /**
+   * Append a frameset element.
+   * 
+   * @return the builder for the new element
+   */
+  FrameSetBuilder startFrameSet();
+
+  /**
+   * Append a heading element.
+   * 
+   * @return the builder for the new element
+   */
+  HeadingBuilder startH1();
+
+  /**
+   * Append a heading element.
+   * 
+   * @return the builder for the new element
+   */
+  HeadingBuilder startH2();
+
+  /**
+   * Append a heading element.
+   * 
+   * @return the builder for the new element
+   */
+  HeadingBuilder startH3();
+
+  /**
+   * Append a heading element.
+   * 
+   * @return the builder for the new element
+   */
+  HeadingBuilder startH4();
+
+  /**
+   * Append a heading element.
+   * 
+   * @return the builder for the new element
+   */
+  HeadingBuilder startH5();
+
+  /**
+   * Append a heading element.
+   * 
+   * @return the builder for the new element
+   */
+  HeadingBuilder startH6();
+
+  /**
+   * Append a head element.
+   * 
+   * @return the builder for the new element
+   */
+  HeadBuilder startHead();
+
+  /**
+   * Append an &lt;input type='hidden'&gt; element.
+   * 
+   * @return the builder for the new element
+   */
+  InputBuilder startHiddenInput();
+
+  /**
+   * Append a hr element.
+   * 
+   * @return the builder for the new element
+   */
+  HRBuilder startHR();
+
+  /**
+   * Append a iframe element.
+   * 
+   * @return the builder for the new element
+   */
+  IFrameBuilder startIFrame();
+
+  /**
+   * Append a image element.
+   * 
+   * @return the builder for the new element
+   */
+  ImageBuilder startImage();
+
+  /**
+   * Append an &lt;input type='image'&gt; element.
+   * 
+   * @return the builder for the new element
+   */
+  InputBuilder startImageInput();
+
+  /**
+   * Append a label element.
+   * 
+   * @return the builder for the new element
+   */
+  LabelBuilder startLabel();
+
+  /**
+   * Append a legend element.
+   * 
+   * @return the builder for the new element
+   */
+  LegendBuilder startLegend();
+
+  /**
+   * Append a li element.
+   * 
+   * @return the builder for the new element
+   */
+  LIBuilder startLI();
+
+  /**
+   * Append a link element.
+   * 
+   * @return the builder for the new element
+   */
+  LinkBuilder startLink();
+
+  /**
+   * Append a map element.
+   * 
+   * @return the builder for the new element
+   */
+  MapBuilder startMap();
+
+  /**
+   * Append a meta element.
+   * 
+   * @return the builder for the new element
+   */
+  MetaBuilder startMeta();
+
+  /**
+   * Append a olist element.
+   * 
+   * @return the builder for the new element
+   */
+  OListBuilder startOList();
+
+  /**
+   * Append a optgroup element.
+   * 
+   * @return the builder for the new element
+   */
+  OptGroupBuilder startOptGroup();
+
+  /**
    * Append an option element.
    * 
    * @return the builder for the new element
@@ -209,6 +1193,77 @@
   OptionBuilder startOption();
 
   /**
+   * Append a paragraph element.
+   * 
+   * @return the builder for the new element
+   */
+  ParagraphBuilder startParagraph();
+
+  /**
+   * Append a param element.
+   * 
+   * @return the builder for the new element
+   */
+  ParamBuilder startParam();
+
+  /**
+   * Append an &lt;input type='password'&gt; element.
+   * 
+   * @return the builder for the new element
+   */
+  InputBuilder startPasswordInput();
+
+  /**
+   * Append a pre element.
+   * 
+   * @return the builder for the new element
+   */
+  PreBuilder startPre();
+
+  /**
+   * Append a button element with type "button".
+   * 
+   * @return the builder for the new element
+   */
+  ButtonBuilder startPushButton();
+
+  /**
+   * Append a quote element.
+   * 
+   * @return the builder for the new element
+   */
+  QuoteBuilder startQuote();
+
+  /**
+   * Append an &lt;input type='radio'&gt; element.
+   * 
+   * @param name name the name of the radio input (used for grouping)
+   * @return the builder for the new element
+   */
+  InputBuilder startRadioInput(String name);
+
+  /**
+   * Append a button element with type "reset".
+   * 
+   * @return the builder for the new element
+   */
+  ButtonBuilder startResetButton();
+
+  /**
+   * Append an &lt;input type='reset'&gt; element.
+   * 
+   * @return the builder for the new element
+   */
+  InputBuilder startResetInput();
+
+  /**
+   * Append a script element.
+   * 
+   * @return the builder for the new element
+   */
+  ScriptBuilder startScript();
+
+  /**
    * Append a select element.
    * 
    * @return the builder for the new element
@@ -216,6 +1271,125 @@
   SelectBuilder startSelect();
 
   /**
+   * Append a source element.
+   * 
+   * @return the builder for the new element
+   */
+  SourceBuilder startSource();
+
+  /**
+   * Append a span element.
+   * 
+   * @return the builder for the new element
+   */
+  SpanBuilder startSpan();
+
+  /**
+   * Append a style element.
+   * 
+   * @return the builder for the new element
+   */
+  StyleBuilder startStyle();
+
+  /**
+   * Append a button element with type "submit".
+   * 
+   * @return the builder for the new element
+   */
+  ButtonBuilder startSubmitButton();
+
+  /**
+   * Append an &lt;input type='submit'&gt; element.
+   * 
+   * @return the builder for the new element
+   */
+  InputBuilder startSubmitInput();
+
+  /**
+   * Append a table element.
+   * 
+   * @return the builder for the new element
+   */
+  TableBuilder startTable();
+
+  /**
+   * Append a table caption element.
+   * 
+   * @return the builder for the new element
+   */
+  TableCaptionBuilder startTableCaption();
+
+  /**
+   * Append a tbody element.
+   * 
+   * @return the builder for the new element
+   */
+  TableSectionBuilder startTBody();
+
+  /**
+   * Append a td element.
+   * 
+   * @return the builder for the new element
+   */
+  TableCellBuilder startTD();
+
+  /**
+   * Append a textarea element.
+   * 
+   * @return the builder for the new element
+   */
+  TextAreaBuilder startTextArea();
+
+  /**
+   * Append an &lt;input type='text'&gt; element.
+   * 
+   * @return the builder for the new element
+   */
+  InputBuilder startTextInput();
+
+  /**
+   * Append a tfoot element.
+   * 
+   * @return the builder for the new element
+   */
+  TableSectionBuilder startTFoot();
+
+  /**
+   * Append a th element.
+   * 
+   * @return the builder for the new element
+   */
+  TableCellBuilder startTH();
+
+  /**
+   * Append a thead element.
+   * 
+   * @return the builder for the new element
+   */
+  TableSectionBuilder startTHead();
+
+  /**
+   * Append a tablerow element.
+   * 
+   * @return the builder for the new element
+   */
+  TableRowBuilder startTR();
+
+  /**
+   * Append a ulist element.
+   * 
+   * @return the builder for the new element
+   */
+  UListBuilder startUList();
+
+  /**
+   * Append a video element.
+   * 
+   * @return the builder for the new element
+   */
+  VideoBuilder startVideo();
+
+  /**
    * Start the {@link StylesBuilder} used to add style properties to the style
    * attribute of the current element.
    * 
diff --git a/user/src/com/google/gwt/dom/builder/shared/ElementBuilderFactory.java b/user/src/com/google/gwt/dom/builder/shared/ElementBuilderFactory.java
index 4126a2d..28d396b 100644
--- a/user/src/com/google/gwt/dom/builder/shared/ElementBuilderFactory.java
+++ b/user/src/com/google/gwt/dom/builder/shared/ElementBuilderFactory.java
@@ -117,12 +117,148 @@
   protected ElementBuilderFactory() {
   }
 
+  public abstract AnchorBuilder createAnchorBuilder();
+
+  public abstract AreaBuilder createAreaBuilder();
+
+  public abstract AudioBuilder createAudioBuilder();
+
+  public abstract BaseBuilder createBaseBuilder();
+
+  public abstract QuoteBuilder createBlockQuoteBuilder();
+
+  public abstract BodyBuilder createBodyBuilder();
+
+  public abstract BRBuilder createBRBuilder();
+
+  public abstract InputBuilder createButtonInputBuilder();
+
+  public abstract CanvasBuilder createCanvasBuilder();
+
+  public abstract InputBuilder createCheckInputBuilder();
+
+  public abstract TableColBuilder createColBuilder();
+
+  public abstract TableColBuilder createColGroupBuilder();
+
   public abstract DivBuilder createDivBuilder();
 
+  public abstract DListBuilder createDListBuilder();
+
+  public abstract FieldSetBuilder createFieldSetBuilder();
+
+  public abstract InputBuilder createFileInputBuilder();
+
+  public abstract FormBuilder createFormBuilder();
+
+  public abstract FrameBuilder createFrameBuilder();
+
+  public abstract FrameSetBuilder createFrameSetBuilder();
+
+  public abstract HeadingBuilder createH1Builder();
+
+  public abstract HeadingBuilder createH2Builder();
+
+  public abstract HeadingBuilder createH3Builder();
+
+  public abstract HeadingBuilder createH4Builder();
+
+  public abstract HeadingBuilder createH5Builder();
+
+  public abstract HeadingBuilder createH6Builder();
+
+  public abstract HeadBuilder createHeadBuilder();
+
+  public abstract InputBuilder createHiddenInputBuilder();
+
+  public abstract HRBuilder createHRBuilder();
+
+  public abstract IFrameBuilder createIFrameBuilder();
+
+  public abstract ImageBuilder createImageBuilder();
+
+  public abstract InputBuilder createImageInputBuilder();
+
+  public abstract LabelBuilder createLabelBuilder();
+
+  public abstract LegendBuilder createLegendBuilder();
+
+  public abstract LIBuilder createLIBuilder();
+
+  public abstract LinkBuilder createLinkBuilder();
+
+  public abstract MapBuilder createMapBuilder();
+
+  public abstract MetaBuilder createMetaBuilder();
+
+  public abstract OListBuilder createOListBuilder();
+
+  public abstract OptGroupBuilder createOptGroupBuilder();
+
   public abstract OptionBuilder createOptionBuilder();
 
+  public abstract ParagraphBuilder createParagraphBuilder();
+
+  public abstract ParamBuilder createParamBuilder();
+
+  public abstract InputBuilder createPasswordInputBuilder();
+
+  public abstract PreBuilder createPreBuilder();
+
+  public abstract ButtonBuilder createPushButtonBuilder();
+
+  public abstract QuoteBuilder createQuoteBuilder();
+
+  /**
+   * Create a builder for an &lt;input type='radio'&gt; element.
+   * 
+   * @param name name the name of the radio input (used for grouping)
+   * @return the builder for the new element
+   */
+  public abstract InputBuilder createRadioInputBuilder(String name);
+
+  public abstract ButtonBuilder createResetButtonBuilder();
+
+  public abstract InputBuilder createResetInputBuilder();
+
+  public abstract ScriptBuilder createScriptBuilder();
+
   public abstract SelectBuilder createSelectBuilder();
 
+  public abstract SourceBuilder createSourceBuilder();
+
+  public abstract SpanBuilder createSpanBuilder();
+
+  public abstract StyleBuilder createStyleBuilder();
+
+  public abstract ButtonBuilder createSubmitButtonBuilder();
+
+  public abstract InputBuilder createSubmitInputBuilder();
+
+  public abstract TableBuilder createTableBuilder();
+
+  public abstract TableCaptionBuilder createTableCaptionBuilder();
+
+  public abstract TableSectionBuilder createTBodyBuilder();
+
+  public abstract TableCellBuilder createTDBuilder();
+
+  public abstract TextAreaBuilder createTextAreaBuilder();
+
+  public abstract InputBuilder createTextInputBuilder();
+
+  public abstract TableSectionBuilder createTFootBuilder();
+
+  public abstract TableCellBuilder createTHBuilder();
+
+  public abstract TableSectionBuilder createTHeadBuilder();
+
+  public abstract TableRowBuilder createTRBuilder();
+
+  public abstract UListBuilder createUListBuilder();
+
+  public abstract VideoBuilder createVideoBuilder();
+
   /**
    * Create an {@link ElementBuilder} for an arbitrary tag name. The tag name
    * will will not be checked or escaped. The calling code should be carefully
diff --git a/user/src/com/google/gwt/dom/builder/shared/ElementBuilderImpl.java b/user/src/com/google/gwt/dom/builder/shared/ElementBuilderImpl.java
index bc25b5a..e70fc7f 100644
--- a/user/src/com/google/gwt/dom/builder/shared/ElementBuilderImpl.java
+++ b/user/src/com/google/gwt/dom/builder/shared/ElementBuilderImpl.java
@@ -24,7 +24,7 @@
 import java.util.List;
 
 /**
- * Utility implementation of {@link ElementBuilderBase} that handles state, but
+ * Base implementation of {@link ElementBuilderBase} that handles state, but
  * nothing else.
  * 
  * <p>
@@ -101,7 +101,11 @@
      * End the tag. The tag name is safe because it comes from the stack, and
      * tag names are checked before they are added to the stack.
      */
-    doEndTagImpl(tagName);
+    if (getCurrentBuilder().isEndTagForbidden()) {
+      doEndStartTagImpl();
+    } else {
+      doEndTagImpl(tagName);
+    }
 
     // Popup the item off the top of the stack.
     isStartTagOpen = false; // Closed because this element was added.
@@ -162,17 +166,23 @@
   public void html(SafeHtml html) {
     assertStartTagOpen("html cannot be set on an element that already "
         + "contains other content or elements.");
-    maybeCloseStartTag();
-    isHtmlOrTextAdded = true;
+    lockCurrentElement();
     doHtmlImpl(html);
   }
 
   public void onStart(String tagName, ElementBuilderBase<?> builder) {
-    // Check that we aren't creating another top level element.
     if (isEmpty) {
       isEmpty = false;
     } else if (stackTags.size() == 0) {
+      // Check that we aren't creating another top level element.
       throw new IllegalStateException("You can only build one top level element.");
+    } else {
+      // Check that the element supports children.
+      assertEndTagNotForbidden(getCurrentTagName() + " does not support child elements.");
+      if (!builder.isChildElementSupported()) {
+        throw new UnsupportedOperationException(getCurrentTagName()
+            + " does not support child elements.");
+      }
     }
 
     // Check that asElement hasn't already been called.
@@ -203,8 +213,7 @@
   public void text(String text) {
     assertStartTagOpen("text cannot be set on an element that already "
         + "contains other content or elements.");
-    maybeCloseStartTag();
-    isHtmlOrTextAdded = true;
+    lockCurrentElement();
     doTextImpl(text);
   }
 
@@ -262,6 +271,12 @@
   protected abstract void doCloseStyleAttributeImpl();
 
   /**
+   * Self-close the start tag. This method is called for elements that forbid
+   * the end tag.
+   */
+  protected abstract void doEndStartTagImpl();
+
+  /**
    * End the specified tag.
    * 
    * @param tagName the name of the tag to end
@@ -309,6 +324,28 @@
   }
 
   /**
+   * Lock the current element, preventing any additional changes to it. The only
+   * valid option is to call {@link #end()}.
+   */
+  protected void lockCurrentElement() {
+    maybeCloseStartTag();
+    assertEndTagNotForbidden(getCurrentTagName() + " does not support html.");
+    isHtmlOrTextAdded = true;
+  }
+
+  /**
+   * Assert that the current builder does not forbid end tags.
+   * 
+   * @param message the error message if not supported
+   * @throw {@link UnsupportedOperationException} if not supported
+   */
+  private void assertEndTagNotForbidden(String message) {
+    if (getCurrentBuilder().isEndTagForbidden()) {
+      throw new UnsupportedOperationException(message);
+    }
+  }
+
+  /**
    * Assert that the start tag is still open.
    * 
    * @param message the error message if the start tag is not open
@@ -353,7 +390,14 @@
     maybeCloseStyleAttribute();
     if (isStartTagOpen) {
       isStartTagOpen = false;
-      doCloseStartTagImpl();
+      /*
+       * Close the start tag, unless the end tag is forbidden. If the end tag is
+       * forbidden, the only valid call is to #end(), which will self end the
+       * start tag.
+       */
+      if (!getCurrentBuilder().isEndTagForbidden()) {
+        doCloseStartTagImpl();
+      }
     }
   }
 
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/FieldSetBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/FieldSetBuilder.java
index e49c505..5aa84da 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/FieldSetBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an fieldset element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface FieldSetBuilder extends ElementBuilderBase<FieldSetBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/FormBuilder.java b/user/src/com/google/gwt/dom/builder/shared/FormBuilder.java
new file mode 100644
index 0000000..cb815f3
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/FormBuilder.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an form element.
+ */
+public interface FormBuilder extends ElementBuilderBase<FormBuilder> {
+
+  /**
+   * List of character sets supported by the server.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-accept-charset">W3C
+   *      HTML Specification</a>
+   */
+  FormBuilder acceptCharset(String acceptCharset);
+
+  /**
+   * Server-side form handler.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-action">W3C
+   *      HTML Specification</a>
+   */
+  FormBuilder action(String action);
+
+  /**
+   * The content type of the submitted form, generally
+   * "application/x-www-form-urlencoded".
+   * 
+   * Note: The onsubmit even handler is not guaranteed to be triggered when
+   * invoking this method. The behavior is inconsistent for historical reasons
+   * and authors should not rely on a particular one.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-enctype">W3C
+   *      HTML Specification</a>
+   */
+  FormBuilder enctype(String enctype);
+
+  /**
+   * HTTP method [IETF RFC 2616] used to submit form.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-method">W3C
+   *      HTML Specification</a>
+   */
+  FormBuilder method(String method);
+
+  /**
+   * Names the form.
+   */
+  FormBuilder name(String name);
+
+  /**
+   * Frame to render the resource in.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-target">W3C
+   *      HTML Specification</a>
+   */
+  FormBuilder target(String target);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/FrameBuilder.java b/user/src/com/google/gwt/dom/builder/shared/FrameBuilder.java
new file mode 100644
index 0000000..dacd0b0
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/FrameBuilder.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an frame element.
+ */
+public interface FrameBuilder extends ElementBuilderBase<FrameBuilder> {
+
+  /**
+   * Request frame borders.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-frameborder">W3C
+   *      HTML Specification</a>
+   */
+  FrameBuilder frameBorder(int frameBorder);
+
+  /**
+   * URI designating a long description of this image or frame.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-longdesc-FRAME">W3C
+   *      HTML Specification</a>
+   */
+  FrameBuilder longDesc(String longDesc);
+
+  /**
+   * Frame margin height, in pixels.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-marginheight">W3C
+   *      HTML Specification</a>
+   */
+  FrameBuilder marginHeight(int marginHeight);
+
+  /**
+   * Frame margin width, in pixels.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-marginwidth">W3C
+   *      HTML Specification</a>
+   */
+  FrameBuilder marginWidth(int marginWidth);
+
+  /**
+   * The frame name (object of the target attribute).
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-name-FRAME">W3C
+   *      HTML Specification</a>
+   */
+  FrameBuilder name(String name);
+
+  /**
+   * Forbid user from resizing frame.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-noresize">W3C
+   *      HTML Specification</a>
+   */
+  FrameBuilder noResize();
+
+  /**
+   * Specify whether or not the frame should have scrollbars.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-scrolling">W3C
+   *      HTML Specification</a>
+   */
+  FrameBuilder scrolling(String scrolling);
+
+  /**
+   * A URI designating the initial frame contents.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-src-FRAME">W3C
+   *      HTML Specification</a>
+   */
+  FrameBuilder src(String src);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/FrameSetBuilder.java b/user/src/com/google/gwt/dom/builder/shared/FrameSetBuilder.java
new file mode 100644
index 0000000..8471326
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/FrameSetBuilder.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an frameset element.
+ */
+public interface FrameSetBuilder extends ElementBuilderBase<FrameSetBuilder> {
+
+  /**
+   * The number of columns of frames in the frameset.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-cols-FRAMESET">W3C
+   *      HTML Specification</a>
+   */
+  FrameSetBuilder cols(String cols);
+
+  /**
+   * The number of rows of frames in the frameset.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-rows-FRAMESET">W3C
+   *      HTML Specification</a>
+   */
+  FrameSetBuilder rows(String rows);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HRBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HRBuilder.java
index e49c505..79b5b8d 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HRBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an hr element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface HRBuilder extends ElementBuilderBase<HRBuilder> {
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HeadBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HeadBuilder.java
index e49c505..cce0feb 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HeadBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an head element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface HeadBuilder extends ElementBuilderBase<HeadBuilder> {
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HeadingBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HeadingBuilder.java
index e49c505..12df5fc 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HeadingBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an heading element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface HeadingBuilder extends ElementBuilderBase<HeadingBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlAnchorBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlAnchorBuilder.java
new file mode 100644
index 0000000..edac389
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlAnchorBuilder.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link AnchorBuilder}.
+ */
+public class HtmlAnchorBuilder extends HtmlElementBuilderBase<AnchorBuilder> implements
+    AnchorBuilder {
+
+  HtmlAnchorBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public AnchorBuilder accessKey(String accessKey) {
+    return attribute("accessKey", accessKey);
+  }
+
+  @Override
+  public AnchorBuilder href(String href) {
+    return attribute("href", href);
+  }
+
+  @Override
+  public AnchorBuilder hreflang(String hreflang) {
+    return attribute("hreflang", hreflang);
+  }
+
+  @Override
+  public AnchorBuilder name(String name) {
+    return attribute("name", name);
+  }
+
+  @Override
+  public AnchorBuilder rel(String rel) {
+    return attribute("rel", rel);
+  }
+
+  @Override
+  public AnchorBuilder target(String target) {
+    return attribute("target", target);
+  }
+
+  @Override
+  public AnchorBuilder type(String type) {
+    return attribute("type", type);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlAreaBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlAreaBuilder.java
new file mode 100644
index 0000000..5188461
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlAreaBuilder.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link AreaBuilder}.
+ */
+public class HtmlAreaBuilder extends HtmlElementBuilderBase<AreaBuilder> implements AreaBuilder {
+
+  HtmlAreaBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public AreaBuilder accessKey(String accessKey) {
+    return attribute("accessKey", accessKey);
+  }
+
+  @Override
+  public AreaBuilder alt(String alt) {
+    return attribute("alt", alt);
+  }
+
+  @Override
+  public AreaBuilder coords(String coords) {
+    return attribute("coords", coords);
+  }
+
+  @Override
+  public AreaBuilder href(String href) {
+    return attribute("href", href);
+  }
+
+  @Override
+  public AreaBuilder shape(String shape) {
+    return attribute("shape", shape);
+  }
+
+  @Override
+  public AreaBuilder target(String target) {
+    return attribute("target", target);
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlAudioBuilder.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlAudioBuilder.java
index e49c505..0712796 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlAudioBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link AudioBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlAudioBuilder extends HtmlMediaBuilderBase<AudioBuilder> implements AudioBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlAudioBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlBRBuilder.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlBRBuilder.java
index e49c505..4cdadf1 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlBRBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link BRBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlBRBuilder extends HtmlElementBuilderBase<BRBuilder> implements BRBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlBRBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlBaseBuilder.java
similarity index 61%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlBaseBuilder.java
index e49c505..46bb686 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlBaseBuilder.java
@@ -16,12 +16,21 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link BaseBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlBaseBuilder extends HtmlElementBuilderBase<BaseBuilder> implements BaseBuilder {
+
+  HtmlBaseBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
+  }
 
   @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  public BaseBuilder href(String href) {
+    return attribute("href", href);
+  }
+
+  @Override
+  public BaseBuilder target(String target) {
+    return attribute("target", target);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlBodyBuilder.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlBodyBuilder.java
index e49c505..1321ef1 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlBodyBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link BodyBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlBodyBuilder extends HtmlElementBuilderBase<BodyBuilder> implements BodyBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlBodyBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderFactory.java b/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderFactory.java
index e044370..286dab7 100644
--- a/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderFactory.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderFactory.java
@@ -50,21 +50,350 @@
   }
 
   @Override
+  public HtmlAnchorBuilder createAnchorBuilder() {
+    return impl().startAnchor();
+  }
+
+  @Override
+  public HtmlAreaBuilder createAreaBuilder() {
+    return impl().startArea();
+  }
+
+  @Override
+  public HtmlAudioBuilder createAudioBuilder() {
+    return impl().startAudio();
+  }
+
+  @Override
+  public HtmlBaseBuilder createBaseBuilder() {
+    return impl().startBase();
+  }
+
+  @Override
+  public HtmlQuoteBuilder createBlockQuoteBuilder() {
+    return impl().startBlockQuote();
+  }
+
+  @Override
+  public HtmlBodyBuilder createBodyBuilder() {
+    return impl().startBody();
+  }
+
+  @Override
+  public HtmlBRBuilder createBRBuilder() {
+    return impl().startBR();
+  }
+
+  @Override
+  public InputBuilder createButtonInputBuilder() {
+    return impl().startButtonInput();
+  }
+
+  @Override
+  public HtmlCanvasBuilder createCanvasBuilder() {
+    return impl().startCanvas();
+  }
+
+  @Override
+  public InputBuilder createCheckInputBuilder() {
+    return impl().startCheckInput();
+  }
+
+  @Override
+  public HtmlTableColBuilder createColBuilder() {
+    return impl().startCol();
+  }
+
+  @Override
+  public HtmlTableColBuilder createColGroupBuilder() {
+    return impl().startColGroup();
+  }
+
+  @Override
   public HtmlDivBuilder createDivBuilder() {
     return impl().startDiv();
   }
 
   @Override
+  public HtmlDListBuilder createDListBuilder() {
+    return impl().startDList();
+  }
+
+  @Override
+  public HtmlFieldSetBuilder createFieldSetBuilder() {
+    return impl().startFieldSet();
+  }
+
+  @Override
+  public InputBuilder createFileInputBuilder() {
+    return impl().startFileInput();
+  }
+
+  @Override
+  public HtmlFormBuilder createFormBuilder() {
+    return impl().startForm();
+  }
+
+  @Override
+  public HtmlFrameBuilder createFrameBuilder() {
+    return impl().startFrame();
+  }
+
+  @Override
+  public HtmlFrameSetBuilder createFrameSetBuilder() {
+    return impl().startFrameSet();
+  }
+
+  @Override
+  public HtmlHeadingBuilder createH1Builder() {
+    return impl().startH1();
+  }
+
+  @Override
+  public HtmlHeadingBuilder createH2Builder() {
+    return impl().startH2();
+  }
+
+  @Override
+  public HtmlHeadingBuilder createH3Builder() {
+    return impl().startH3();
+  }
+
+  @Override
+  public HtmlHeadingBuilder createH4Builder() {
+    return impl().startH4();
+  }
+
+  @Override
+  public HtmlHeadingBuilder createH5Builder() {
+    return impl().startH5();
+  }
+
+  @Override
+  public HtmlHeadingBuilder createH6Builder() {
+    return impl().startH6();
+  }
+
+  @Override
+  public HtmlHeadBuilder createHeadBuilder() {
+    return impl().startHead();
+  }
+
+  @Override
+  public InputBuilder createHiddenInputBuilder() {
+    return impl().startHiddenInput();
+  }
+
+  @Override
+  public HtmlHRBuilder createHRBuilder() {
+    return impl().startHR();
+  }
+
+  @Override
+  public HtmlIFrameBuilder createIFrameBuilder() {
+    return impl().startIFrame();
+  }
+
+  @Override
+  public HtmlImageBuilder createImageBuilder() {
+    return impl().startImage();
+  }
+
+  @Override
+  public InputBuilder createImageInputBuilder() {
+    return impl().startImageInput();
+  }
+
+  @Override
+  public HtmlLabelBuilder createLabelBuilder() {
+    return impl().startLabel();
+  }
+
+  @Override
+  public HtmlLegendBuilder createLegendBuilder() {
+    return impl().startLegend();
+  }
+
+  @Override
+  public HtmlLIBuilder createLIBuilder() {
+    return impl().startLI();
+  }
+
+  @Override
+  public HtmlLinkBuilder createLinkBuilder() {
+    return impl().startLink();
+  }
+
+  @Override
+  public HtmlMapBuilder createMapBuilder() {
+    return impl().startMap();
+  }
+
+  @Override
+  public HtmlMetaBuilder createMetaBuilder() {
+    return impl().startMeta();
+  }
+
+  @Override
+  public HtmlOListBuilder createOListBuilder() {
+    return impl().startOList();
+  }
+
+  @Override
+  public HtmlOptGroupBuilder createOptGroupBuilder() {
+    return impl().startOptGroup();
+  }
+
+  @Override
   public HtmlOptionBuilder createOptionBuilder() {
     return impl().startOption();
   }
 
   @Override
+  public HtmlParagraphBuilder createParagraphBuilder() {
+    return impl().startParagraph();
+  }
+
+  @Override
+  public HtmlParamBuilder createParamBuilder() {
+    return impl().startParam();
+  }
+
+  @Override
+  public InputBuilder createPasswordInputBuilder() {
+    return impl().startPasswordInput();
+  }
+
+  @Override
+  public HtmlPreBuilder createPreBuilder() {
+    return impl().startPre();
+  }
+
+  @Override
+  public HtmlButtonBuilder createPushButtonBuilder() {
+    return impl().startPushButton();
+  }
+
+  @Override
+  public HtmlQuoteBuilder createQuoteBuilder() {
+    return impl().startQuote();
+  }
+
+  @Override
+  public InputBuilder createRadioInputBuilder(String name) {
+    return impl().startRadioInput(name);
+  }
+
+  @Override
+  public HtmlButtonBuilder createResetButtonBuilder() {
+    return impl().startResetButton();
+  }
+
+  @Override
+  public InputBuilder createResetInputBuilder() {
+    return impl().startResetInput();
+  }
+
+  @Override
+  public HtmlScriptBuilder createScriptBuilder() {
+    return impl().startScript();
+  }
+
+  @Override
   public HtmlSelectBuilder createSelectBuilder() {
     return impl().startSelect();
   }
 
   @Override
+  public HtmlSourceBuilder createSourceBuilder() {
+    return impl().startSource();
+  }
+
+  @Override
+  public HtmlSpanBuilder createSpanBuilder() {
+    return impl().startSpan();
+  }
+
+  @Override
+  public HtmlStyleBuilder createStyleBuilder() {
+    return impl().startStyle();
+  }
+
+  @Override
+  public HtmlButtonBuilder createSubmitButtonBuilder() {
+    return impl().startSubmitButton();
+  }
+
+  @Override
+  public InputBuilder createSubmitInputBuilder() {
+    return impl().startSubmitInput();
+  }
+
+  @Override
+  public HtmlTableBuilder createTableBuilder() {
+    return impl().startTable();
+  }
+
+  @Override
+  public HtmlTableCaptionBuilder createTableCaptionBuilder() {
+    return impl().startTableCaption();
+  }
+
+  @Override
+  public HtmlTableSectionBuilder createTBodyBuilder() {
+    return impl().startTBody();
+  }
+
+  @Override
+  public HtmlTableCellBuilder createTDBuilder() {
+    return impl().startTD();
+  }
+
+  @Override
+  public HtmlTextAreaBuilder createTextAreaBuilder() {
+    return impl().startTextArea();
+  }
+
+  @Override
+  public InputBuilder createTextInputBuilder() {
+    return impl().startTextInput();
+  }
+
+  @Override
+  public HtmlTableSectionBuilder createTFootBuilder() {
+    return impl().startTFoot();
+  }
+
+  @Override
+  public HtmlTableCellBuilder createTHBuilder() {
+    return impl().startTH();
+  }
+
+  @Override
+  public HtmlTableSectionBuilder createTHeadBuilder() {
+    return impl().startTHead();
+  }
+
+  public HtmlTitleBuilder createTitleBuilder() {
+    return impl().startTitle();
+  }
+
+  @Override
+  public HtmlTableRowBuilder createTRBuilder() {
+    return impl().startTR();
+  }
+
+  @Override
+  public HtmlUListBuilder createUListBuilder() {
+    return impl().startUList();
+  }
+
+  @Override
+  public HtmlVideoBuilder createVideoBuilder() {
+    return impl().startVideo();
+  }
+
+  @Override
   public HtmlElementBuilder trustedCreate(String tagName) {
     return impl().trustedStart(tagName);
   }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java b/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java
index e21686d..d03317d 100644
--- a/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java
@@ -15,8 +15,54 @@
  */
 package com.google.gwt.dom.builder.shared;
 
+import com.google.gwt.dom.client.AnchorElement;
+import com.google.gwt.dom.client.AreaElement;
+import com.google.gwt.dom.client.AudioElement;
+import com.google.gwt.dom.client.BRElement;
+import com.google.gwt.dom.client.BaseElement;
+import com.google.gwt.dom.client.BodyElement;
+import com.google.gwt.dom.client.ButtonElement;
+import com.google.gwt.dom.client.CanvasElement;
+import com.google.gwt.dom.client.DListElement;
+import com.google.gwt.dom.client.DivElement;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.FieldSetElement;
+import com.google.gwt.dom.client.FormElement;
+import com.google.gwt.dom.client.FrameElement;
+import com.google.gwt.dom.client.FrameSetElement;
+import com.google.gwt.dom.client.HRElement;
+import com.google.gwt.dom.client.HeadElement;
+import com.google.gwt.dom.client.IFrameElement;
+import com.google.gwt.dom.client.ImageElement;
+import com.google.gwt.dom.client.LIElement;
+import com.google.gwt.dom.client.LabelElement;
+import com.google.gwt.dom.client.LegendElement;
+import com.google.gwt.dom.client.LinkElement;
+import com.google.gwt.dom.client.MapElement;
+import com.google.gwt.dom.client.MetaElement;
+import com.google.gwt.dom.client.OListElement;
+import com.google.gwt.dom.client.OptGroupElement;
+import com.google.gwt.dom.client.OptionElement;
+import com.google.gwt.dom.client.ParagraphElement;
+import com.google.gwt.dom.client.ParamElement;
+import com.google.gwt.dom.client.PreElement;
+import com.google.gwt.dom.client.QuoteElement;
+import com.google.gwt.dom.client.ScriptElement;
+import com.google.gwt.dom.client.SelectElement;
+import com.google.gwt.dom.client.SourceElement;
+import com.google.gwt.dom.client.SpanElement;
+import com.google.gwt.dom.client.StyleElement;
+import com.google.gwt.dom.client.TableCaptionElement;
+import com.google.gwt.dom.client.TableCellElement;
+import com.google.gwt.dom.client.TableColElement;
+import com.google.gwt.dom.client.TableElement;
+import com.google.gwt.dom.client.TableRowElement;
+import com.google.gwt.dom.client.TableSectionElement;
+import com.google.gwt.dom.client.TextAreaElement;
+import com.google.gwt.dom.client.TitleElement;
+import com.google.gwt.dom.client.UListElement;
+import com.google.gwt.dom.client.VideoElement;
 import com.google.gwt.safecss.shared.SafeStyles;
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlUtils;
@@ -28,15 +74,60 @@
 class HtmlBuilderImpl extends ElementBuilderImpl {
 
   /*
-   * Common element builders are created on initialization to avoid null checks.
-   * Less common element builders are created lazily to avoid unnecessary object
-   * creation.
+   * Common element builders, and those most likely to appear in a loop, are
+   * created on initialization to avoid null checks. Less common element
+   * builders are created lazily to avoid unnecessary object creation.
    */
-  private final HtmlDivBuilder divElementBuilder = new HtmlDivBuilder(this);
+  private HtmlAnchorBuilder anchorBuilder;
+  private HtmlAreaBuilder areaBuilder;
+  private HtmlAudioBuilder audioBuilder;
+  private HtmlBaseBuilder baseBuilder;
+  private HtmlBodyBuilder bodyBuilder;
+  private HtmlBRBuilder brBuilder;
+  private HtmlButtonBuilder buttonBuilder;
+  private HtmlCanvasBuilder canvasBuilder;
+  private final HtmlDivBuilder divBuilder = new HtmlDivBuilder(this);
+  private HtmlDListBuilder dListBuilder;
   private final HtmlElementBuilder elementBuilder = new HtmlElementBuilder(this);
-  private HtmlOptionBuilder optionElementBuilder;
-  private HtmlSelectBuilder selectElementBuilder;
-  private final StylesBuilder styleBuilder = new HtmlStylesBuilder(this);
+  private HtmlFieldSetBuilder fieldSetBuilder;
+  private HtmlFormBuilder formBuilder;
+  private HtmlFrameBuilder frameBuilder;
+  private HtmlFrameSetBuilder frameSetBuilder;
+  private HtmlHeadBuilder headBuilder;
+  private HtmlHeadingBuilder headingBuilder;
+  private HtmlHRBuilder hrBuilder;
+  private HtmlIFrameBuilder iFrameBuilder;
+  private HtmlImageBuilder imageBuilder;
+  private final HtmlInputBuilder inputBuilder = new HtmlInputBuilder(this);
+  private HtmlLabelBuilder labelBuilder;
+  private HtmlLegendBuilder legendBuilder;
+  private final HtmlLIBuilder liBuilder = new HtmlLIBuilder(this);
+  private HtmlLinkBuilder linkBuilder;
+  private HtmlMapBuilder mapBuilder;
+  private HtmlMetaBuilder metaBuilder;
+  private HtmlOListBuilder oListBuilder;
+  private final HtmlOptionBuilder optionBuilder = new HtmlOptionBuilder(this);
+  private HtmlOptGroupBuilder optGroupBuilder;
+  private HtmlParagraphBuilder paragraphBuilder;
+  private HtmlParamBuilder paramBuilder;
+  private HtmlPreBuilder preBuilder;
+  private HtmlQuoteBuilder quoteBuilder;
+  private HtmlScriptBuilder scriptBuilder;
+  private HtmlSelectBuilder selectBuilder;
+  private HtmlSourceBuilder sourceBuilder;
+  private final HtmlSpanBuilder spanBuilder = new HtmlSpanBuilder(this);
+  private HtmlStyleBuilder styleBuilder;
+  private final StylesBuilder stylesBuilder = new HtmlStylesBuilder(this);
+  private HtmlTableBuilder tableBuilder;
+  private final HtmlTableCellBuilder tableCellBuilder = new HtmlTableCellBuilder(this);
+  private HtmlTableCaptionBuilder tableCaptionBuilder;
+  private HtmlTableColBuilder tableColBuilder;
+  private final HtmlTableRowBuilder tableRowBuilder = new HtmlTableRowBuilder(this);
+  private HtmlTableSectionBuilder tableSectionBuilder;
+  private HtmlTextAreaBuilder textAreaBuilder;
+  private HtmlTitleBuilder titleBuilder;
+  private HtmlUListBuilder uListBuilder;
+  private HtmlVideoBuilder videoBuilder;
 
   /**
    * Used to builder the HTML string. We cannot use
@@ -65,27 +156,395 @@
     sb.append(" ").append(escape(name)).append("=\"").append(escape(value)).append("\"");
   }
 
+  public HtmlAnchorBuilder startAnchor() {
+    if (anchorBuilder == null) {
+      anchorBuilder = new HtmlAnchorBuilder(this);
+    }
+    return trustedStart(AnchorElement.TAG, anchorBuilder);
+  }
+
+  public HtmlAreaBuilder startArea() {
+    if (areaBuilder == null) {
+      areaBuilder = new HtmlAreaBuilder(this);
+    }
+    return trustedStart(AreaElement.TAG, areaBuilder);
+  }
+
+  public HtmlAudioBuilder startAudio() {
+    if (audioBuilder == null) {
+      audioBuilder = new HtmlAudioBuilder(this);
+    }
+    return trustedStart(AudioElement.TAG, audioBuilder);
+  }
+
+  public HtmlBaseBuilder startBase() {
+    if (baseBuilder == null) {
+      baseBuilder = new HtmlBaseBuilder(this);
+    }
+    return trustedStart(BaseElement.TAG, baseBuilder);
+  }
+
+  public HtmlQuoteBuilder startBlockQuote() {
+    return startQuote(QuoteElement.TAG_BLOCKQUOTE);
+  }
+
+  public HtmlBodyBuilder startBody() {
+    if (bodyBuilder == null) {
+      bodyBuilder = new HtmlBodyBuilder(this);
+    }
+    return trustedStart(BodyElement.TAG, bodyBuilder);
+  }
+
+  public HtmlBRBuilder startBR() {
+    if (brBuilder == null) {
+      brBuilder = new HtmlBRBuilder(this);
+    }
+    return trustedStart(BRElement.TAG, brBuilder);
+  }
+
+  public InputBuilder startButtonInput() {
+    return startInput(ButtonElement.TAG);
+  }
+
+  public HtmlCanvasBuilder startCanvas() {
+    if (canvasBuilder == null) {
+      canvasBuilder = new HtmlCanvasBuilder(this);
+    }
+    return trustedStart(CanvasElement.TAG, canvasBuilder);
+  }
+
+  public InputBuilder startCheckInput() {
+    return startInput("check");
+  }
+
+  public HtmlTableColBuilder startCol() {
+    return startTableCol(TableColElement.TAG_COL);
+  }
+
+  public HtmlTableColBuilder startColGroup() {
+    return startTableCol(TableColElement.TAG_COLGROUP);
+  }
+
   public HtmlDivBuilder startDiv() {
-    return trustedStart("div", divElementBuilder);
+    return trustedStart(DivElement.TAG, divBuilder);
+  }
+
+  public HtmlDListBuilder startDList() {
+    if (dListBuilder == null) {
+      dListBuilder = new HtmlDListBuilder(this);
+    }
+    return trustedStart(DListElement.TAG, dListBuilder);
+  }
+
+  public HtmlFieldSetBuilder startFieldSet() {
+    if (fieldSetBuilder == null) {
+      fieldSetBuilder = new HtmlFieldSetBuilder(this);
+    }
+    return trustedStart(FieldSetElement.TAG, fieldSetBuilder);
+  }
+
+  public InputBuilder startFileInput() {
+    return startInput("file");
+  }
+
+  public HtmlFormBuilder startForm() {
+    if (formBuilder == null) {
+      formBuilder = new HtmlFormBuilder(this);
+    }
+    return trustedStart(FormElement.TAG, formBuilder);
+  }
+
+  public HtmlFrameBuilder startFrame() {
+    if (frameBuilder == null) {
+      frameBuilder = new HtmlFrameBuilder(this);
+    }
+    return trustedStart(FrameElement.TAG, frameBuilder);
+  }
+
+  public HtmlFrameSetBuilder startFrameSet() {
+    if (frameSetBuilder == null) {
+      frameSetBuilder = new HtmlFrameSetBuilder(this);
+    }
+    return trustedStart(FrameSetElement.TAG, frameSetBuilder);
+  }
+
+  public HtmlHeadingBuilder startH1() {
+    return startHeading(1);
+  }
+
+  public HtmlHeadingBuilder startH2() {
+    return startHeading(2);
+  }
+
+  public HtmlHeadingBuilder startH3() {
+    return startHeading(3);
+  }
+
+  public HtmlHeadingBuilder startH4() {
+    return startHeading(4);
+  }
+
+  public HtmlHeadingBuilder startH5() {
+    return startHeading(5);
+  }
+
+  public HtmlHeadingBuilder startH6() {
+    return startHeading(6);
+  }
+
+  public HtmlHeadBuilder startHead() {
+    if (headBuilder == null) {
+      headBuilder = new HtmlHeadBuilder(this);
+    }
+    return trustedStart(HeadElement.TAG, headBuilder);
+  }
+
+  public InputBuilder startHiddenInput() {
+    return startInput("hidden");
+  }
+
+  public HtmlHRBuilder startHR() {
+    if (hrBuilder == null) {
+      hrBuilder = new HtmlHRBuilder(this);
+    }
+    return trustedStart(HRElement.TAG, hrBuilder);
+  }
+
+  public HtmlIFrameBuilder startIFrame() {
+    if (iFrameBuilder == null) {
+      iFrameBuilder = new HtmlIFrameBuilder(this);
+    }
+    return trustedStart(IFrameElement.TAG, iFrameBuilder);
+  }
+
+  public HtmlImageBuilder startImage() {
+    if (imageBuilder == null) {
+      imageBuilder = new HtmlImageBuilder(this);
+    }
+    return trustedStart(ImageElement.TAG, imageBuilder);
+  }
+
+  public InputBuilder startImageInput() {
+    return startInput("image");
+  }
+
+  public HtmlLabelBuilder startLabel() {
+    if (labelBuilder == null) {
+      labelBuilder = new HtmlLabelBuilder(this);
+    }
+    return trustedStart(LabelElement.TAG, labelBuilder);
+  }
+
+  public HtmlLegendBuilder startLegend() {
+    if (legendBuilder == null) {
+      legendBuilder = new HtmlLegendBuilder(this);
+    }
+    return trustedStart(LegendElement.TAG, legendBuilder);
+  }
+
+  public HtmlLIBuilder startLI() {
+    return trustedStart(LIElement.TAG, liBuilder);
+  }
+
+  public HtmlLinkBuilder startLink() {
+    if (linkBuilder == null) {
+      linkBuilder = new HtmlLinkBuilder(this);
+    }
+    return trustedStart(LinkElement.TAG, linkBuilder);
+  }
+
+  public HtmlMapBuilder startMap() {
+    if (mapBuilder == null) {
+      mapBuilder = new HtmlMapBuilder(this);
+    }
+    return trustedStart(MapElement.TAG, mapBuilder);
+  }
+
+  public HtmlMetaBuilder startMeta() {
+    if (metaBuilder == null) {
+      metaBuilder = new HtmlMetaBuilder(this);
+    }
+    return trustedStart(MetaElement.TAG, metaBuilder);
+  }
+
+  public HtmlOListBuilder startOList() {
+    if (oListBuilder == null) {
+      oListBuilder = new HtmlOListBuilder(this);
+    }
+    return trustedStart(OListElement.TAG, oListBuilder);
+  }
+
+  public HtmlOptGroupBuilder startOptGroup() {
+    if (optGroupBuilder == null) {
+      optGroupBuilder = new HtmlOptGroupBuilder(this);
+    }
+    return trustedStart(OptGroupElement.TAG, optGroupBuilder);
   }
 
   public HtmlOptionBuilder startOption() {
-    if (optionElementBuilder == null) {
-      optionElementBuilder = new HtmlOptionBuilder(this);
+    return trustedStart(OptionElement.TAG, optionBuilder);
+  }
+
+  public HtmlParagraphBuilder startParagraph() {
+    if (paragraphBuilder == null) {
+      paragraphBuilder = new HtmlParagraphBuilder(this);
     }
-    return trustedStart("option", optionElementBuilder);
+    return trustedStart(ParagraphElement.TAG, paragraphBuilder);
+  }
+
+  public HtmlParamBuilder startParam() {
+    if (paramBuilder == null) {
+      paramBuilder = new HtmlParamBuilder(this);
+    }
+    return trustedStart(ParamElement.TAG, paramBuilder);
+  }
+
+  public InputBuilder startPasswordInput() {
+    return startInput("password");
+  }
+
+  public HtmlPreBuilder startPre() {
+    if (preBuilder == null) {
+      preBuilder = new HtmlPreBuilder(this);
+    }
+    return trustedStart(PreElement.TAG, preBuilder);
+  }
+
+  public HtmlButtonBuilder startPushButton() {
+    return startButton("button");
+  }
+
+  public HtmlQuoteBuilder startQuote() {
+    return startQuote(QuoteElement.TAG_Q);
+  }
+
+  public InputBuilder startRadioInput(String name) {
+    InputBuilder builder = startInput("radio");
+    attribute("name", name);
+    return builder;
+  }
+
+  public HtmlButtonBuilder startResetButton() {
+    return startButton("reset");
+  }
+
+  public InputBuilder startResetInput() {
+    return startInput("reset");
+  }
+
+  public HtmlScriptBuilder startScript() {
+    if (scriptBuilder == null) {
+      scriptBuilder = new HtmlScriptBuilder(this);
+    }
+    return trustedStart(ScriptElement.TAG, scriptBuilder);
   }
 
   public HtmlSelectBuilder startSelect() {
-    if (selectElementBuilder == null) {
-      selectElementBuilder = new HtmlSelectBuilder(this);
+    if (selectBuilder == null) {
+      selectBuilder = new HtmlSelectBuilder(this);
     }
-    return trustedStart("select", selectElementBuilder);
+    return trustedStart(SelectElement.TAG, selectBuilder);
+  }
+
+  public HtmlSourceBuilder startSource() {
+    if (sourceBuilder == null) {
+      sourceBuilder = new HtmlSourceBuilder(this);
+    }
+    return trustedStart(SourceElement.TAG, sourceBuilder);
+  }
+
+  public HtmlSpanBuilder startSpan() {
+    return trustedStart(SpanElement.TAG, spanBuilder);
+  }
+
+  public HtmlStyleBuilder startStyle() {
+    if (styleBuilder == null) {
+      styleBuilder = new HtmlStyleBuilder(this);
+    }
+    return trustedStart(StyleElement.TAG, styleBuilder);
+  }
+
+  public HtmlButtonBuilder startSubmitButton() {
+    return startButton("submit");
+  }
+
+  public InputBuilder startSubmitInput() {
+    return startInput("submit");
+  }
+
+  public HtmlTableBuilder startTable() {
+    if (tableBuilder == null) {
+      tableBuilder = new HtmlTableBuilder(this);
+    }
+    return trustedStart(TableElement.TAG, tableBuilder);
+  }
+
+  public HtmlTableCaptionBuilder startTableCaption() {
+    if (tableCaptionBuilder == null) {
+      tableCaptionBuilder = new HtmlTableCaptionBuilder(this);
+    }
+    return trustedStart(TableCaptionElement.TAG, tableCaptionBuilder);
+  }
+
+  public HtmlTableSectionBuilder startTBody() {
+    return startTableSection(TableSectionElement.TAG_TBODY);
+  }
+
+  public HtmlTableCellBuilder startTD() {
+    return trustedStart(TableCellElement.TAG_TD, tableCellBuilder);
+  }
+
+  public HtmlTextAreaBuilder startTextArea() {
+    if (textAreaBuilder == null) {
+      textAreaBuilder = new HtmlTextAreaBuilder(this);
+    }
+    return trustedStart(TextAreaElement.TAG, textAreaBuilder);
+  }
+
+  public InputBuilder startTextInput() {
+    return startInput("text");
+  }
+
+  public HtmlTableSectionBuilder startTFoot() {
+    return startTableSection(TableSectionElement.TAG_TFOOT);
+  }
+
+  public HtmlTableCellBuilder startTH() {
+    return trustedStart(TableCellElement.TAG_TH, tableCellBuilder);
+  }
+
+  public HtmlTableSectionBuilder startTHead() {
+    return startTableSection(TableSectionElement.TAG_THEAD);
+  }
+
+  public HtmlTitleBuilder startTitle() {
+    if (titleBuilder == null) {
+      titleBuilder = new HtmlTitleBuilder(this);
+    }
+    return trustedStart(TitleElement.TAG, titleBuilder);
+  }
+
+  public HtmlTableRowBuilder startTR() {
+    return trustedStart(TableRowElement.TAG, tableRowBuilder);
+  }
+
+  public HtmlUListBuilder startUList() {
+    if (uListBuilder == null) {
+      uListBuilder = new HtmlUListBuilder(this);
+    }
+    return trustedStart(UListElement.TAG, uListBuilder);
+  }
+
+  public HtmlVideoBuilder startVideo() {
+    if (videoBuilder == null) {
+      videoBuilder = new HtmlVideoBuilder(this);
+    }
+    return trustedStart(VideoElement.TAG, videoBuilder);
   }
 
   @Override
   public StylesBuilder style() {
-    return styleBuilder;
+    return stylesBuilder;
   }
 
   public StylesBuilder styleProperty(SafeStyles style) {
@@ -109,12 +568,18 @@
   }
 
   @Override
+  protected void doEndStartTagImpl() {
+    sb.append(" />");
+  }
+
+  @Override
   protected void doEndTagImpl(String tagName) {
     /*
      * Add an end tag.
      * 
      * Some browsers do not behave correctly if you self close (ex <select />)
-     * certain tags, so we always add the end tag.
+     * certain tags, so we always add the end tag unless the element
+     * specifically forbids an end tag (see doEndStartTagImpl()).
      * 
      * The tag name is safe because it comes from the stack, and tag names are
      * checked before they are added to the stack.
@@ -154,6 +619,67 @@
   }
 
   /**
+   * Start a button with the specified type.
+   */
+  private HtmlButtonBuilder startButton(String type) {
+    if (buttonBuilder == null) {
+      buttonBuilder = new HtmlButtonBuilder(this);
+    }
+    HtmlButtonBuilder builder = trustedStart("button", buttonBuilder);
+    builder.attribute("type", type);
+    return builder;
+  }
+
+  /**
+   * Start one of the many heading elements.
+   */
+  private HtmlHeadingBuilder startHeading(int level) {
+    if (headingBuilder == null) {
+      headingBuilder = new HtmlHeadingBuilder(this);
+    }
+    return trustedStart("h" + level, headingBuilder);
+  }
+
+  /**
+   * Start an input with the specified type.
+   */
+  private HtmlInputBuilder startInput(String type) {
+    trustedStart("input", inputBuilder);
+    attribute("type", type);
+    return inputBuilder;
+  }
+
+  /**
+   * Start a quote or blockquote.
+   */
+  private HtmlQuoteBuilder startQuote(String tagName) {
+    if (quoteBuilder == null) {
+      quoteBuilder = new HtmlQuoteBuilder(this);
+    }
+    return trustedStart(tagName, quoteBuilder);
+  }
+
+  /**
+   * Start a table col or colgroup.
+   */
+  private HtmlTableColBuilder startTableCol(String tagName) {
+    if (tableColBuilder == null) {
+      tableColBuilder = new HtmlTableColBuilder(this);
+    }
+    return trustedStart(tagName, tableColBuilder);
+  }
+
+  /**
+   * Start a table section of the specified tag name.
+   */
+  private HtmlTableSectionBuilder startTableSection(String tagName) {
+    if (tableSectionBuilder == null) {
+      tableSectionBuilder = new HtmlTableSectionBuilder(this);
+    }
+    return trustedStart(tagName, tableSectionBuilder);
+  }
+
+  /**
    * Start a tag using the specified builder. The tagName is not checked or
    * escaped.
    * 
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlButtonBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlButtonBuilder.java
new file mode 100644
index 0000000..2fca42b
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlButtonBuilder.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link ButtonBuilder}.
+ */
+public class HtmlButtonBuilder extends HtmlElementBuilderBase<ButtonBuilder> implements
+    ButtonBuilder {
+
+  HtmlButtonBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public ButtonBuilder accessKey(String accessKey) {
+    return attribute("accessKey", accessKey);
+  }
+
+  @Override
+  public ButtonBuilder disabled() {
+    return attribute("disabled", "disabled");
+  }
+
+  @Override
+  public ButtonBuilder name(String name) {
+    return attribute("name", name);
+  }
+
+  @Override
+  public ButtonBuilder value(String value) {
+    return attribute("value", value);
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlCanvasBuilder.java
similarity index 61%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlCanvasBuilder.java
index e49c505..2c3e75b 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlCanvasBuilder.java
@@ -16,12 +16,22 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link CanvasBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlCanvasBuilder extends HtmlElementBuilderBase<CanvasBuilder> implements
+    CanvasBuilder {
+
+  HtmlCanvasBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
 
   @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  public CanvasBuilder height(int height) {
+    return attribute("height", height);
+  }
+
+  @Override
+  public CanvasBuilder width(int width) {
+    return attribute("width", width);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlDListBuilder.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlDListBuilder.java
index e49c505..b8a640c 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlDListBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link DListBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlDListBuilder extends HtmlElementBuilderBase<DListBuilder> implements DListBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlDListBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlDivBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlDivBuilder.java
index 7e0fa3a..987efe4 100644
--- a/user/src/com/google/gwt/dom/builder/shared/HtmlDivBuilder.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlDivBuilder.java
@@ -16,7 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * Implementation of {@link DivBuilder}.
+ * HTML-based implementation of {@link DivBuilder}.
  */
 public class HtmlDivBuilder extends HtmlElementBuilderBase<DivBuilder> implements
     DivBuilder {
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlElementBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlElementBuilder.java
index b0f538f..870af5c 100644
--- a/user/src/com/google/gwt/dom/builder/shared/HtmlElementBuilder.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlElementBuilder.java
@@ -16,7 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * Implementation of {@link ElementBuilder}.
+ * HTML-based implementation of {@link ElementBuilder}.
  */
 public class HtmlElementBuilder extends HtmlElementBuilderBase<ElementBuilder> implements
     ElementBuilder {
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlElementBuilderBase.java b/user/src/com/google/gwt/dom/builder/shared/HtmlElementBuilderBase.java
index 032f167..14151b9 100644
--- a/user/src/com/google/gwt/dom/builder/shared/HtmlElementBuilderBase.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlElementBuilderBase.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.dom.builder.shared;
 
-import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.TitleElement;
 import com.google.gwt.safehtml.shared.SafeHtml;
 
 /**
@@ -34,8 +34,8 @@
  * 
  * @param <R> the builder type returned from build methods
  */
-public class HtmlElementBuilderBase<R extends ElementBuilderBase<?>> implements
-    ElementBuilderBase<R> {
+public class HtmlElementBuilderBase<R extends ElementBuilderBase<?>> extends
+    AbstractElementBuilderBase<R> {
 
   private final HtmlBuilderImpl delegate;
 
@@ -45,6 +45,17 @@
    * @param delegate the delegate that builds the element
    */
   HtmlElementBuilderBase(HtmlBuilderImpl delegate) {
+    this(delegate, false);
+  }
+
+  /**
+   * Construct a new {@link HtmlElementBuilderBase}.
+   * 
+   * @param delegate the delegate that builds the element
+   * @param isEndTagForbidden true if the end tag is forbidden for this element
+   */
+  HtmlElementBuilderBase(HtmlBuilderImpl delegate, boolean isEndTagForbidden) {
+    super(delegate, isEndTagForbidden);
     this.delegate = delegate;
   }
 
@@ -56,11 +67,6 @@
   }
 
   @Override
-  public R attribute(String name, int value) {
-    return attribute(name, String.valueOf(value));
-  }
-
-  @Override
   public R attribute(String name, String value) {
     delegate.attribute(name, value);
     return getReturnBuilder();
@@ -81,46 +87,20 @@
     return attribute("draggable", draggable);
   }
 
+  /**
+   * End the current element.
+   * 
+   * @param <B> the type of the parent element
+   * @return the {@link ElementBuilderBase} for the parent element, or null if
+   *         the current element does not have a parent
+   * @throws IllegalStateException if the current element has the wrong tag
+   * @throws ClassCastException if the parent builder does not match the
+   *           specified class
+   * @see #end()
+   */
   @SuppressWarnings("unchecked")
-  @Override
-  public <B extends ElementBuilderBase<?>> B end() {
-    // An explicit cast is required to satisfy some javac compilers.
-    return (B) delegate.end();
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public <B extends ElementBuilderBase<?>> B end(String tagName) {
-    return (B) delegate.end(tagName);
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public <B extends ElementBuilderBase<?>> B endDiv() {
-    return (B) end("div");
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public <B extends ElementBuilderBase<?>> B endOption() {
-    return (B) end("option");
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public <B extends ElementBuilderBase<?>> B endSelect() {
-    return (B) end("select");
-  }
-
-  @Override
-  public Element finish() {
-    return delegate.finish();
-  }
-
-  @Override
-  public R html(SafeHtml html) {
-    delegate.html(html);
-    return getReturnBuilder();
+  public <B extends ElementBuilderBase<?>> B endTitle() {
+    return (B) end(TitleElement.TAG);
   }
 
   @Override
@@ -134,23 +114,352 @@
   }
 
   @Override
+  public AnchorBuilder startAnchor() {
+    return delegate.startAnchor();
+  }
+
+  @Override
+  public AreaBuilder startArea() {
+    return delegate.startArea();
+  }
+
+  @Override
+  public AudioBuilder startAudio() {
+    return delegate.startAudio();
+  }
+
+  @Override
+  public BaseBuilder startBase() {
+    return delegate.startBase();
+  }
+
+  @Override
+  public QuoteBuilder startBlockQuote() {
+    return delegate.startBlockQuote();
+  }
+
+  @Override
+  public BodyBuilder startBody() {
+    return delegate.startBody();
+  }
+
+  @Override
+  public BRBuilder startBR() {
+    return delegate.startBR();
+  }
+
+  @Override
+  public InputBuilder startButtonInput() {
+    return delegate.startButtonInput();
+  }
+
+  @Override
+  public CanvasBuilder startCanvas() {
+    return delegate.startCanvas();
+  }
+
+  @Override
+  public InputBuilder startCheckInput() {
+    return delegate.startCheckInput();
+  }
+
+  @Override
+  public TableColBuilder startCol() {
+    return delegate.startCol();
+  }
+
+  @Override
+  public TableColBuilder startColGroup() {
+    return delegate.startColGroup();
+  }
+
+  @Override
   public DivBuilder startDiv() {
     return delegate.startDiv();
   }
 
   @Override
+  public DListBuilder startDList() {
+    return delegate.startDList();
+  }
+
+  @Override
+  public FieldSetBuilder startFieldSet() {
+    return delegate.startFieldSet();
+  }
+
+  @Override
+  public InputBuilder startFileInput() {
+    return delegate.startFileInput();
+  }
+
+  @Override
+  public FormBuilder startForm() {
+    return delegate.startForm();
+  }
+
+  @Override
+  public FrameBuilder startFrame() {
+    return delegate.startFrame();
+  }
+
+  @Override
+  public FrameSetBuilder startFrameSet() {
+    return delegate.startFrameSet();
+  }
+
+  @Override
+  public HeadingBuilder startH1() {
+    return delegate.startH1();
+  }
+
+  @Override
+  public HeadingBuilder startH2() {
+    return delegate.startH2();
+  }
+
+  @Override
+  public HeadingBuilder startH3() {
+    return delegate.startH3();
+  }
+
+  @Override
+  public HeadingBuilder startH4() {
+    return delegate.startH4();
+  }
+
+  @Override
+  public HeadingBuilder startH5() {
+    return delegate.startH5();
+  }
+
+  @Override
+  public HeadingBuilder startH6() {
+    return delegate.startH6();
+  }
+
+  @Override
+  public HeadBuilder startHead() {
+    return delegate.startHead();
+  }
+
+  @Override
+  public InputBuilder startHiddenInput() {
+    return delegate.startHiddenInput();
+  }
+
+  @Override
+  public HRBuilder startHR() {
+    return delegate.startHR();
+  }
+
+  @Override
+  public IFrameBuilder startIFrame() {
+    return delegate.startIFrame();
+  }
+
+  @Override
+  public ImageBuilder startImage() {
+    return delegate.startImage();
+  }
+
+  @Override
+  public InputBuilder startImageInput() {
+    return delegate.startImageInput();
+  }
+
+  @Override
+  public LabelBuilder startLabel() {
+    return delegate.startLabel();
+  }
+
+  @Override
+  public LegendBuilder startLegend() {
+    return delegate.startLegend();
+  }
+
+  @Override
+  public LIBuilder startLI() {
+    return delegate.startLI();
+  }
+
+  @Override
+  public LinkBuilder startLink() {
+    return delegate.startLink();
+  }
+
+  @Override
+  public MapBuilder startMap() {
+    return delegate.startMap();
+  }
+
+  @Override
+  public MetaBuilder startMeta() {
+    return delegate.startMeta();
+  }
+
+  @Override
+  public OListBuilder startOList() {
+    return delegate.startOList();
+  }
+
+  @Override
+  public OptGroupBuilder startOptGroup() {
+    return delegate.startOptGroup();
+  }
+
+  @Override
   public OptionBuilder startOption() {
     return delegate.startOption();
   }
 
   @Override
+  public ParagraphBuilder startParagraph() {
+    return delegate.startParagraph();
+  }
+
+  @Override
+  public ParamBuilder startParam() {
+    return delegate.startParam();
+  }
+
+  @Override
+  public InputBuilder startPasswordInput() {
+    return delegate.startPasswordInput();
+  }
+
+  @Override
+  public PreBuilder startPre() {
+    return delegate.startPre();
+  }
+
+  @Override
+  public ButtonBuilder startPushButton() {
+    return delegate.startPushButton();
+  }
+
+  @Override
+  public QuoteBuilder startQuote() {
+    return delegate.startQuote();
+  }
+
+  @Override
+  public InputBuilder startRadioInput(String name) {
+    return delegate.startRadioInput(name);
+  }
+
+  @Override
+  public ButtonBuilder startResetButton() {
+    return delegate.startResetButton();
+  }
+
+  @Override
+  public InputBuilder startResetInput() {
+    return delegate.startResetInput();
+  }
+
+  @Override
+  public ScriptBuilder startScript() {
+    return delegate.startScript();
+  }
+
+  @Override
   public SelectBuilder startSelect() {
     return delegate.startSelect();
   }
 
   @Override
-  public StylesBuilder style() {
-    return delegate.style();
+  public SourceBuilder startSource() {
+    return delegate.startSource();
+  }
+
+  @Override
+  public SpanBuilder startSpan() {
+    return delegate.startSpan();
+  }
+
+  @Override
+  public StyleBuilder startStyle() {
+    return delegate.startStyle();
+  }
+
+  @Override
+  public ButtonBuilder startSubmitButton() {
+    return delegate.startSubmitButton();
+  }
+
+  @Override
+  public InputBuilder startSubmitInput() {
+    return delegate.startSubmitInput();
+  }
+
+  @Override
+  public TableBuilder startTable() {
+    return delegate.startTable();
+  }
+
+  @Override
+  public TableCaptionBuilder startTableCaption() {
+    return delegate.startTableCaption();
+  }
+
+  @Override
+  public TableSectionBuilder startTBody() {
+    return delegate.startTBody();
+  }
+
+  @Override
+  public TableCellBuilder startTD() {
+    return delegate.startTD();
+  }
+
+  @Override
+  public TextAreaBuilder startTextArea() {
+    return delegate.startTextArea();
+  }
+
+  @Override
+  public InputBuilder startTextInput() {
+    return delegate.startTextInput();
+  }
+
+  @Override
+  public TableSectionBuilder startTFoot() {
+    return delegate.startTFoot();
+  }
+
+  @Override
+  public TableCellBuilder startTH() {
+    return delegate.startTH();
+  }
+
+  @Override
+  public TableSectionBuilder startTHead() {
+    return delegate.startTHead();
+  }
+
+  /**
+   * Append a title element.
+   * 
+   * @return the builder for the new element
+   */
+  public TitleBuilder startTitle() {
+    return delegate.startTitle();
+  }
+
+  @Override
+  public TableRowBuilder startTR() {
+    return delegate.startTR();
+  }
+
+  @Override
+  public UListBuilder startUList() {
+    return delegate.startUList();
+  }
+
+  @Override
+  public VideoBuilder startVideo() {
+    return delegate.startVideo();
   }
 
   @Override
@@ -159,12 +468,6 @@
   }
 
   @Override
-  public R text(String text) {
-    delegate.text(text);
-    return getReturnBuilder();
-  }
-
-  @Override
   public R title(String title) {
     return attribute("title", title);
   }
@@ -173,14 +476,4 @@
   public ElementBuilder trustedStart(String tagName) {
     return delegate.trustedStart(tagName);
   }
-
-  /**
-   * Get the builder to return from build methods.
-   * 
-   * @return the return builder
-   */
-  @SuppressWarnings("unchecked")
-  private R getReturnBuilder() {
-    return (R) this;
-  }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlFieldSetBuilder.java
similarity index 72%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlFieldSetBuilder.java
index e49c505..5ca221a 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlFieldSetBuilder.java
@@ -16,12 +16,12 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link FieldSetBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlFieldSetBuilder extends HtmlElementBuilderBase<FieldSetBuilder> implements
+    FieldSetBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlFieldSetBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlFormBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlFormBuilder.java
new file mode 100644
index 0000000..ca46b26
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlFormBuilder.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link FormBuilder}.
+ */
+public class HtmlFormBuilder extends HtmlElementBuilderBase<FormBuilder> implements FormBuilder {
+
+  HtmlFormBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public FormBuilder acceptCharset(String acceptCharset) {
+    return attribute("acceptCharset", acceptCharset);
+  }
+
+  @Override
+  public FormBuilder action(String action) {
+    return attribute("action", action);
+  }
+
+  @Override
+  public FormBuilder enctype(String enctype) {
+    return attribute("enctype", enctype);
+  }
+
+  @Override
+  public FormBuilder method(String method) {
+    return attribute("method", method);
+  }
+
+  @Override
+  public FormBuilder name(String name) {
+    return attribute("name", name);
+  }
+
+  @Override
+  public FormBuilder target(String target) {
+    return attribute("target", target);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlFrameBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlFrameBuilder.java
new file mode 100644
index 0000000..7102582
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlFrameBuilder.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link FrameBuilder}.
+ */
+public class HtmlFrameBuilder extends HtmlElementBuilderBase<FrameBuilder> implements FrameBuilder {
+
+  HtmlFrameBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public FrameBuilder frameBorder(int frameBorder) {
+    return attribute("frameBorder", frameBorder);
+  }
+
+  @Override
+  public FrameBuilder longDesc(String longDesc) {
+    return attribute("longDesc", longDesc);
+  }
+
+  @Override
+  public FrameBuilder marginHeight(int marginHeight) {
+    return attribute("marginHeight", marginHeight);
+  }
+
+  @Override
+  public FrameBuilder marginWidth(int marginWidth) {
+    return attribute("marginWidth", marginWidth);
+  }
+
+  @Override
+  public FrameBuilder name(String name) {
+    return attribute("name", name);
+  }
+
+  @Override
+  public FrameBuilder noResize() {
+    return attribute("noresize", "noresize");
+  }
+
+  @Override
+  public FrameBuilder scrolling(String scrolling) {
+    return attribute("scrolling", scrolling);
+  }
+
+  @Override
+  public FrameBuilder src(String src) {
+    return attribute("src", src);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlFrameSetBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlFrameSetBuilder.java
new file mode 100644
index 0000000..9198ade
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlFrameSetBuilder.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * HTML-based implementation of {@link FrameSetBuilder}.
+ */
+public class HtmlFrameSetBuilder extends HtmlElementBuilderBase<FrameSetBuilder> implements
+    FrameSetBuilder {
+
+  HtmlFrameSetBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public FrameSetBuilder cols(String cols) {
+    return attribute("cols", cols);
+  }
+
+  @Override
+  public FrameSetBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public FrameSetBuilder rows(String rows) {
+    return attribute("rows", rows);
+  }
+
+  @Override
+  public FrameSetBuilder text(String text) {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlHRBuilder.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlHRBuilder.java
index e49c505..3ee5a49 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlHRBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link HRBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlHRBuilder extends HtmlElementBuilderBase<HRBuilder> implements HRBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlHRBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlHeadBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlHeadBuilder.java
new file mode 100644
index 0000000..3ea1a12
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlHeadBuilder.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * HTML-based implementation of {@link HeadBuilder}.
+ */
+public class HtmlHeadBuilder extends HtmlElementBuilderBase<HeadBuilder> implements HeadBuilder {
+
+  HtmlHeadBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public HeadBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public HeadBuilder text(String text) {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlHeadingBuilder.java
similarity index 72%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlHeadingBuilder.java
index e49c505..3579870 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlHeadingBuilder.java
@@ -16,12 +16,12 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link HeadingBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlHeadingBuilder extends HtmlElementBuilderBase<HeadingBuilder> implements
+    HeadingBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlHeadingBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlIFrameBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlIFrameBuilder.java
new file mode 100644
index 0000000..ee3c654
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlIFrameBuilder.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * HTML-based implementation of {@link IFrameBuilder}.
+ */
+public class HtmlIFrameBuilder extends HtmlElementBuilderBase<IFrameBuilder> implements
+    IFrameBuilder {
+
+  HtmlIFrameBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public IFrameBuilder frameBorder(int frameBorder) {
+    return attribute("frameBorder", frameBorder);
+  }
+
+  @Override
+  public HtmlIFrameBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean isChildElementSupported() {
+    return false;
+  }
+
+  @Override
+  public IFrameBuilder marginHeight(int marginHeight) {
+    return attribute("marginHeight", marginHeight);
+  }
+
+  @Override
+  public IFrameBuilder marginWidth(int marginWidth) {
+    return attribute("marginWidth", marginWidth);
+  }
+
+  @Override
+  public IFrameBuilder name(String name) {
+    return attribute("name", name);
+  }
+
+  @Override
+  public IFrameBuilder noResize() {
+    return attribute("noresize", "noresize");
+  }
+
+  @Override
+  public IFrameBuilder scrolling(String scrolling) {
+    return attribute("scrolling", scrolling);
+  }
+
+  @Override
+  public IFrameBuilder src(String src) {
+    return attribute("src", src);
+  }
+
+  @Override
+  public HtmlIFrameBuilder text(String text) {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlImageBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlImageBuilder.java
new file mode 100644
index 0000000..715d9c0
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlImageBuilder.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link ImageBuilder}.
+ */
+public class HtmlImageBuilder extends HtmlElementBuilderBase<ImageBuilder> implements ImageBuilder {
+
+  HtmlImageBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public ImageBuilder alt(String alt) {
+    return attribute("alt", alt);
+  }
+
+  @Override
+  public ImageBuilder height(int height) {
+    return attribute("height", height);
+  }
+
+  @Override
+  public ImageBuilder isMap() {
+    return attribute("ismap", "ismap");
+  }
+
+  @Override
+  public ImageBuilder src(String src) {
+    return attribute("src", src);
+  }
+
+  @Override
+  public ImageBuilder width(int width) {
+    return attribute("width", width);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlInputBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlInputBuilder.java
new file mode 100644
index 0000000..6d5d697
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlInputBuilder.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link InputBuilder}.
+ */
+public class HtmlInputBuilder extends HtmlElementBuilderBase<InputBuilder> implements InputBuilder {
+
+  HtmlInputBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public InputBuilder accept(String accept) {
+    return attribute("accept", accept);
+  }
+
+  @Override
+  public InputBuilder accessKey(String accessKey) {
+    return attribute("accessKey", accessKey);
+  }
+
+  @Override
+  public InputBuilder alt(String alt) {
+    return attribute("alt", alt);
+  }
+
+  @Override
+  public InputBuilder checked() {
+    return attribute("checked", "checked");
+  }
+
+  @Override
+  public InputBuilder defaultChecked() {
+    return attribute("defaultChecked", "defaultChecked");
+  }
+
+  @Override
+  public InputBuilder defaultValue(String defaultValue) {
+    return attribute("defaultValue", defaultValue);
+  }
+
+  @Override
+  public InputBuilder disabled() {
+    return attribute("disabled", "disabled");
+  }
+
+  @Override
+  public InputBuilder maxLength(int maxLength) {
+    return attribute("maxlength", maxLength);
+  }
+
+  @Override
+  public InputBuilder name(String name) {
+    return attribute("name", name);
+  }
+
+  @Override
+  public InputBuilder readOnly() {
+    return attribute("readonly", "readonly");
+  }
+
+  @Override
+  public InputBuilder size(int size) {
+    return attribute("size", size);
+  }
+
+  @Override
+  public InputBuilder src(String src) {
+    return attribute("src", src);
+  }
+
+  @Override
+  public InputBuilder value(String value) {
+    return attribute("value", value);
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlLIBuilder.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlLIBuilder.java
index e49c505..180b192 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlLIBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link LIBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlLIBuilder extends HtmlElementBuilderBase<LIBuilder> implements LIBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlLIBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlLabelBuilder.java
similarity index 60%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlLabelBuilder.java
index e49c505..77801d8 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlLabelBuilder.java
@@ -16,12 +16,21 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link LabelBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlLabelBuilder extends HtmlElementBuilderBase<LabelBuilder> implements LabelBuilder {
+
+  HtmlLabelBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
 
   @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  public LabelBuilder accessKey(String accessKey) {
+    return attribute("accessKey", accessKey);
+  }
+
+  @Override
+  public LabelBuilder htmlFor(String htmlFor) {
+    return attribute("htmlFor", htmlFor);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlLegendBuilder.java
similarity index 66%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlLegendBuilder.java
index e49c505..7aecb64 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlLegendBuilder.java
@@ -16,12 +16,17 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link LegendBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlLegendBuilder extends HtmlElementBuilderBase<LegendBuilder> implements
+    LegendBuilder {
+
+  HtmlLegendBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
 
   @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  public LegendBuilder accessKey(String accessKey) {
+    return attribute("accessKey", accessKey);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlLinkBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlLinkBuilder.java
new file mode 100644
index 0000000..ee298c3
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlLinkBuilder.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link LinkBuilder}.
+ */
+public class HtmlLinkBuilder extends HtmlElementBuilderBase<LinkBuilder> implements LinkBuilder {
+
+  HtmlLinkBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public LinkBuilder disabled() {
+    return attribute("disabled", "disabled");
+  }
+
+  @Override
+  public LinkBuilder href(String href) {
+    return attribute("href", href);
+  }
+
+  @Override
+  public LinkBuilder hreflang(String hreflang) {
+    return attribute("hreflang", hreflang);
+  }
+
+  @Override
+  public LinkBuilder media(String media) {
+    return attribute("media", media);
+  }
+
+  @Override
+  public LinkBuilder rel(String rel) {
+    return attribute("rel", rel);
+  }
+
+  @Override
+  public LinkBuilder target(String target) {
+    return attribute("target", target);
+  }
+
+  @Override
+  public LinkBuilder type(String type) {
+    return attribute("type", type);
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlMapBuilder.java
similarity index 68%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlMapBuilder.java
index e49c505..67452e0 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlMapBuilder.java
@@ -16,12 +16,16 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link MapBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlMapBuilder extends HtmlElementBuilderBase<MapBuilder> implements MapBuilder {
+
+  HtmlMapBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
 
   @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  public MapBuilder name(String name) {
+    return attribute("name", name);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlMediaBuilderBase.java b/user/src/com/google/gwt/dom/builder/shared/HtmlMediaBuilderBase.java
new file mode 100644
index 0000000..39d0998
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlMediaBuilderBase.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Base class for HTML-based implementations of {@link MediaBuilder}.
+ * 
+ * @param <R> the builder type returned from build methods
+ */
+public class HtmlMediaBuilderBase<R extends MediaBuilder<?>> extends HtmlElementBuilderBase<R>
+    implements MediaBuilder<R> {
+
+  HtmlMediaBuilderBase(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public R autoplay() {
+    return attribute("autoplay", "autoplay");
+  }
+
+  @Override
+  public R controls() {
+    return attribute("controls", "controls");
+  }
+
+  @Override
+  public R loop() {
+    return attribute("loop", "loop");
+  }
+
+  @Override
+  public R muted() {
+    return attribute("muted", "muted");
+  }
+
+  @Override
+  public R preload(String preload) {
+    return attribute("preload", preload);
+  }
+
+  @Override
+  public R src(String url) {
+    return attribute("src", url);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlMetaBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlMetaBuilder.java
new file mode 100644
index 0000000..daa1440
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlMetaBuilder.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link MetaBuilder}.
+ */
+public class HtmlMetaBuilder extends HtmlElementBuilderBase<MetaBuilder> implements MetaBuilder {
+
+  HtmlMetaBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public MetaBuilder content(String content) {
+    return attribute("content", content);
+  }
+
+  @Override
+  public MetaBuilder httpEquiv(String httpEquiv) {
+    return attribute("httpEquiv", httpEquiv);
+  }
+
+  @Override
+  public MetaBuilder name(String name) {
+    return attribute("name", name);
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlOListBuilder.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlOListBuilder.java
index e49c505..4afef94 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlOListBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link OListBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlOListBuilder extends HtmlElementBuilderBase<OListBuilder> implements OListBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlOListBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlOptGroupBuilder.java
similarity index 60%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlOptGroupBuilder.java
index e49c505..45c4570 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlOptGroupBuilder.java
@@ -16,12 +16,22 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link OptGroupBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlOptGroupBuilder extends HtmlElementBuilderBase<OptGroupBuilder> implements
+    OptGroupBuilder {
+
+  HtmlOptGroupBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
 
   @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  public OptGroupBuilder disabled() {
+    return attribute("disabled", "disabled");
+  }
+
+  @Override
+  public OptGroupBuilder label(String label) {
+    return attribute("label", label);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlOptionBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlOptionBuilder.java
index a48f5e4..53e379a 100644
--- a/user/src/com/google/gwt/dom/builder/shared/HtmlOptionBuilder.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlOptionBuilder.java
@@ -16,7 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * Implementation of {@link OptionBuilder}.
+ * HTML-based implementation of {@link OptionBuilder}.
  */
 public class HtmlOptionBuilder extends HtmlElementBuilderBase<OptionBuilder>
     implements OptionBuilder {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlParagraphBuilder.java
similarity index 72%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlParagraphBuilder.java
index e49c505..6633ecd 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlParagraphBuilder.java
@@ -16,12 +16,12 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link ParagraphBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlParagraphBuilder extends HtmlElementBuilderBase<ParagraphBuilder> implements
+    ParagraphBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlParagraphBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlParamBuilder.java
similarity index 61%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlParamBuilder.java
index e49c505..01362ad 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlParamBuilder.java
@@ -16,12 +16,21 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link ParamBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlParamBuilder extends HtmlElementBuilderBase<ParamBuilder> implements ParamBuilder {
+
+  HtmlParamBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
+  }
 
   @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  public ParamBuilder name(String name) {
+    return attribute("name", name);
+  }
+
+  @Override
+  public ParamBuilder value(String value) {
+    return attribute("value", value);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlPreBuilder.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlPreBuilder.java
index e49c505..ece8e2e 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlPreBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link PreBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlPreBuilder extends HtmlElementBuilderBase<PreBuilder> implements PreBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlPreBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlQuoteBuilder.java
similarity index 68%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlQuoteBuilder.java
index e49c505..2607465 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlQuoteBuilder.java
@@ -16,12 +16,16 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link QuoteBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlQuoteBuilder extends HtmlElementBuilderBase<QuoteBuilder> implements QuoteBuilder {
+
+  HtmlQuoteBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
 
   @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  public QuoteBuilder cite(String cite) {
+    return attribute("cite", cite);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlScriptBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlScriptBuilder.java
new file mode 100644
index 0000000..60299a3
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlScriptBuilder.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * HTML-based implementation of {@link ScriptBuilder}.
+ */
+public class HtmlScriptBuilder extends HtmlElementBuilderBase<ScriptBuilder> implements
+    ScriptBuilder {
+
+  HtmlScriptBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public ScriptBuilder defer(String defer) {
+    return attribute("defer", defer);
+  }
+
+  @Override
+  public ScriptBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public boolean isChildElementSupported() {
+    return false;
+  }
+
+  @Override
+  public ScriptBuilder src(String src) {
+    return attribute("src", src);
+  }
+
+  @Override
+  public ScriptBuilder type(String type) {
+    return attribute("type", type);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlSelectBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlSelectBuilder.java
index 9b46ed2..e9776df 100644
--- a/user/src/com/google/gwt/dom/builder/shared/HtmlSelectBuilder.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlSelectBuilder.java
@@ -16,17 +16,47 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * Implementation of {@link SelectBuilder}.
+ * HTML-based implementation of {@link SelectBuilder}.
  */
-public class HtmlSelectBuilder extends HtmlElementBuilderBase<SelectBuilder>
-    implements SelectBuilder {
+public class HtmlSelectBuilder extends HtmlElementBuilderBase<SelectBuilder> implements
+    SelectBuilder {
 
   HtmlSelectBuilder(HtmlBuilderImpl delegate) {
     super(delegate);
   }
 
   @Override
+  public SelectBuilder disabled() {
+    return attribute("disabled", "disabled");
+  }
+
+  @Override
+  public SelectBuilder multiple() {
+    return attribute("multiple", "multiple");
+  }
+
+  @Override
+  public SelectBuilder name(String name) {
+    return attribute("name", name);
+  }
+
+  @Override
+  public SelectBuilder selectedIndex(int index) {
+    return attribute("index", index);
+  }
+
+  @Override
   public SelectBuilder size(int size) {
     return attribute("size", size);
   }
+
+  @Override
+  public SelectBuilder type(String type) {
+    return attribute("type", type);
+  }
+
+  @Override
+  public SelectBuilder value(String value) {
+    return attribute("value", value);
+  }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlSourceBuilder.java
similarity index 61%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlSourceBuilder.java
index e49c505..f81c3e6 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlSourceBuilder.java
@@ -16,12 +16,22 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link SourceBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlSourceBuilder extends HtmlElementBuilderBase<SourceBuilder> implements
+    SourceBuilder {
+
+  HtmlSourceBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
+  }
 
   @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  public SourceBuilder src(String url) {
+    return attribute("url", url);
+  }
+
+  @Override
+  public SourceBuilder type(String type) {
+    return attribute("type", type);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlSpanBuilder.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlSpanBuilder.java
index e49c505..1404f34 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlSpanBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link SpanBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlSpanBuilder extends HtmlElementBuilderBase<SpanBuilder> implements SpanBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlSpanBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlStyleBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlStyleBuilder.java
new file mode 100644
index 0000000..4d9e0a7
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlStyleBuilder.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * HTML-based implementation of {@link StyleBuilder}.
+ */
+public class HtmlStyleBuilder extends HtmlElementBuilderBase<StyleBuilder> implements StyleBuilder {
+
+  HtmlStyleBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public StyleBuilder cssText(String cssText) {
+    // Append style rules as you would append inner text.
+    return super.text(cssText);
+  }
+
+  @Override
+  public StyleBuilder disabled() {
+    return attribute("disabled", "disabled");
+  }
+
+  @Override
+  public StyleBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public boolean isChildElementSupported() {
+    return false;
+  }
+
+  @Override
+  public StyleBuilder media(String media) {
+    return attribute("media", media);
+  }
+
+  @Override
+  public StyleBuilder text(String text) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public StyleBuilder type(String type) {
+    return attribute("type", type);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlTableBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlTableBuilder.java
new file mode 100644
index 0000000..0f6d02f
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlTableBuilder.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * HTML-based implementation of {@link TableBuilder}.
+ */
+public class HtmlTableBuilder extends HtmlElementBuilderBase<TableBuilder> implements TableBuilder {
+
+  HtmlTableBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, false);
+  }
+
+  @Override
+  public TableBuilder border(int border) {
+    return attribute("border", border);
+  }
+
+  @Override
+  public TableBuilder cellPadding(int cellPadding) {
+    return attribute("cellPadding", cellPadding);
+  }
+
+  @Override
+  public TableBuilder cellSpacing(int cellSpacing) {
+    return attribute("cellSpacing", cellSpacing);
+  }
+
+  @Override
+  public TableBuilder frame(String frame) {
+    return attribute("frame", frame);
+  }
+
+  @Override
+  public TableBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableBuilder rules(String rules) {
+    return attribute("rules", rules);
+  }
+
+  @Override
+  public TableBuilder text(String text) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableBuilder width(String width) {
+    return attribute("width", width);
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlTableCaptionBuilder.java
similarity index 70%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlTableCaptionBuilder.java
index e49c505..b9f7c27 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlTableCaptionBuilder.java
@@ -16,12 +16,12 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link TableCaptionBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlTableCaptionBuilder extends HtmlElementBuilderBase<TableCaptionBuilder> implements
+    TableCaptionBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlTableCaptionBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlTableCellBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlTableCellBuilder.java
new file mode 100644
index 0000000..a3b912a
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlTableCellBuilder.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link TableCellBuilder}.
+ */
+public class HtmlTableCellBuilder extends HtmlElementBuilderBase<TableCellBuilder> implements
+    TableCellBuilder {
+
+  HtmlTableCellBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public TableCellBuilder align(String align) {
+    return attribute("align", align);
+  }
+
+  @Override
+  public TableCellBuilder ch(String ch) {
+    return attribute("ch", ch);
+  }
+
+  @Override
+  public TableCellBuilder chOff(String chOff) {
+    return attribute("chOff", chOff);
+  }
+
+  @Override
+  public TableCellBuilder colSpan(int colSpan) {
+    return attribute("colSpan", colSpan);
+  }
+
+  @Override
+  public TableCellBuilder headers(String headers) {
+    return attribute("headers", headers);
+  }
+
+  @Override
+  public TableCellBuilder rowSpan(int rowSpan) {
+    return attribute("rowSpan", rowSpan);
+  }
+
+  @Override
+  public TableCellBuilder vAlign(String vAlign) {
+    return attribute("vAlign", vAlign);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlTableColBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlTableColBuilder.java
new file mode 100644
index 0000000..dd9135f
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlTableColBuilder.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link TableColBuilder}.
+ */
+public class HtmlTableColBuilder extends HtmlElementBuilderBase<TableColBuilder> implements
+    TableColBuilder {
+
+  HtmlTableColBuilder(HtmlBuilderImpl delegate) {
+    super(delegate, true);
+  }
+
+  @Override
+  public TableColBuilder align(String align) {
+    return attribute("align", align);
+  }
+
+  @Override
+  public TableColBuilder ch(String ch) {
+    return attribute("ch", ch);
+  }
+
+  @Override
+  public TableColBuilder chOff(String chOff) {
+    return attribute("chOff", chOff);
+  }
+
+  @Override
+  public TableColBuilder span(int span) {
+    return attribute("span", span);
+  }
+
+  @Override
+  public TableColBuilder vAlign(String vAlign) {
+    return attribute("vAlign", vAlign);
+  }
+
+  @Override
+  public TableColBuilder width(String width) {
+    return attribute("width", width);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlTableRowBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlTableRowBuilder.java
new file mode 100644
index 0000000..b271070
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlTableRowBuilder.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * HTML-based implementation of {@link TableRowBuilder}.
+ */
+public class HtmlTableRowBuilder extends HtmlElementBuilderBase<TableRowBuilder> implements
+    TableRowBuilder {
+
+  HtmlTableRowBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public TableRowBuilder align(String align) {
+    return attribute("align", align);
+  }
+
+  @Override
+  public TableRowBuilder ch(String ch) {
+    return attribute("ch", ch);
+  }
+
+  @Override
+  public TableRowBuilder chOff(String chOff) {
+    return attribute("chOff", chOff);
+  }
+
+  @Override
+  public TableRowBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableRowBuilder text(String text) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableRowBuilder vAlign(String vAlign) {
+    return attribute("vAlign", vAlign);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlTableSectionBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlTableSectionBuilder.java
new file mode 100644
index 0000000..252ff1e
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlTableSectionBuilder.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * HTML-based implementation of {@link TableSectionBuilder}.
+ */
+public class HtmlTableSectionBuilder extends HtmlElementBuilderBase<TableSectionBuilder> implements
+    TableSectionBuilder {
+
+  HtmlTableSectionBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public TableSectionBuilder align(String align) {
+    return attribute("align", align);
+  }
+
+  @Override
+  public TableSectionBuilder ch(String ch) {
+    return attribute("ch", ch);
+  }
+
+  @Override
+  public TableSectionBuilder chOff(String chOff) {
+    return attribute("chOff", chOff);
+  }
+
+  @Override
+  public TableSectionBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableSectionBuilder text(String text) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public TableSectionBuilder vAlign(String vAlign) {
+    return attribute("vAlign", vAlign);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlTextAreaBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlTextAreaBuilder.java
new file mode 100644
index 0000000..03a8da5
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlTextAreaBuilder.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * HTML-based implementation of {@link TextAreaBuilder}.
+ */
+public class HtmlTextAreaBuilder extends HtmlElementBuilderBase<TextAreaBuilder> implements
+    TextAreaBuilder {
+
+  HtmlTextAreaBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public TextAreaBuilder accessKey(String accessKey) {
+    return attribute("accessKey", accessKey);
+  }
+
+  @Override
+  public TextAreaBuilder cols(int cols) {
+    return attribute("cols", cols);
+  }
+
+  @Override
+  public TextAreaBuilder defaultValue(String defaultValue) {
+    return attribute("defaultValue", defaultValue);
+  }
+
+  @Override
+  public TextAreaBuilder disabled() {
+    return attribute("disabled", "disabled");
+  }
+
+  @Override
+  public TextAreaBuilder html(SafeHtml html) {
+    throw new UnsupportedOperationException(UNSUPPORTED_HTML);
+  }
+
+  @Override
+  public boolean isChildElementSupported() {
+    return false;
+  }
+
+  @Override
+  public TextAreaBuilder name(String name) {
+    return attribute("name", name);
+  }
+
+  @Override
+  public TextAreaBuilder readOnly() {
+    return attribute("readonly", "readonly");
+  }
+
+  @Override
+  public TextAreaBuilder rows(int rows) {
+    return attribute("rows", rows);
+  }
+
+  @Override
+  public TextAreaBuilder value(String value) {
+    return attribute("value", value);
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlTitleBuilder.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlTitleBuilder.java
index e49c505..ce3a61e 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlTitleBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link TitleBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlTitleBuilder extends HtmlElementBuilderBase<TitleBuilder> implements TitleBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlTitleBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/HtmlUListBuilder.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/HtmlUListBuilder.java
index e49c505..39f1de7 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlUListBuilder.java
@@ -16,12 +16,11 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * HTML-based implementation of {@link UListBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class HtmlUListBuilder extends HtmlElementBuilderBase<UListBuilder> implements UListBuilder {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
+  HtmlUListBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
   }
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlVideoBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlVideoBuilder.java
new file mode 100644
index 0000000..8791c7b
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlVideoBuilder.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * HTML-based implementation of {@link VideoBuilder}.
+ */
+public class HtmlVideoBuilder extends HtmlMediaBuilderBase<VideoBuilder> implements VideoBuilder {
+
+  HtmlVideoBuilder(HtmlBuilderImpl delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public VideoBuilder height(int height) {
+    return attribute("height", height);
+  }
+
+  @Override
+  public VideoBuilder poster(String url) {
+    return attribute("url", url);
+  }
+
+  @Override
+  public VideoBuilder width(int width) {
+    return attribute("width", width);
+  }
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/IFrameBuilder.java b/user/src/com/google/gwt/dom/builder/shared/IFrameBuilder.java
new file mode 100644
index 0000000..77835e3
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/IFrameBuilder.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * Builds an iframe element.
+ */
+public interface IFrameBuilder extends ElementBuilderBase<IFrameBuilder> {
+
+  /**
+   * Request frame borders.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-frameborder">W3C
+   *      HTML Specification</a>
+   */
+  IFrameBuilder frameBorder(int frameBorder);
+
+  /**
+   * Throws {@link UnsupportedOperationException}.
+   * 
+   * <p>
+   * Appending children or content directly to an iframe isn't supported. You
+   * must use the src attribute to specify the url of the content to load, or
+   * wait until the document is loaded.
+   * </p>
+   * 
+   * @throws UnsupportedOperationException
+   */
+  @Override
+  IFrameBuilder html(SafeHtml html);
+
+  /**
+   * Frame margin height, in pixels.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-marginheight">W3C
+   *      HTML Specification</a>
+   */
+  IFrameBuilder marginHeight(int marginHeight);
+
+  /**
+   * Frame margin width, in pixels.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-marginwidth">W3C
+   *      HTML Specification</a>
+   */
+  IFrameBuilder marginWidth(int marginWidth);
+
+  /**
+   * The frame name (object of the target attribute).
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-name-FRAME">W3C
+   *      HTML Specification</a>
+   */
+  IFrameBuilder name(String name);
+
+  /**
+   * Forbid user from resizing frame.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-noresize">W3C
+   *      HTML Specification</a>
+   */
+  IFrameBuilder noResize();
+
+  /**
+   * Specify whether or not the frame should have scrollbars.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-scrolling">W3C
+   *      HTML Specification</a>
+   */
+  IFrameBuilder scrolling(String scrolling);
+
+  /**
+   * A URI designating the initial frame contents.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-src-FRAME">W3C
+   *      HTML Specification</a>
+   */
+  IFrameBuilder src(String src);
+
+  /**
+   * Throws {@link UnsupportedOperationException}.
+   * 
+   * <p>
+   * Appending children or content directly to an iframe isn't supported. You
+   * must use the src attribute to specify the url of the content to load, or
+   * wait until the document is loaded.
+   * </p>
+   * 
+   * @throws UnsupportedOperationException
+   */
+  @Override
+  IFrameBuilder text(String html);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/ImageBuilder.java b/user/src/com/google/gwt/dom/builder/shared/ImageBuilder.java
new file mode 100644
index 0000000..290678b
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/ImageBuilder.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an image element.
+ */
+public interface ImageBuilder extends ElementBuilderBase<ImageBuilder> {
+
+  /**
+   * Alternate text for user agents not rendering the normal content of this
+   * element.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-alt">W3C
+   *      HTML Specification</a>
+   */
+  ImageBuilder alt(String alt);
+
+  /**
+   * Height of the image in pixels.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-height-IMG">W3C
+   *      HTML Specification</a>
+   */
+  ImageBuilder height(int height);
+
+  /**
+   * Use server-side image map.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-ismap">W3C
+   *      HTML Specification</a>
+   */
+  ImageBuilder isMap();
+
+  /**
+   * URI designating the source of this image.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-src-IMG">W3C
+   *      HTML Specification</a>
+   */
+  ImageBuilder src(String src);
+
+  /**
+   * The width of the image in pixels.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-width-IMG">W3C
+   *      HTML Specification</a>
+   */
+  ImageBuilder width(int width);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/InputBuilder.java b/user/src/com/google/gwt/dom/builder/shared/InputBuilder.java
new file mode 100644
index 0000000..2411ee1
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/InputBuilder.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an input element.
+ */
+public interface InputBuilder extends ElementBuilderBase<InputBuilder> {
+
+  /**
+   * A comma-separated list of content types that a server processing this form
+   * will handle correctly.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-accept">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder accept(String accept);
+
+  /**
+   * A single character access key to give access to the form control.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-accesskey">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder accessKey(String accessKey);
+
+  /**
+   * Alternate text for user agents not rendering the normal content of this
+   * element.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-alt">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder alt(String alt);
+
+  /**
+   * Set the state of the form control to <code>true</code> when type attribute
+   * of the element has the value "radio" or "checkbox".
+   */
+  InputBuilder checked();
+
+  /**
+   * Set the default state of the form control to <code>true</code> when type
+   * attribute of the element has the value "radio" or "checkbox".
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-checked">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder defaultChecked();
+
+  /**
+   * When the type attribute of the element has the value "text", "file" or
+   * "password", this represents the HTML value attribute of the element. The
+   * value of this attribute does not change if the contents of the
+   * corresponding form control, in an interactive user agent, changes.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-value-INPUT">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder defaultValue(String defaultValue);
+
+  /**
+   * Disable the control.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-disabled">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder disabled();
+
+  /**
+   * Maximum number of characters for text fields, when type has the value
+   * "text" or "password".
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-maxlength">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder maxLength(int maxLength);
+
+  /**
+   * Form control or object name when submitted with a form.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-name-INPUT">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder name(String name);
+
+  /**
+   * Make the control read-only. Relevant only when type has the value "text" or
+   * "password".
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-readonly">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder readOnly();
+
+  /**
+   * Size information. The precise meaning is specific to each type of field.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-size-INPUT">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder size(int size);
+
+  /**
+   * When the type attribute has the value "image", this attribute specifies the
+   * location of the image to be used to decorate the graphical submit button.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-src">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder src(String src);
+
+  /**
+   * When the type attribute of the element has the value "text", "file" or
+   * "password", this represents the current contents of the corresponding form
+   * control, in an interactive user agent. Changing this attribute changes the
+   * contents of the form control, but does not change the value of the HTML
+   * value attribute of the element. When the type attribute of the element has
+   * the value "button", "hidden", "submit", "reset", "image", "checkbox" or
+   * "radio", this represents the HTML value attribute of the element.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-value-INPUT">W3C
+   *      HTML Specification</a>
+   */
+  InputBuilder value(String value);
+
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/LIBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/LIBuilder.java
index e49c505..2664f55 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/LIBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an li element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface LIBuilder extends ElementBuilderBase<LIBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/LabelBuilder.java b/user/src/com/google/gwt/dom/builder/shared/LabelBuilder.java
new file mode 100644
index 0000000..debe8b4
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/LabelBuilder.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an label element.
+ */
+public interface LabelBuilder extends ElementBuilderBase<LabelBuilder> {
+
+  /**
+   * A single character access key to give access to the form control.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-accesskey">W3C
+   *      HTML Specification</a>
+   */
+  LabelBuilder accessKey(String accessKey);
+
+  /**
+   * This attribute links this label with another form control by id attribute.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-for">W3C
+   *      HTML Specification</a>
+   */
+  LabelBuilder htmlFor(String htmlFor);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/LegendBuilder.java
similarity index 62%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/LegendBuilder.java
index e49c505..ffb26c3 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/LegendBuilder.java
@@ -16,12 +16,16 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an legend element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public interface LegendBuilder extends ElementBuilderBase<LegendBuilder> {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+  /**
+   * A single character access key to give access to the form control.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-accesskey">W3C
+   *      HTML Specification</a>
+   */
+  LegendBuilder accessKey(String accessKey);
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/LinkBuilder.java b/user/src/com/google/gwt/dom/builder/shared/LinkBuilder.java
new file mode 100644
index 0000000..c0848db
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/LinkBuilder.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an link element.
+ */
+public interface LinkBuilder extends ElementBuilderBase<LinkBuilder> {
+
+  /**
+   * Disable the link. This is currently only used for style sheet links, and
+   * may be used to deactivate style sheets.
+   */
+  LinkBuilder disabled();
+
+  /**
+   * The URI of the linked resource.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-href">W3C
+   *      HTML Specification</a>
+   */
+  LinkBuilder href(String href);
+
+  /**
+   * Language code of the linked resource.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-hreflang">W3C
+   *      HTML Specification</a>
+   */
+  LinkBuilder hreflang(String hreflang);
+
+  /**
+   * Designed for use with one or more target media.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/styles.html#adef-media">W3C
+   *      HTML Specification</a>
+   */
+  LinkBuilder media(String media);
+
+  /**
+   * Forward link type.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-rel">W3C
+   *      HTML Specification</a>
+   */
+  LinkBuilder rel(String rel);
+
+  /**
+   * Frame to render the resource in.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/frames.html#adef-target">W3C
+   *      HTML Specification</a>
+   */
+  LinkBuilder target(String target);
+
+  /**
+   * Advisory content type.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#adef-type-A">W3C
+   *      HTML Specification</a>
+   */
+  LinkBuilder type(String type);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/MapBuilder.java
similarity index 65%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/MapBuilder.java
index e49c505..bd21f23 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/MapBuilder.java
@@ -16,12 +16,16 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an map element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public interface MapBuilder extends ElementBuilderBase<MapBuilder> {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+  /**
+   * Names the map (for use with usemap).
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-name-MAP">W3C
+   *      HTML Specification</a>
+   */
+  MapBuilder name(String name);
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/MediaBuilder.java b/user/src/com/google/gwt/dom/builder/shared/MediaBuilder.java
new file mode 100644
index 0000000..6a28bfa
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/MediaBuilder.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Common superclass for Audio and Video builders.
+ * 
+ * @param <T> the builder type returns from build methods
+ */
+public interface MediaBuilder<T extends ElementBuilderBase<?>> extends ElementBuilderBase<T> {
+
+  /**
+   * Enable autoplay of the resource.
+   */
+  T autoplay();
+
+  /**
+   * Enable interactive controls.
+   */
+  T controls();
+
+  /**
+   * Enable looping.
+   */
+  T loop();
+
+  /**
+   * Enable muting.
+   */
+  T muted();
+
+  /**
+   * Set the preload setting to one of
+   * {@link com.google.gwt.dom.client.MediaElement#PRELOAD_AUTO},
+   * {@link com.google.gwt.dom.client.MediaElement#PRELOAD_METADATA}, or
+   * {@link com.google.gwt.dom.client.MediaElement#PRELOAD_NONE}.
+   * 
+   * @param preload a String constants
+   */
+  T preload(String preload);
+
+  /**
+   * Sets the source URL for the media.
+   */
+  T src(String url);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/MetaBuilder.java b/user/src/com/google/gwt/dom/builder/shared/MetaBuilder.java
new file mode 100644
index 0000000..c59094d
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/MetaBuilder.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an meta element.
+ */
+public interface MetaBuilder extends ElementBuilderBase<MetaBuilder> {
+
+  /**
+   * Associated information.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/global.html#adef-content">W3C
+   *      HTML Specification</a>
+   */
+  MetaBuilder content(String content);
+
+  /**
+   * HTTP response header name [IETF RFC 2616].
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/global.html#adef-http-equiv">W3C
+   *      HTML Specification</a>
+   */
+  MetaBuilder httpEquiv(String httpEquiv);
+
+  /**
+   * Meta information name.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/global.html#adef-name-META">W3C
+   *      HTML Specification</a>
+   */
+  MetaBuilder name(String name);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/ModBuilder.java b/user/src/com/google/gwt/dom/builder/shared/ModBuilder.java
new file mode 100644
index 0000000..070b306
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/ModBuilder.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an mod element.
+ */
+public interface ModBuilder extends ElementBuilderBase<ModBuilder> {
+
+  /**
+   * A URI designating a document that describes the reason for the change.
+   * 
+   * @see <a href="http://www.w3.org/TR/1999/REC-html401-19991224/">W3C HTML Specification</a>
+   */
+  ModBuilder cite(String cite);
+
+  /**
+   * The date and time of the change.
+   * 
+   * @see <a href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/text.html#adef-datetime">W3C HTML Specification</a>
+   */
+  ModBuilder dateTime(String dateTime);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/OListBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/OListBuilder.java
index e49c505..d1b93a3 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/OListBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an olist element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface OListBuilder extends ElementBuilderBase<OListBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/OptGroupBuilder.java b/user/src/com/google/gwt/dom/builder/shared/OptGroupBuilder.java
new file mode 100644
index 0000000..f215848
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/OptGroupBuilder.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an optgroup element.
+ */
+public interface OptGroupBuilder extends ElementBuilderBase<OptGroupBuilder> {
+
+  /**
+   * Disable the control.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-disabled">W3C
+   *      HTML Specification</a>
+   */
+  OptGroupBuilder disabled();
+
+  /**
+   * Assigns a label to this option group.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-label-OPTGROUP">W3C
+   *      HTML Specification</a>
+   */
+  OptGroupBuilder label(String label);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/ParagraphBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/ParagraphBuilder.java
index e49c505..c55a7d6 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/ParagraphBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an paragraph element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface ParagraphBuilder extends ElementBuilderBase<ParagraphBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/ParamBuilder.java b/user/src/com/google/gwt/dom/builder/shared/ParamBuilder.java
new file mode 100644
index 0000000..cbddd57
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/ParamBuilder.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an param element.
+ */
+public interface ParamBuilder extends ElementBuilderBase<ParamBuilder> {
+
+  /**
+   * The name of a run-time parameter.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-name-PARAM">W3C
+   *      HTML Specification</a>
+   */
+  ParamBuilder name(String name);
+
+  /**
+   * The value of a run-time parameter.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html#adef-value-PARAM">W3C
+   *      HTML Specification</a>
+   */
+  ParamBuilder value(String value);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/PreBuilder.java
similarity index 77%
rename from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
rename to user/src/com/google/gwt/dom/builder/shared/PreBuilder.java
index e49c505..74c9b8d 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/PreBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an pre element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface PreBuilder extends ElementBuilderBase<PreBuilder> {
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/QuoteBuilder.java
similarity index 64%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/QuoteBuilder.java
index e49c505..a533e1a 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/QuoteBuilder.java
@@ -16,12 +16,16 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an quote element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public interface QuoteBuilder extends ElementBuilderBase<QuoteBuilder> {
 
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+  /**
+   * A URI designating a source document or message.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/text.html#adef-cite-Q">W3C
+   *      HTML Specification</a>
+   */
+  QuoteBuilder cite(String cite);
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/ScriptBuilder.java b/user/src/com/google/gwt/dom/builder/shared/ScriptBuilder.java
new file mode 100644
index 0000000..d631da3
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/ScriptBuilder.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an script element.
+ */
+public interface ScriptBuilder extends ElementBuilderBase<ScriptBuilder> {
+
+  String UNSUPPORTED_HTML = "Script elements do not support html.  Use text() instead.";
+
+  /**
+   * Indicates that the user agent can defer processing of the script.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/scripts.html#adef-defer">W3C
+   *      HTML Specification</a>
+   */
+  ScriptBuilder defer(String defer);
+
+  /**
+   * URI designating an external script.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/scripts.html#adef-src-SCRIPT">W3C
+   *      HTML Specification</a>
+   */
+  ScriptBuilder src(String src);
+
+  /**
+   * The content type of the script language.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/scripts.html#adef-type-SCRIPT">W3C
+   *      HTML Specification</a>
+   */
+  ScriptBuilder type(String type);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/SelectBuilder.java b/user/src/com/google/gwt/dom/builder/shared/SelectBuilder.java
index 3f4cb3d..c99a22a 100644
--- a/user/src/com/google/gwt/dom/builder/shared/SelectBuilder.java
+++ b/user/src/com/google/gwt/dom/builder/shared/SelectBuilder.java
@@ -16,15 +16,63 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * Builds a select element.
+ * Builds an select element.
  */
 public interface SelectBuilder extends ElementBuilderBase<SelectBuilder> {
 
   /**
-   * Set the size of the list.
+   * Disable the select box.
    * 
-   * @param size the size
-   * @return this builder
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-disabled">W3C
+   *      HTML Specification</a>
+   */
+  SelectBuilder disabled();
+
+  /**
+   * Allow multiple options to be selected.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-multiple">W3C
+   *      HTML Specification</a>
+   */
+  SelectBuilder multiple();
+
+  /**
+   * Form control or object name when submitted with a form.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-name-SELECT">W3C
+   *      HTML Specification</a>
+   */
+  SelectBuilder name(String name);
+
+  /**
+   * The ordinal index of the selected option, starting from 0. The value -1 is
+   * returned if no element is selected. If multiple options are selected, the
+   * index of the first selected option is returned.
+   */
+  SelectBuilder selectedIndex(int index);
+
+  /**
+   * Number of visible rows.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-size-SELECT">W3C
+   *      HTML Specification</a>
    */
   SelectBuilder size(int size);
+
+  /**
+   * The type of this form control. This is the string "select-multiple" when
+   * the multiple attribute is true and the string "select-one" when false.
+   */
+  SelectBuilder type(String type);
+
+  /**
+   * The current form control value (i.e., the value of the currently selected
+   * option), if multiple options are selected this is the value of the first
+   * selected option.
+   */
+  SelectBuilder value(String value);
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/SourceBuilder.java b/user/src/com/google/gwt/dom/builder/shared/SourceBuilder.java
new file mode 100644
index 0000000..02b8b52
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/SourceBuilder.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an source element.
+ */
+public interface SourceBuilder extends ElementBuilderBase<SourceBuilder> {
+
+  /**
+   * Sets the source URL for the media.
+   * 
+   * @param url a String URL
+   */
+  SourceBuilder src(String url);
+
+  /**
+   * Sets the type of media represented by the src. The browser will look at the
+   * type when deciding which source files to request from the server.
+   * 
+   * 
+   * @param type the media type
+   * @see com.google.gwt.dom.client.SourceElement#setType(String)
+   */
+  SourceBuilder type(String type);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/SpanBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/SpanBuilder.java
index e49c505..b7d29b2 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/SpanBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an span element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface SpanBuilder extends ElementBuilderBase<SpanBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/StyleBuilder.java b/user/src/com/google/gwt/dom/builder/shared/StyleBuilder.java
new file mode 100644
index 0000000..14367d1
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/StyleBuilder.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * Builds an style element.
+ */
+public interface StyleBuilder extends ElementBuilderBase<StyleBuilder> {
+
+  String UNSUPPORTED_HTML =
+      "Style elements do not support setting inner html or inner text.  Use cssText() instead.";
+
+  /**
+   * Sets the CSS text.
+   */
+  StyleBuilder cssText(String cssText);
+
+  /**
+   * Disable the style sheet.
+   */
+  StyleBuilder disabled();
+
+  /**
+   * Throws {@link UnsupportedOperationException}.
+   * 
+   * <p>
+   * Style elements do not support html. Use {@link #cssText(String)} instead.
+   * </p>
+   * 
+   * @throws UnsupportedOperationException
+   */
+  @Override
+  StyleBuilder html(SafeHtml html);
+
+  /**
+   * Designed for use with one or more target media.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/styles.html#adef-media">W3C
+   *      HTML Specification</a>
+   */
+  StyleBuilder media(String media);
+
+  /**
+   * Throws {@link UnsupportedOperationException}.
+   * 
+   * <p>
+   * Style elements do not support text. Use {@link #cssText(String)} instead.
+   * </p>
+   * 
+   * @throws UnsupportedOperationException
+   */
+  @Override
+  StyleBuilder text(String text);
+
+  /**
+   * The content type of the style sheet language.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/present/styles.html#adef-type-STYLE">W3C
+   *      HTML Specification</a>
+   */
+  StyleBuilder type(String type);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/TableBuilder.java b/user/src/com/google/gwt/dom/builder/shared/TableBuilder.java
new file mode 100644
index 0000000..d6d3830
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/TableBuilder.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an table element.
+ */
+public interface TableBuilder extends ElementBuilderBase<TableBuilder> {
+
+  String UNSUPPORTED_HTML = "Table elements do not support setting inner html. Use "
+      + "startTBody/startTFoot/startTHead() instead to append a table section to the table.";
+
+  /**
+   * The width of the border around the table.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-border-TABLE">W3C
+   *      HTML Specification</a>
+   */
+  TableBuilder border(int border);
+
+  /**
+   * Specifies the horizontal and vertical space between cell content and cell
+   * borders.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-cellpadding">W3C
+   *      HTML Specification</a>
+   */
+  TableBuilder cellPadding(int cellPadding);
+
+  /**
+   * Specifies the horizontal and vertical separation between cells.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-cellspacing">W3C
+   *      HTML Specification</a>
+   */
+  TableBuilder cellSpacing(int cellSpacing);
+
+  /**
+   * Specifies which external table borders to render.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-frame">W3C
+   *      HTML Specification</a>
+   */
+  TableBuilder frame(String frame);
+
+  /**
+   * Specifies which internal table borders to render.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-rules">W3C
+   *      HTML Specification</a>
+   */
+  TableBuilder rules(String rules);
+
+  /**
+   * Specifies the desired table width.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-width-TABLE">W3C
+   *      HTML Specification</a>
+   */
+  TableBuilder width(String width);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/TableCaptionBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/TableCaptionBuilder.java
index e49c505..410b14a 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/TableCaptionBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an tablecaption element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface TableCaptionBuilder extends ElementBuilderBase<TableCaptionBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/TableCellBuilder.java b/user/src/com/google/gwt/dom/builder/shared/TableCellBuilder.java
new file mode 100644
index 0000000..65e04d8
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/TableCellBuilder.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an tablecell element.
+ */
+public interface TableCellBuilder extends ElementBuilderBase<TableCellBuilder> {
+
+  /**
+   * Horizontal alignment of data in cell.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-align-TD">W3C
+   *      HTML Specification</a>
+   */
+  TableCellBuilder align(String align);
+
+  /**
+   * Alignment character for cells in a column.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-char">W3C
+   *      HTML Specification</a>
+   */
+  TableCellBuilder ch(String ch);
+
+  /**
+   * Offset of alignment character.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-charoff">W3C
+   *      HTML Specification</a>
+   */
+  TableCellBuilder chOff(String chOff);
+
+  /**
+   * Number of columns spanned by cell.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-colspan">W3C
+   *      HTML Specification</a>
+   */
+  TableCellBuilder colSpan(int colSpan);
+
+  /**
+   * List of id attribute values for header cells.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-headers">W3C
+   *      HTML Specification</a>
+   */
+  TableCellBuilder headers(String headers);
+
+  /**
+   * Number of rows spanned by cell.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-rowspan">W3C
+   *      HTML Specification</a>
+   */
+  TableCellBuilder rowSpan(int rowSpan);
+
+  /**
+   * Vertical alignment of data in cell.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-valign">W3C
+   *      HTML Specification</a>
+   */
+  TableCellBuilder vAlign(String vAlign);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/TableColBuilder.java b/user/src/com/google/gwt/dom/builder/shared/TableColBuilder.java
new file mode 100644
index 0000000..e55e072
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/TableColBuilder.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an tablecol element.
+ */
+public interface TableColBuilder extends ElementBuilderBase<TableColBuilder> {
+
+  /**
+   * Horizontal alignment of cell data in column.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-align-TD">W3C
+   *      HTML Specification</a>
+   */
+  TableColBuilder align(String align);
+
+  /**
+   * Alignment character for cells in a column.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-char">W3C
+   *      HTML Specification</a>
+   */
+  TableColBuilder ch(String ch);
+
+  /**
+   * Offset of alignment character.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-charoff">W3C
+   *      HTML Specification</a>
+   */
+  TableColBuilder chOff(String chOff);
+
+  /**
+   * Indicates the number of columns in a group or affected by a grouping.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-span-COL">W3C
+   *      HTML Specification</a>
+   */
+  TableColBuilder span(int span);
+
+  /**
+   * Vertical alignment of cell data in column.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-valign">W3C
+   *      HTML Specification</a>
+   */
+  TableColBuilder vAlign(String vAlign);
+
+  /**
+   * Default column width.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-width-COL">W3C
+   *      HTML Specification</a>
+   */
+  TableColBuilder width(String width);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/TableRowBuilder.java b/user/src/com/google/gwt/dom/builder/shared/TableRowBuilder.java
new file mode 100644
index 0000000..ae0dafb
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/TableRowBuilder.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an tablerow element.
+ */
+public interface TableRowBuilder extends ElementBuilderBase<TableRowBuilder> {
+
+  String UNSUPPORTED_HTML = "Table row elements do not support setting inner html or text. "
+      + "Use startTD/startTH() instead to append a table cell to the section.";
+
+  /**
+   * Horizontal alignment of data within cells of this row.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-align-TD">W3C
+   *      HTML Specification</a>
+   */
+  TableRowBuilder align(String align);
+
+  /**
+   * Alignment character for cells in a column.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-char">W3C
+   *      HTML Specification</a>
+   */
+  TableRowBuilder ch(String ch);
+
+  /**
+   * Offset of alignment character.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-charoff">W3C
+   *      HTML Specification</a>
+   */
+  TableRowBuilder chOff(String chOff);
+
+  /**
+   * Vertical alignment of data within cells of this row.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-valign">W3C
+   *      HTML Specification</a>
+   */
+  TableRowBuilder vAlign(String vAlign);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/TableSectionBuilder.java b/user/src/com/google/gwt/dom/builder/shared/TableSectionBuilder.java
new file mode 100644
index 0000000..60e4461
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/TableSectionBuilder.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an tablesection element.
+ */
+public interface TableSectionBuilder extends ElementBuilderBase<TableSectionBuilder> {
+
+  String UNSUPPORTED_HTML = "Table section elements do not support setting inner html or text. "
+      + "Use startTR() instead to append a table row to the section.";
+
+  /**
+   * Horizontal alignment of data in cells. See the align attribute for
+   * HTMLTheadElement for details.
+   */
+  TableSectionBuilder align(String align);
+
+  /**
+   * Alignment character for cells in a column.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-char">W3C
+   *      HTML Specification</a>
+   */
+  TableSectionBuilder ch(String ch);
+
+  /**
+   * Offset of alignment character.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/tables.html#adef-charoff">W3C
+   *      HTML Specification</a>
+   */
+  TableSectionBuilder chOff(String chOff);
+
+  /**
+   * Vertical alignment of data in cells. See the valign attribute for
+   * HTMLTheadElement for details.
+   */
+  TableSectionBuilder vAlign(String vAlign);
+}
diff --git a/user/src/com/google/gwt/dom/builder/shared/TextAreaBuilder.java b/user/src/com/google/gwt/dom/builder/shared/TextAreaBuilder.java
new file mode 100644
index 0000000..07453bd
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/TextAreaBuilder.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an textarea element.
+ */
+public interface TextAreaBuilder extends ElementBuilderBase<TextAreaBuilder> {
+
+  String UNSUPPORTED_HTML =
+      "TextArea elements do not support setting inner html.  Use text() instead.";
+
+  /**
+   * A single character access key to give access to the form control.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-accesskey">W3C
+   *      HTML Specification</a>
+   */
+  TextAreaBuilder accessKey(String accessKey);
+
+  /**
+   * Width of control (in characters).
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-cols-TEXTAREA">W3C
+   *      HTML Specification</a>
+   */
+  TextAreaBuilder cols(int cols);
+
+  /**
+   * Represents the contents of the element. The value of this attribute does
+   * not change if the contents of the corresponding form control, in an
+   * interactive user agent, changes.
+   */
+  TextAreaBuilder defaultValue(String defaultValue);
+
+  /**
+   * Disable this control.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-disabled">W3C
+   *      HTML Specification</a>
+   */
+  TextAreaBuilder disabled();
+
+  /**
+   * Form control or object name when submitted with a form.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-name-TEXTAREA">W3C
+   *      HTML Specification</a>
+   */
+  TextAreaBuilder name(String name);
+
+  /**
+   * Make control is read-only.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-readonly">W3C
+   *      HTML Specification</a>
+   */
+  TextAreaBuilder readOnly();
+
+  /**
+   * Number of text rows.
+   * 
+   * @see <a
+   *      href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-rows-TEXTAREA">W3C
+   *      HTML Specification</a>
+   */
+  TextAreaBuilder rows(int rows);
+
+  /**
+   * Represents the current contents of the corresponding form control, in an
+   * interactive user agent. Changing this attribute changes the contents of the
+   * form control, but does not change the contents of the element. If the
+   * entirety of the data can not fit into a single string, the implementation
+   * may truncate the data.
+   */
+  TextAreaBuilder value(String value);
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/TitleBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/TitleBuilder.java
index e49c505..01232ce 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/TitleBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an title element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface TitleBuilder extends ElementBuilderBase<TitleBuilder> {
 }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/src/com/google/gwt/dom/builder/shared/UListBuilder.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/src/com/google/gwt/dom/builder/shared/UListBuilder.java
index e49c505..27db1b8 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/src/com/google/gwt/dom/builder/shared/UListBuilder.java
@@ -16,12 +16,7 @@
 package com.google.gwt.dom.builder.shared;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Builds an ulist element.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
+public interface UListBuilder extends ElementBuilderBase<UListBuilder> {
 }
diff --git a/user/src/com/google/gwt/dom/builder/shared/VideoBuilder.java b/user/src/com/google/gwt/dom/builder/shared/VideoBuilder.java
new file mode 100644
index 0000000..eb61923
--- /dev/null
+++ b/user/src/com/google/gwt/dom/builder/shared/VideoBuilder.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Builds an video element.
+ */
+public interface VideoBuilder extends MediaBuilder<VideoBuilder> {
+
+  /**
+   * Sets the height of the element.
+   * 
+   * @param height the height, in pixels
+   */
+  VideoBuilder height(int height);
+
+  /**
+   * Sets the poster URL.
+   * 
+   * @param url the poster image URL
+   */
+  VideoBuilder poster(String url);
+
+  /**
+   * Sets the width of the element.
+   * 
+   * @param width the width, in pixels
+   */
+  VideoBuilder width(int width);
+}
diff --git a/user/src/com/google/gwt/dom/client/AnchorElement.java b/user/src/com/google/gwt/dom/client/AnchorElement.java
index 64424f1..67372cc 100644
--- a/user/src/com/google/gwt/dom/client/AnchorElement.java
+++ b/user/src/com/google/gwt/dom/client/AnchorElement.java
@@ -23,7 +23,7 @@
 @TagName(AnchorElement.TAG)
 public class AnchorElement extends Element {
 
-  static final String TAG = "a";
+  public static final String TAG = "a";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/AreaElement.java b/user/src/com/google/gwt/dom/client/AreaElement.java
index 0db4806..af2fe3a 100644
--- a/user/src/com/google/gwt/dom/client/AreaElement.java
+++ b/user/src/com/google/gwt/dom/client/AreaElement.java
@@ -23,7 +23,7 @@
 @TagName(AreaElement.TAG)
 public class AreaElement extends Element {
 
-  static final String TAG = "area";
+  public static final String TAG = "area";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/BRElement.java b/user/src/com/google/gwt/dom/client/BRElement.java
index 91e5e77..4df54e9 100644
--- a/user/src/com/google/gwt/dom/client/BRElement.java
+++ b/user/src/com/google/gwt/dom/client/BRElement.java
@@ -23,7 +23,7 @@
 @TagName(BRElement.TAG)
 public class BRElement extends Element {
 
-  static final String TAG = "br";
+  public static final String TAG = "br";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/BaseElement.java b/user/src/com/google/gwt/dom/client/BaseElement.java
index e1fc139..2bbea53 100644
--- a/user/src/com/google/gwt/dom/client/BaseElement.java
+++ b/user/src/com/google/gwt/dom/client/BaseElement.java
@@ -23,7 +23,7 @@
 @TagName(BaseElement.TAG)
 public class BaseElement extends Element {
 
-  static final String TAG = "base";
+  public static final String TAG = "base";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/BodyElement.java b/user/src/com/google/gwt/dom/client/BodyElement.java
index d33368b..ed608bf 100644
--- a/user/src/com/google/gwt/dom/client/BodyElement.java
+++ b/user/src/com/google/gwt/dom/client/BodyElement.java
@@ -24,7 +24,7 @@
 @TagName(BodyElement.TAG)
 public class BodyElement extends Element {
 
-  static final String TAG = "body";
+  public static final String TAG = "body";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/ButtonElement.java b/user/src/com/google/gwt/dom/client/ButtonElement.java
index dcc5a1d..cf67db9 100644
--- a/user/src/com/google/gwt/dom/client/ButtonElement.java
+++ b/user/src/com/google/gwt/dom/client/ButtonElement.java
@@ -23,7 +23,7 @@
 @TagName(ButtonElement.TAG)
 public class ButtonElement extends Element {
 
-  static final String TAG = "button";
+  public static final String TAG = "button";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/DListElement.java b/user/src/com/google/gwt/dom/client/DListElement.java
index d814cc3..b075671 100644
--- a/user/src/com/google/gwt/dom/client/DListElement.java
+++ b/user/src/com/google/gwt/dom/client/DListElement.java
@@ -23,7 +23,7 @@
 @TagName(DListElement.TAG)
 public class DListElement extends Element {
 
-  static final String TAG = "dl";
+  public static final String TAG = "dl";
 
   public static DListElement as(Element elem) {
     assert elem.getTagName().equalsIgnoreCase(TAG);
diff --git a/user/src/com/google/gwt/dom/client/DivElement.java b/user/src/com/google/gwt/dom/client/DivElement.java
index 3261e01..fb50b7f 100644
--- a/user/src/com/google/gwt/dom/client/DivElement.java
+++ b/user/src/com/google/gwt/dom/client/DivElement.java
@@ -23,7 +23,7 @@
 @TagName(DivElement.TAG)
 public class DivElement extends Element {
 
-  static final String TAG = "div";
+  public static final String TAG = "div";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/FieldSetElement.java b/user/src/com/google/gwt/dom/client/FieldSetElement.java
index 0e9860c..96eb1b8 100644
--- a/user/src/com/google/gwt/dom/client/FieldSetElement.java
+++ b/user/src/com/google/gwt/dom/client/FieldSetElement.java
@@ -23,7 +23,7 @@
 @TagName(FieldSetElement.TAG)
 public class FieldSetElement extends Element {
 
-  static final String TAG = "fieldset";
+  public static final String TAG = "fieldset";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/FormElement.java b/user/src/com/google/gwt/dom/client/FormElement.java
index 8434ef8..4784490 100644
--- a/user/src/com/google/gwt/dom/client/FormElement.java
+++ b/user/src/com/google/gwt/dom/client/FormElement.java
@@ -25,7 +25,7 @@
 @TagName(FormElement.TAG)
 public class FormElement extends Element {
 
-  static final String TAG = "form";
+  public static final String TAG = "form";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/FrameElement.java b/user/src/com/google/gwt/dom/client/FrameElement.java
index 05686c6..d8662ce 100644
--- a/user/src/com/google/gwt/dom/client/FrameElement.java
+++ b/user/src/com/google/gwt/dom/client/FrameElement.java
@@ -23,7 +23,7 @@
 @TagName(FrameElement.TAG)
 public class FrameElement extends Element {
 
-  static final String TAG = "frame";
+  public static final String TAG = "frame";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/FrameSetElement.java b/user/src/com/google/gwt/dom/client/FrameSetElement.java
index e97d9e8..0c24646 100644
--- a/user/src/com/google/gwt/dom/client/FrameSetElement.java
+++ b/user/src/com/google/gwt/dom/client/FrameSetElement.java
@@ -23,7 +23,7 @@
 @TagName(FrameSetElement.TAG)
 public class FrameSetElement extends Element {
 
-  static final String TAG = "frameset";
+  public static final String TAG = "frameset";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/HRElement.java b/user/src/com/google/gwt/dom/client/HRElement.java
index 959f018..501c64a 100644
--- a/user/src/com/google/gwt/dom/client/HRElement.java
+++ b/user/src/com/google/gwt/dom/client/HRElement.java
@@ -23,7 +23,7 @@
 @TagName(HRElement.TAG)
 public class HRElement extends Element {
 
-  static final String TAG = "hr";
+  public static final String TAG = "hr";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/HeadElement.java b/user/src/com/google/gwt/dom/client/HeadElement.java
index 6cd6c60..cf2a25b 100644
--- a/user/src/com/google/gwt/dom/client/HeadElement.java
+++ b/user/src/com/google/gwt/dom/client/HeadElement.java
@@ -23,7 +23,7 @@
 @TagName(HeadElement.TAG)
 public class HeadElement extends Element {
 
-  static final String TAG = "head";
+  public static final String TAG = "head";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/HeadingElement.java b/user/src/com/google/gwt/dom/client/HeadingElement.java
index a21532f..013ede0 100644
--- a/user/src/com/google/gwt/dom/client/HeadingElement.java
+++ b/user/src/com/google/gwt/dom/client/HeadingElement.java
@@ -30,12 +30,12 @@
       HeadingElement.TAG_H1, HeadingElement.TAG_H2, HeadingElement.TAG_H3,
       HeadingElement.TAG_H4, HeadingElement.TAG_H5, HeadingElement.TAG_H6};
 
-  static final String TAG_H1 = "h1";
-  static final String TAG_H2 = "h2";
-  static final String TAG_H3 = "h3";
-  static final String TAG_H4 = "h4";
-  static final String TAG_H5 = "h5";
-  static final String TAG_H6 = "h6";
+  public static final String TAG_H1 = "h1";
+  public static final String TAG_H2 = "h2";
+  public static final String TAG_H3 = "h3";
+  public static final String TAG_H4 = "h4";
+  public static final String TAG_H5 = "h5";
+  public static final String TAG_H6 = "h6";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/IFrameElement.java b/user/src/com/google/gwt/dom/client/IFrameElement.java
index 5c8dc74..8581e43 100644
--- a/user/src/com/google/gwt/dom/client/IFrameElement.java
+++ b/user/src/com/google/gwt/dom/client/IFrameElement.java
@@ -23,7 +23,7 @@
 @TagName(IFrameElement.TAG)
 public class IFrameElement extends Element {
 
-  static final String TAG = "iframe";
+  public static final String TAG = "iframe";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/ImageElement.java b/user/src/com/google/gwt/dom/client/ImageElement.java
index 73e7fa8..054935f 100644
--- a/user/src/com/google/gwt/dom/client/ImageElement.java
+++ b/user/src/com/google/gwt/dom/client/ImageElement.java
@@ -23,7 +23,7 @@
 @TagName(ImageElement.TAG)
 public class ImageElement extends Element {
 
-  static final String TAG = "img";
+  public static final String TAG = "img";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/InputElement.java b/user/src/com/google/gwt/dom/client/InputElement.java
index bec23df..9d65812 100644
--- a/user/src/com/google/gwt/dom/client/InputElement.java
+++ b/user/src/com/google/gwt/dom/client/InputElement.java
@@ -28,7 +28,7 @@
 @TagName(InputElement.TAG)
 public class InputElement extends Element {
 
-  static final String TAG = "input";
+  public static final String TAG = "input";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/LIElement.java b/user/src/com/google/gwt/dom/client/LIElement.java
index 66a1398..b88d0b0 100644
--- a/user/src/com/google/gwt/dom/client/LIElement.java
+++ b/user/src/com/google/gwt/dom/client/LIElement.java
@@ -23,7 +23,7 @@
 @TagName(LIElement.TAG)
 public class LIElement extends Element {
 
-  static final String TAG = "li";
+  public static final String TAG = "li";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/LabelElement.java b/user/src/com/google/gwt/dom/client/LabelElement.java
index 3b673d1..78dd726 100644
--- a/user/src/com/google/gwt/dom/client/LabelElement.java
+++ b/user/src/com/google/gwt/dom/client/LabelElement.java
@@ -23,7 +23,7 @@
 @TagName(LabelElement.TAG)
 public class LabelElement extends Element {
 
-  static final String TAG = "label";
+  public static final String TAG = "label";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/LegendElement.java b/user/src/com/google/gwt/dom/client/LegendElement.java
index b87508f..6c39aa0 100644
--- a/user/src/com/google/gwt/dom/client/LegendElement.java
+++ b/user/src/com/google/gwt/dom/client/LegendElement.java
@@ -23,7 +23,7 @@
 @TagName(LegendElement.TAG)
 public class LegendElement extends Element {
 
-  static final String TAG = "legend";
+  public static final String TAG = "legend";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/LinkElement.java b/user/src/com/google/gwt/dom/client/LinkElement.java
index 7169bc2..e93e529 100644
--- a/user/src/com/google/gwt/dom/client/LinkElement.java
+++ b/user/src/com/google/gwt/dom/client/LinkElement.java
@@ -24,7 +24,7 @@
 @TagName(LinkElement.TAG)
 public class LinkElement extends Element {
 
-  static final String TAG = "link";
+  public static final String TAG = "link";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/MapElement.java b/user/src/com/google/gwt/dom/client/MapElement.java
index 0e9a6ef..f258eef 100644
--- a/user/src/com/google/gwt/dom/client/MapElement.java
+++ b/user/src/com/google/gwt/dom/client/MapElement.java
@@ -23,7 +23,7 @@
 @TagName(MapElement.TAG)
 public class MapElement extends Element {
 
-  static final String TAG = "map";
+  public static final String TAG = "map";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/MetaElement.java b/user/src/com/google/gwt/dom/client/MetaElement.java
index ec5a786..38ee72d 100644
--- a/user/src/com/google/gwt/dom/client/MetaElement.java
+++ b/user/src/com/google/gwt/dom/client/MetaElement.java
@@ -23,7 +23,7 @@
 @TagName(MetaElement.TAG)
 public class MetaElement extends Element {
 
-  static final String TAG = "meta";
+  public static final String TAG = "meta";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/ModElement.java b/user/src/com/google/gwt/dom/client/ModElement.java
index b06a5a0..f2d7d21 100644
--- a/user/src/com/google/gwt/dom/client/ModElement.java
+++ b/user/src/com/google/gwt/dom/client/ModElement.java
@@ -24,8 +24,8 @@
 @TagName({ModElement.TAG_INS, ModElement.TAG_DEL})
 public class ModElement extends Element {
 
-  static final String TAG_INS = "ins";
-  static final String TAG_DEL = "del";
+  public static final String TAG_INS = "ins";
+  public static final String TAG_DEL = "del";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/OListElement.java b/user/src/com/google/gwt/dom/client/OListElement.java
index 6323dbe..53b15ac 100644
--- a/user/src/com/google/gwt/dom/client/OListElement.java
+++ b/user/src/com/google/gwt/dom/client/OListElement.java
@@ -23,7 +23,7 @@
 @TagName(OListElement.TAG)
 public class OListElement extends Element {
 
-  static final String TAG = "ol";
+  public static final String TAG = "ol";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/ObjectElement.java b/user/src/com/google/gwt/dom/client/ObjectElement.java
index 8aea441..6494639 100644
--- a/user/src/com/google/gwt/dom/client/ObjectElement.java
+++ b/user/src/com/google/gwt/dom/client/ObjectElement.java
@@ -27,7 +27,7 @@
 @TagName(ObjectElement.TAG)
 public class ObjectElement extends Element {
 
-  static final String TAG = "object";
+  public static final String TAG = "object";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/OptGroupElement.java b/user/src/com/google/gwt/dom/client/OptGroupElement.java
index 1b1511b..9f471cf 100644
--- a/user/src/com/google/gwt/dom/client/OptGroupElement.java
+++ b/user/src/com/google/gwt/dom/client/OptGroupElement.java
@@ -23,7 +23,7 @@
 @TagName(OptGroupElement.TAG)
 public class OptGroupElement extends Element {
 
-  static final String TAG = "optgroup";
+  public static final String TAG = "optgroup";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/OptionElement.java b/user/src/com/google/gwt/dom/client/OptionElement.java
index e984107..f068d0d 100644
--- a/user/src/com/google/gwt/dom/client/OptionElement.java
+++ b/user/src/com/google/gwt/dom/client/OptionElement.java
@@ -23,7 +23,7 @@
 @TagName(OptionElement.TAG)
 public class OptionElement extends Element {
 
-  static final String TAG = "option";
+  public static final String TAG = "option";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/ParagraphElement.java b/user/src/com/google/gwt/dom/client/ParagraphElement.java
index f390fc3..14c9271 100644
--- a/user/src/com/google/gwt/dom/client/ParagraphElement.java
+++ b/user/src/com/google/gwt/dom/client/ParagraphElement.java
@@ -23,7 +23,7 @@
 @TagName(ParagraphElement.TAG)
 public class ParagraphElement extends Element {
 
-  static final String TAG = "p";
+  public static final String TAG = "p";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/ParamElement.java b/user/src/com/google/gwt/dom/client/ParamElement.java
index dc48799..58537e7 100644
--- a/user/src/com/google/gwt/dom/client/ParamElement.java
+++ b/user/src/com/google/gwt/dom/client/ParamElement.java
@@ -23,7 +23,7 @@
 @TagName(ParamElement.TAG)
 public class ParamElement extends Element {
 
-  static final String TAG = "param";
+  public static final String TAG = "param";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/PreElement.java b/user/src/com/google/gwt/dom/client/PreElement.java
index 0979ce4..175527f 100644
--- a/user/src/com/google/gwt/dom/client/PreElement.java
+++ b/user/src/com/google/gwt/dom/client/PreElement.java
@@ -23,7 +23,7 @@
 @TagName(PreElement.TAG)
 public class PreElement extends Element {
 
-  static final String TAG = "pre";
+  public static final String TAG = "pre";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/QuoteElement.java b/user/src/com/google/gwt/dom/client/QuoteElement.java
index ba64b4c..26f87bb 100644
--- a/user/src/com/google/gwt/dom/client/QuoteElement.java
+++ b/user/src/com/google/gwt/dom/client/QuoteElement.java
@@ -23,8 +23,8 @@
 @TagName({QuoteElement.TAG_BLOCKQUOTE, QuoteElement.TAG_Q})
 public class QuoteElement extends Element {
 
-  static final String TAG_BLOCKQUOTE = "blockquote";
-  static final String TAG_Q = "q";
+  public static final String TAG_BLOCKQUOTE = "blockquote";
+  public static final String TAG_Q = "q";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/ScriptElement.java b/user/src/com/google/gwt/dom/client/ScriptElement.java
index 449996e..56dc28c 100644
--- a/user/src/com/google/gwt/dom/client/ScriptElement.java
+++ b/user/src/com/google/gwt/dom/client/ScriptElement.java
@@ -23,7 +23,7 @@
 @TagName(ScriptElement.TAG)
 public class ScriptElement extends Element {
 
-  static final String TAG = "script";
+  public static final String TAG = "script";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/SelectElement.java b/user/src/com/google/gwt/dom/client/SelectElement.java
index 7fc7c5e..3e7d7e8 100644
--- a/user/src/com/google/gwt/dom/client/SelectElement.java
+++ b/user/src/com/google/gwt/dom/client/SelectElement.java
@@ -26,7 +26,7 @@
 @TagName(SelectElement.TAG)
 public class SelectElement extends Element {
 
-  static final String TAG = "select";
+  public static final String TAG = "select";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/SourceElement.java b/user/src/com/google/gwt/dom/client/SourceElement.java
index 0f63ca9..0684efd 100644
--- a/user/src/com/google/gwt/dom/client/SourceElement.java
+++ b/user/src/com/google/gwt/dom/client/SourceElement.java
@@ -25,7 +25,7 @@
 @TagName(SourceElement.TAG)
 public class SourceElement extends Element {
 
-  static final String TAG = "source";
+  public static final String TAG = "source";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/SpanElement.java b/user/src/com/google/gwt/dom/client/SpanElement.java
index 01dfc4e..6150d3f 100644
--- a/user/src/com/google/gwt/dom/client/SpanElement.java
+++ b/user/src/com/google/gwt/dom/client/SpanElement.java
@@ -23,7 +23,7 @@
 @TagName(SpanElement.TAG)
 public class SpanElement extends Element {
 
-  static final String TAG = "span";
+  public static final String TAG = "span";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/StyleElement.java b/user/src/com/google/gwt/dom/client/StyleElement.java
index 4469062..1bc310e 100644
--- a/user/src/com/google/gwt/dom/client/StyleElement.java
+++ b/user/src/com/google/gwt/dom/client/StyleElement.java
@@ -25,7 +25,7 @@
 @TagName(StyleElement.TAG)
 public class StyleElement extends Element {
 
-  static final String TAG = "style";
+  public static final String TAG = "style";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/TableCaptionElement.java b/user/src/com/google/gwt/dom/client/TableCaptionElement.java
index f5cbafc..a81cf23 100644
--- a/user/src/com/google/gwt/dom/client/TableCaptionElement.java
+++ b/user/src/com/google/gwt/dom/client/TableCaptionElement.java
@@ -23,7 +23,7 @@
 @TagName(TableCaptionElement.TAG)
 public class TableCaptionElement extends Element {
 
-  static final String TAG = "caption";
+  public static final String TAG = "caption";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/TableCellElement.java b/user/src/com/google/gwt/dom/client/TableCellElement.java
index e873c03..95c7e4c 100644
--- a/user/src/com/google/gwt/dom/client/TableCellElement.java
+++ b/user/src/com/google/gwt/dom/client/TableCellElement.java
@@ -23,8 +23,8 @@
 @TagName({TableCellElement.TAG_TD, TableCellElement.TAG_TH})
 public class TableCellElement extends Element {
 
-  static final String TAG_TD = "td";
-  static final String TAG_TH = "th";
+  public static final String TAG_TD = "td";
+  public static final String TAG_TH = "th";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/TableColElement.java b/user/src/com/google/gwt/dom/client/TableColElement.java
index 300b85c..55c6728 100644
--- a/user/src/com/google/gwt/dom/client/TableColElement.java
+++ b/user/src/com/google/gwt/dom/client/TableColElement.java
@@ -23,8 +23,8 @@
 @TagName({TableColElement.TAG_COL, TableColElement.TAG_COLGROUP})
 public class TableColElement extends Element {
 
-  static final String TAG_COL = "col";
-  static final String TAG_COLGROUP = "colgroup";
+  public static final String TAG_COL = "col";
+  public static final String TAG_COLGROUP = "colgroup";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/TableElement.java b/user/src/com/google/gwt/dom/client/TableElement.java
index bb874ee..8988cef 100644
--- a/user/src/com/google/gwt/dom/client/TableElement.java
+++ b/user/src/com/google/gwt/dom/client/TableElement.java
@@ -27,7 +27,7 @@
 @TagName(TableElement.TAG)
 public class TableElement extends Element {
 
-  static final String TAG = "table";
+  public static final String TAG = "table";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/TableRowElement.java b/user/src/com/google/gwt/dom/client/TableRowElement.java
index 6921f93..15073d0 100644
--- a/user/src/com/google/gwt/dom/client/TableRowElement.java
+++ b/user/src/com/google/gwt/dom/client/TableRowElement.java
@@ -23,7 +23,7 @@
 @TagName(TableRowElement.TAG)
 public class TableRowElement extends Element {
 
-  static final String TAG = "tr";
+  public static final String TAG = "tr";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/TableSectionElement.java b/user/src/com/google/gwt/dom/client/TableSectionElement.java
index 81e1354..80abf92 100644
--- a/user/src/com/google/gwt/dom/client/TableSectionElement.java
+++ b/user/src/com/google/gwt/dom/client/TableSectionElement.java
@@ -25,9 +25,9 @@
   static final String[] TAGS = {TableSectionElement.TAG_TBODY, TableSectionElement.TAG_TFOOT, 
     TableSectionElement.TAG_THEAD};
 
-  static final String TAG_TBODY = "tbody";
-  static final String TAG_TFOOT = "tfoot";
-  static final String TAG_THEAD = "thead";
+  public static final String TAG_TBODY = "tbody";
+  public static final String TAG_TFOOT = "tfoot";
+  public static final String TAG_THEAD = "thead";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/TextAreaElement.java b/user/src/com/google/gwt/dom/client/TextAreaElement.java
index b1b7d16..3a42165 100644
--- a/user/src/com/google/gwt/dom/client/TextAreaElement.java
+++ b/user/src/com/google/gwt/dom/client/TextAreaElement.java
@@ -23,7 +23,7 @@
 @TagName(TextAreaElement.TAG)
 public class TextAreaElement extends Element {
 
-  static final String TAG = "textarea";
+  public static final String TAG = "textarea";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/TitleElement.java b/user/src/com/google/gwt/dom/client/TitleElement.java
index e1992fa..a41acc2 100644
--- a/user/src/com/google/gwt/dom/client/TitleElement.java
+++ b/user/src/com/google/gwt/dom/client/TitleElement.java
@@ -23,7 +23,7 @@
 @TagName(TitleElement.TAG)
 public class TitleElement extends Element {
 
-  static final String TAG = "title";
+  public static final String TAG = "title";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/src/com/google/gwt/dom/client/UListElement.java b/user/src/com/google/gwt/dom/client/UListElement.java
index d7d5c19..70617eb 100644
--- a/user/src/com/google/gwt/dom/client/UListElement.java
+++ b/user/src/com/google/gwt/dom/client/UListElement.java
@@ -23,7 +23,7 @@
 @TagName(UListElement.TAG)
 public class UListElement extends Element {
 
-  static final String TAG = "ul";
+  public static final String TAG = "ul";
 
   /**
    * Assert that the given {@link Element} is compatible with this class and
diff --git a/user/test/com/google/gwt/dom/builder/DomBuilderGwtSuite.java b/user/test/com/google/gwt/dom/builder/DomBuilderGwtSuite.java
deleted file mode 100644
index c4b1726..0000000
--- a/user/test/com/google/gwt/dom/builder/DomBuilderGwtSuite.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2011 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.dom.builder;
-
-import com.google.gwt.dom.builder.client.GwtDomBuilderImplTest;
-import com.google.gwt.dom.builder.client.GwtDomDivBuilderTest;
-import com.google.gwt.dom.builder.client.GwtDomOptionBuilderTest;
-import com.google.gwt.dom.builder.client.GwtDomSelectBuilderTest;
-import com.google.gwt.dom.builder.client.GwtDomStylesBuilderTest;
-import com.google.gwt.junit.tools.GWTTestSuite;
-
-import junit.framework.Test;
-
-/**
- * Tests of the dom implementation of element builders.
- */
-public class DomBuilderGwtSuite {
-
-  public static Test suite() {
-    GWTTestSuite suite = new GWTTestSuite("GWT tests for all dom builders");
-
-    suite.addTestSuite(GwtDomBuilderImplTest.class);
-    suite.addTestSuite(GwtDomDivBuilderTest.class);
-    suite.addTestSuite(GwtDomOptionBuilderTest.class);
-    suite.addTestSuite(GwtDomSelectBuilderTest.class);
-    suite.addTestSuite(GwtDomStylesBuilderTest.class);
-
-    return suite;
-  }
-}
diff --git a/user/test/com/google/gwt/dom/builder/ElementBuilderGwtSuite.java b/user/test/com/google/gwt/dom/builder/ElementBuilderGwtSuite.java
new file mode 100644
index 0000000..9638706
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/ElementBuilderGwtSuite.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2011 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.dom.builder;
+
+import com.google.gwt.dom.builder.client.GwtAnchorBuilderTest;
+import com.google.gwt.dom.builder.client.GwtAreaBuilderTest;
+import com.google.gwt.dom.builder.client.GwtAudioBuilderTest;
+import com.google.gwt.dom.builder.client.GwtBRBuilderTest;
+import com.google.gwt.dom.builder.client.GwtBaseBuilderTest;
+import com.google.gwt.dom.builder.client.GwtBodyBuilderTest;
+import com.google.gwt.dom.builder.client.GwtButtonBuilderTest;
+import com.google.gwt.dom.builder.client.GwtCanvasBuilderTest;
+import com.google.gwt.dom.builder.client.GwtDListBuilderTest;
+import com.google.gwt.dom.builder.client.GwtDivBuilderTest;
+import com.google.gwt.dom.builder.client.GwtDomBuilderImplTest;
+import com.google.gwt.dom.builder.client.GwtDomStylesBuilderTest;
+import com.google.gwt.dom.builder.client.GwtFieldSetBuilderTest;
+import com.google.gwt.dom.builder.client.GwtFormBuilderTest;
+import com.google.gwt.dom.builder.client.GwtFrameBuilderTest;
+import com.google.gwt.dom.builder.client.GwtFrameSetBuilderTest;
+import com.google.gwt.dom.builder.client.GwtHRBuilderTest;
+import com.google.gwt.dom.builder.client.GwtHeadBuilderTest;
+import com.google.gwt.dom.builder.client.GwtHeadingBuilderTest;
+import com.google.gwt.dom.builder.client.GwtIFrameBuilderTest;
+import com.google.gwt.dom.builder.client.GwtImageBuilderTest;
+import com.google.gwt.dom.builder.client.GwtInputBuilderTest;
+import com.google.gwt.dom.builder.client.GwtLIBuilderTest;
+import com.google.gwt.dom.builder.client.GwtLabelBuilderTest;
+import com.google.gwt.dom.builder.client.GwtLegendBuilderTest;
+import com.google.gwt.dom.builder.client.GwtLinkBuilderTest;
+import com.google.gwt.dom.builder.client.GwtMapBuilderTest;
+import com.google.gwt.dom.builder.client.GwtMetaBuilderTest;
+import com.google.gwt.dom.builder.client.GwtOListBuilderTest;
+import com.google.gwt.dom.builder.client.GwtOptGroupBuilderTest;
+import com.google.gwt.dom.builder.client.GwtOptionBuilderTest;
+import com.google.gwt.dom.builder.client.GwtParagraphBuilderTest;
+import com.google.gwt.dom.builder.client.GwtParamBuilderTest;
+import com.google.gwt.dom.builder.client.GwtPreBuilderTest;
+import com.google.gwt.dom.builder.client.GwtQuoteBuilderTest;
+import com.google.gwt.dom.builder.client.GwtScriptBuilderTest;
+import com.google.gwt.dom.builder.client.GwtSelectBuilderTest;
+import com.google.gwt.dom.builder.client.GwtSourceBuilderTest;
+import com.google.gwt.dom.builder.client.GwtSpanBuilderTest;
+import com.google.gwt.dom.builder.client.GwtStyleBuilderTest;
+import com.google.gwt.dom.builder.client.GwtTableBuilderTest;
+import com.google.gwt.dom.builder.client.GwtTableCaptionBuilderTest;
+import com.google.gwt.dom.builder.client.GwtTableCellBuilderTest;
+import com.google.gwt.dom.builder.client.GwtTableColBuilderTest;
+import com.google.gwt.dom.builder.client.GwtTableRowBuilderTest;
+import com.google.gwt.dom.builder.client.GwtTableSectionBuilderTest;
+import com.google.gwt.dom.builder.client.GwtTextAreaBuilderTest;
+import com.google.gwt.dom.builder.client.GwtTitleBuilderTest;
+import com.google.gwt.dom.builder.client.GwtUListBuilderTest;
+import com.google.gwt.dom.builder.client.GwtVideoBuilderTest;
+import com.google.gwt.dom.builder.shared.GwtHtmlBuilderImplTest;
+import com.google.gwt.dom.builder.shared.GwtHtmlStylesBuilderTest;
+import com.google.gwt.junit.tools.GWTTestSuite;
+
+import junit.framework.Test;
+
+/**
+ * Tests of the dom and HTML implementation of element builders.
+ */
+public class ElementBuilderGwtSuite {
+
+  public static Test suite() {
+    GWTTestSuite suite = new GWTTestSuite("GWT tests for all builders");
+
+    // Html implementation tests.
+    suite.addTestSuite(GwtHtmlBuilderImplTest.class);
+    suite.addTestSuite(GwtHtmlStylesBuilderTest.class);
+
+    // DOM implementation tests.
+    suite.addTestSuite(GwtDomBuilderImplTest.class);
+    suite.addTestSuite(GwtDomStylesBuilderTest.class);
+
+    // Element builder tests.
+    suite.addTestSuite(GwtAnchorBuilderTest.class);
+    suite.addTestSuite(GwtAreaBuilderTest.class);
+    suite.addTestSuite(GwtAudioBuilderTest.class);
+    suite.addTestSuite(GwtBaseBuilderTest.class);
+    suite.addTestSuite(GwtBodyBuilderTest.class);
+    suite.addTestSuite(GwtBRBuilderTest.class);
+    suite.addTestSuite(GwtButtonBuilderTest.class);
+    suite.addTestSuite(GwtCanvasBuilderTest.class);
+    suite.addTestSuite(GwtDivBuilderTest.class);
+    suite.addTestSuite(GwtDListBuilderTest.class);
+    suite.addTestSuite(GwtFieldSetBuilderTest.class);
+    suite.addTestSuite(GwtFormBuilderTest.class);
+    suite.addTestSuite(GwtFrameBuilderTest.class);
+    suite.addTestSuite(GwtFrameSetBuilderTest.class);
+    suite.addTestSuite(GwtHeadBuilderTest.class);
+    suite.addTestSuite(GwtHeadingBuilderTest.class);
+    suite.addTestSuite(GwtHRBuilderTest.class);
+    suite.addTestSuite(GwtIFrameBuilderTest.class);
+    suite.addTestSuite(GwtImageBuilderTest.class);
+    suite.addTestSuite(GwtInputBuilderTest.class);
+    suite.addTestSuite(GwtLabelBuilderTest.class);
+    suite.addTestSuite(GwtLegendBuilderTest.class);
+    suite.addTestSuite(GwtLIBuilderTest.class);
+    suite.addTestSuite(GwtLinkBuilderTest.class);
+    suite.addTestSuite(GwtMapBuilderTest.class);
+    suite.addTestSuite(GwtMetaBuilderTest.class);
+    suite.addTestSuite(GwtOListBuilderTest.class);
+    suite.addTestSuite(GwtOptGroupBuilderTest.class);
+    suite.addTestSuite(GwtOptionBuilderTest.class);
+    suite.addTestSuite(GwtParagraphBuilderTest.class);
+    suite.addTestSuite(GwtParamBuilderTest.class);
+    suite.addTestSuite(GwtPreBuilderTest.class);
+    suite.addTestSuite(GwtQuoteBuilderTest.class);
+    suite.addTestSuite(GwtScriptBuilderTest.class);
+    suite.addTestSuite(GwtSelectBuilderTest.class);
+    suite.addTestSuite(GwtSourceBuilderTest.class);
+    suite.addTestSuite(GwtSpanBuilderTest.class);
+    suite.addTestSuite(GwtStyleBuilderTest.class);
+    suite.addTestSuite(GwtTableCaptionBuilderTest.class);
+    suite.addTestSuite(GwtTableCellBuilderTest.class);
+    suite.addTestSuite(GwtTableColBuilderTest.class);
+    suite.addTestSuite(GwtTableBuilderTest.class);
+    suite.addTestSuite(GwtTableRowBuilderTest.class);
+    suite.addTestSuite(GwtTableSectionBuilderTest.class);
+    suite.addTestSuite(GwtTextAreaBuilderTest.class);
+    suite.addTestSuite(GwtTitleBuilderTest.class);
+    suite.addTestSuite(GwtUListBuilderTest.class);
+    suite.addTestSuite(GwtVideoBuilderTest.class);
+
+    return suite;
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/HtmlBuilderGwtSuite.java b/user/test/com/google/gwt/dom/builder/HtmlBuilderGwtSuite.java
deleted file mode 100644
index f4e0935..0000000
--- a/user/test/com/google/gwt/dom/builder/HtmlBuilderGwtSuite.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2011 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.dom.builder;
-
-import com.google.gwt.dom.builder.shared.GwtHtmlBuilderImplTest;
-import com.google.gwt.dom.builder.shared.GwtHtmlDivBuilderTest;
-import com.google.gwt.dom.builder.shared.GwtHtmlOptionBuilderTest;
-import com.google.gwt.dom.builder.shared.GwtHtmlSelectBuilderTest;
-import com.google.gwt.dom.builder.shared.GwtHtmlStylesBuilderTest;
-import com.google.gwt.junit.tools.GWTTestSuite;
-
-import junit.framework.Test;
-
-/**
- * Tests of the html implementation of element builders.
- */
-public class HtmlBuilderGwtSuite {
-
-  public static Test suite() {
-    GWTTestSuite suite = new GWTTestSuite("GWT tests for all html builders");
-
-    suite.addTestSuite(GwtHtmlBuilderImplTest.class);
-    suite.addTestSuite(GwtHtmlDivBuilderTest.class);
-    suite.addTestSuite(GwtHtmlOptionBuilderTest.class);
-    suite.addTestSuite(GwtHtmlSelectBuilderTest.class);
-    suite.addTestSuite(GwtHtmlStylesBuilderTest.class);
-
-    return suite;
-  }
-}
diff --git a/user/test/com/google/gwt/dom/builder/HtmlBuilderJreSuite.java b/user/test/com/google/gwt/dom/builder/HtmlBuilderJreSuite.java
index 01d5464..ceba76a 100644
--- a/user/test/com/google/gwt/dom/builder/HtmlBuilderJreSuite.java
+++ b/user/test/com/google/gwt/dom/builder/HtmlBuilderJreSuite.java
@@ -15,9 +15,54 @@
  */
 package com.google.gwt.dom.builder;
 
+import com.google.gwt.dom.builder.shared.HtmlAnchorBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlAreaBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlAudioBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlBRBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlBaseBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlBodyBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlButtonBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlCanvasBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlDListBuilderTest;
 import com.google.gwt.dom.builder.shared.HtmlDivBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlFieldSetBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlFormBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlFrameBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlFrameSetBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlHRBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlHeadBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlHeadingBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlIFrameBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlImageBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlInputBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlLIBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlLabelBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlLegendBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlLinkBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlMapBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlMetaBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlOListBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlOptGroupBuilderTest;
 import com.google.gwt.dom.builder.shared.HtmlOptionBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlParagraphBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlParamBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlPreBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlQuoteBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlScriptBuilderTest;
 import com.google.gwt.dom.builder.shared.HtmlSelectBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlSourceBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlSpanBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlStyleBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlTableBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlTableCaptionBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlTableCellBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlTableColBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlTableRowBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlTableSectionBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlTextAreaBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlTitleBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlUListBuilderTest;
+import com.google.gwt.dom.builder.shared.HtmlVideoBuilderTest;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -30,9 +75,55 @@
   public static Test suite() {
     TestSuite suite = new TestSuite("JRE tests for all html builders");
 
+    // Element builders.
+    suite.addTestSuite(HtmlAnchorBuilderTest.class);
+    suite.addTestSuite(HtmlAreaBuilderTest.class);
+    suite.addTestSuite(HtmlAudioBuilderTest.class);
+    suite.addTestSuite(HtmlBaseBuilderTest.class);
+    suite.addTestSuite(HtmlBodyBuilderTest.class);
+    suite.addTestSuite(HtmlBRBuilderTest.class);
+    suite.addTestSuite(HtmlButtonBuilderTest.class);
+    suite.addTestSuite(HtmlCanvasBuilderTest.class);
     suite.addTestSuite(HtmlDivBuilderTest.class);
+    suite.addTestSuite(HtmlDListBuilderTest.class);
+    suite.addTestSuite(HtmlFieldSetBuilderTest.class);
+    suite.addTestSuite(HtmlFormBuilderTest.class);
+    suite.addTestSuite(HtmlFrameBuilderTest.class);
+    suite.addTestSuite(HtmlFrameSetBuilderTest.class);
+    suite.addTestSuite(HtmlHeadBuilderTest.class);
+    suite.addTestSuite(HtmlHeadingBuilderTest.class);
+    suite.addTestSuite(HtmlHRBuilderTest.class);
+    suite.addTestSuite(HtmlIFrameBuilderTest.class);
+    suite.addTestSuite(HtmlImageBuilderTest.class);
+    suite.addTestSuite(HtmlInputBuilderTest.class);
+    suite.addTestSuite(HtmlLabelBuilderTest.class);
+    suite.addTestSuite(HtmlLegendBuilderTest.class);
+    suite.addTestSuite(HtmlLIBuilderTest.class);
+    suite.addTestSuite(HtmlLinkBuilderTest.class);
+    suite.addTestSuite(HtmlMapBuilderTest.class);
+    suite.addTestSuite(HtmlMetaBuilderTest.class);
+    suite.addTestSuite(HtmlOListBuilderTest.class);
+    suite.addTestSuite(HtmlOptGroupBuilderTest.class);
     suite.addTestSuite(HtmlOptionBuilderTest.class);
+    suite.addTestSuite(HtmlParagraphBuilderTest.class);
+    suite.addTestSuite(HtmlParamBuilderTest.class);
+    suite.addTestSuite(HtmlPreBuilderTest.class);
+    suite.addTestSuite(HtmlQuoteBuilderTest.class);
+    suite.addTestSuite(HtmlScriptBuilderTest.class);
     suite.addTestSuite(HtmlSelectBuilderTest.class);
+    suite.addTestSuite(HtmlSourceBuilderTest.class);
+    suite.addTestSuite(HtmlSpanBuilderTest.class);
+    suite.addTestSuite(HtmlStyleBuilderTest.class);
+    suite.addTestSuite(HtmlTableCaptionBuilderTest.class);
+    suite.addTestSuite(HtmlTableCellBuilderTest.class);
+    suite.addTestSuite(HtmlTableColBuilderTest.class);
+    suite.addTestSuite(HtmlTableBuilderTest.class);
+    suite.addTestSuite(HtmlTableRowBuilderTest.class);
+    suite.addTestSuite(HtmlTableSectionBuilderTest.class);
+    suite.addTestSuite(HtmlTextAreaBuilderTest.class);
+    suite.addTestSuite(HtmlTitleBuilderTest.class);
+    suite.addTestSuite(HtmlUListBuilderTest.class);
+    suite.addTestSuite(HtmlVideoBuilderTest.class);
 
     return suite;
   }
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtAnchorBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtAnchorBuilderTest.java
index e49c505..2be78f0 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtAnchorBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlAnchorBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomAnchorBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtAnchorBuilderTest extends HtmlAnchorBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtAreaBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtAreaBuilderTest.java
index e49c505..4d9a2ec 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtAreaBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlAreaBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomAudioBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtAreaBuilderTest extends HtmlAreaBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtAudioBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtAudioBuilderTest.java
index e49c505..296ff46 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtAudioBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlAudioBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomAudioBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtAudioBuilderTest extends HtmlAudioBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtBRBuilderTest.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtBRBuilderTest.java
index e49c505..4ac0c6a 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtBRBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlBRBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomBRBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtBRBuilderTest extends HtmlBRBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtBaseBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtBaseBuilderTest.java
index e49c505..c4b868b 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtBaseBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlBaseBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomBaseBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtBaseBuilderTest extends HtmlBaseBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtBodyBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtBodyBuilderTest.java
index e49c505..828acee 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtBodyBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlBodyBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomBodyBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtBodyBuilderTest extends HtmlBodyBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtButtonBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtButtonBuilderTest.java
index e49c505..3bc36f2 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtButtonBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlButtonBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomButtonBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtButtonBuilderTest extends HtmlButtonBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtCanvasBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtCanvasBuilderTest.java
index e49c505..e064131 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtCanvasBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlCanvasBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomCanvasBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtCanvasBuilderTest extends HtmlCanvasBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtDListBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtDListBuilderTest.java
index e49c505..12e14a9 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtDListBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlDListBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomDListBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtDListBuilderTest extends HtmlDListBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtDivBuilderTest.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtDivBuilderTest.java
index e49c505..f4ad1e1 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtDivBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlDivBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Tests for {@link DomDivBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtDivBuilderTest extends HtmlDivBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/client/GwtDomDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtDomDivBuilderTest.java
deleted file mode 100644
index 74ea5b1..0000000
--- a/user/test/com/google/gwt/dom/builder/client/GwtDomDivBuilderTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2011 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.dom.builder.client;
-
-import com.google.gwt.dom.builder.shared.DivBuilder;
-import com.google.gwt.dom.builder.shared.ElementBuilderBase;
-import com.google.gwt.dom.builder.shared.HtmlDivBuilderTest;
-
-/**
- * Tests for {@link DomDivBuilder}.
- */
-public class GwtDomDivBuilderTest extends HtmlDivBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
-
-  @Override
-  protected DivBuilder createElementBuilder() {
-    return DomBuilderFactory.get().createDivBuilder();
-  }
-
-  @Override
-  protected DivBuilder startElement(ElementBuilderBase<?> builder) {
-    return builder.startDiv();
-  }
-}
diff --git a/user/test/com/google/gwt/dom/builder/client/GwtDomOptionBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtDomOptionBuilderTest.java
deleted file mode 100644
index 6f986d4..0000000
--- a/user/test/com/google/gwt/dom/builder/client/GwtDomOptionBuilderTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2011 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.dom.builder.client;
-
-import com.google.gwt.dom.builder.shared.ElementBuilderBase;
-import com.google.gwt.dom.builder.shared.OptionBuilder;
-import com.google.gwt.dom.builder.shared.HtmlOptionBuilderTest;
-
-/**
- * Tests for {@link DomOptionBuilder}.
- */
-public class GwtDomOptionBuilderTest extends HtmlOptionBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
-
-  @Override
-  protected OptionBuilder createElementBuilder() {
-    return DomBuilderFactory.get().createOptionBuilder();
-  }
-
-  @Override
-  protected OptionBuilder startElement(ElementBuilderBase<?> builder) {
-    return builder.startOption();
-  }
-}
diff --git a/user/test/com/google/gwt/dom/builder/client/GwtDomSelectBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtDomSelectBuilderTest.java
deleted file mode 100644
index 0bc2fb6..0000000
--- a/user/test/com/google/gwt/dom/builder/client/GwtDomSelectBuilderTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2011 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.dom.builder.client;
-
-import com.google.gwt.dom.builder.shared.ElementBuilderBase;
-import com.google.gwt.dom.builder.shared.SelectBuilder;
-import com.google.gwt.dom.builder.shared.HtmlSelectBuilderTest;
-
-/**
- * Tests for {@link DomSelectBuilder}.
- */
-public class GwtDomSelectBuilderTest extends HtmlSelectBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
-
-  @Override
-  protected SelectBuilder createElementBuilder() {
-    return DomBuilderFactory.get().createSelectBuilder();
-  }
-
-  @Override
-  protected SelectBuilder startElement(ElementBuilderBase<?> builder) {
-    return builder.startSelect();
-  }
-}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtFieldSetBuilderTest.java
similarity index 75%
rename from user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
rename to user/test/com/google/gwt/dom/builder/client/GwtFieldSetBuilderTest.java
index 7fb5c6c..a852844 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtFieldSetBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlFieldSetBuilderTest;
 
 /**
- * GWT tests for {@link HtmlOptionBuilder}.
+ * GWT tests for {@link DomFieldSetBuilder}.
  */
-public class GwtHtmlOptionBuilderTest extends HtmlOptionBuilderTest {
+public class GwtFieldSetBuilderTest extends HtmlFieldSetBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtFormBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtFormBuilderTest.java
index e49c505..7e8434d 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtFormBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlFormBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomFormBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtFormBuilderTest extends HtmlFormBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtFrameBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtFrameBuilderTest.java
index e49c505..c4a1d00 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtFrameBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlFrameBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomFrameBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtFrameBuilderTest extends HtmlFrameBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtFrameSetBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtFrameSetBuilderTest.java
index 7fb5c6c..1f06ae6 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtFrameSetBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlFrameSetBuilderTest;
 
 /**
- * GWT tests for {@link HtmlOptionBuilder}.
+ * GWT tests for {@link DomFrameSetBuilder}.
  */
-public class GwtHtmlOptionBuilderTest extends HtmlOptionBuilderTest {
+public class GwtFrameSetBuilderTest extends HtmlFrameSetBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtHRBuilderTest.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtHRBuilderTest.java
index e49c505..1b08fa5 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtHRBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlHRBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomHRBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtHRBuilderTest extends HtmlHRBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtHeadBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtHeadBuilderTest.java
index e49c505..7e5fcca 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtHeadBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlHeadBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomHeadBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtHeadBuilderTest extends HtmlHeadBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtHeadingBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtHeadingBuilderTest.java
index e49c505..4ce7b9f 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtHeadingBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlHeadingBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomHeadingBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtHeadingBuilderTest extends HtmlHeadingBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtIFrameBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtIFrameBuilderTest.java
index e49c505..eb0172a 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtIFrameBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlIFrameBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomIFrameBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtIFrameBuilderTest extends HtmlIFrameBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtImageBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtImageBuilderTest.java
index e49c505..be38df6 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtImageBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlImageBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomImageBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtImageBuilderTest extends HtmlImageBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtInputBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtInputBuilderTest.java
index e49c505..b6adc4b 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtInputBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlInputBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomInputBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtInputBuilderTest extends HtmlInputBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtLIBuilderTest.java
similarity index 77%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtLIBuilderTest.java
index e49c505..7d06fe4 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtLIBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlLIBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomLIBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtLIBuilderTest extends HtmlLIBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtLabelBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtLabelBuilderTest.java
index e49c505..7a3e25e 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtLabelBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlLabelBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomLabelBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtLabelBuilderTest extends HtmlLabelBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtLegendBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtLegendBuilderTest.java
index e49c505..f631f3d 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtLegendBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlLegendBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomLegendBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtLegendBuilderTest extends HtmlLegendBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtLinkBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtLinkBuilderTest.java
index e49c505..7c599ca 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtLinkBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlLinkBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomLinkBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtLinkBuilderTest extends HtmlLinkBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtMapBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtMapBuilderTest.java
index e49c505..7aa5891 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtMapBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlMapBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomMapBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtMapBuilderTest extends HtmlMapBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtMetaBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtMetaBuilderTest.java
index e49c505..39ac22d 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtMetaBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlMetaBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomMetaBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtMetaBuilderTest extends HtmlMetaBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtOListBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtOListBuilderTest.java
index e49c505..f09ab66 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtOListBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlOListBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomOListBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtOListBuilderTest extends HtmlOListBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtOptGroupBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtOptGroupBuilderTest.java
index 7fb5c6c..6678ba3 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtOptGroupBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlOptGroupBuilderTest;
 
 /**
- * GWT tests for {@link HtmlOptionBuilder}.
+ * GWT tests for {@link DomOptGroupBuilder}.
  */
-public class GwtHtmlOptionBuilderTest extends HtmlOptionBuilderTest {
+public class GwtOptGroupBuilderTest extends HtmlOptGroupBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtOptionBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtOptionBuilderTest.java
index e49c505..494774c 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtOptionBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlOptionBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * Tests for {@link DomOptionBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtOptionBuilderTest extends HtmlOptionBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/client/GwtParagraphBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtParagraphBuilderTest.java
new file mode 100644
index 0000000..74120ef
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/client/GwtParagraphBuilderTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2011 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.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlParagraphBuilderTest;
+
+/**
+ * GWT tests for {@link DomParagraphBuilder}.
+ */
+public class GwtParagraphBuilderTest extends HtmlParagraphBuilderTest {
+
+  @Override
+  public String getModuleName() {
+    return GWT_MODULE_NAME;
+  }
+
+  /**
+   * Test that HTML can be set after ending one element and starting another.
+   */
+  @Override
+  public void testHtmlAfterRestart() {
+    /*
+     * This test triggers an obscure bug in IE7 where you cannot set the
+     * innerHTML of a child element within a paragraph if the innerHTML contains
+     * a block element.
+     * 
+     * Disabling the method would prevent users from setting innerHTML that does
+     * not contain block elements, which is allowed, and detecting when this
+     * will throw an error would be difficult.
+     */
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtParamBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtParamBuilderTest.java
index e49c505..4803345 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtParamBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlParamBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomParamBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtParamBuilderTest extends HtmlParamBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtPreBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtPreBuilderTest.java
index e49c505..10f6b1c 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtPreBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlPreBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomPreBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtPreBuilderTest extends HtmlPreBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtQuoteBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtQuoteBuilderTest.java
index e49c505..79ea335 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtQuoteBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlQuoteBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomQuoteBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtQuoteBuilderTest extends HtmlQuoteBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtScriptBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtScriptBuilderTest.java
index e49c505..fe2f10d 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtScriptBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlScriptBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomScriptBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtScriptBuilderTest extends HtmlScriptBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtSelectBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtSelectBuilderTest.java
index e49c505..10dbec9 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtSelectBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlSelectBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomSelectBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtSelectBuilderTest extends HtmlSelectBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtSourceBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtSourceBuilderTest.java
index e49c505..fcff5f7 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtSourceBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlSourceBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomSourceBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtSourceBuilderTest extends HtmlSourceBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtSpanBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtSpanBuilderTest.java
index e49c505..be6bfa1 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtSpanBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlSpanBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomSpanBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtSpanBuilderTest extends HtmlSpanBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtStyleBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtStyleBuilderTest.java
index e49c505..0079ac2 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtStyleBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlStyleBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomStyleBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtStyleBuilderTest extends HtmlStyleBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtTableBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtTableBuilderTest.java
index e49c505..4c21374 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtTableBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlTableBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomTableBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtTableBuilderTest extends HtmlTableBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtTableCaptionBuilderTest.java
similarity index 73%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtTableCaptionBuilderTest.java
index e49c505..2da4ce1 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtTableCaptionBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlTableCaptionBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomTableCaptionBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtTableCaptionBuilderTest extends HtmlTableCaptionBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtTableCellBuilderTest.java
similarity index 74%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtTableCellBuilderTest.java
index e49c505..3af3c40 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtTableCellBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlTableCellBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomTableCellBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtTableCellBuilderTest extends HtmlTableCellBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtTableColBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtTableColBuilderTest.java
index 7fb5c6c..47a8aef 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtTableColBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlTableColBuilderTest;
 
 /**
- * GWT tests for {@link HtmlOptionBuilder}.
+ * GWT tests for {@link DomTableColBuilder}.
  */
-public class GwtHtmlOptionBuilderTest extends HtmlOptionBuilderTest {
+public class GwtTableColBuilderTest extends HtmlTableColBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtTableRowBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtTableRowBuilderTest.java
index 7fb5c6c..1d2b10e 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtTableRowBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlTableRowBuilderTest;
 
 /**
- * GWT tests for {@link HtmlOptionBuilder}.
+ * GWT tests for {@link DomTableRowBuilder}.
  */
-public class GwtHtmlOptionBuilderTest extends HtmlOptionBuilderTest {
+public class GwtTableRowBuilderTest extends HtmlTableRowBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtTableSectionBuilderTest.java
similarity index 73%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtTableSectionBuilderTest.java
index e49c505..54e0665 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtTableSectionBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlTableSectionBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomTableSectionBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtTableSectionBuilderTest extends HtmlTableSectionBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtTextAreaBuilderTest.java
similarity index 75%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtTextAreaBuilderTest.java
index 7fb5c6c..e9c7b6d 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtTextAreaBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlTextAreaBuilderTest;
 
 /**
- * GWT tests for {@link HtmlOptionBuilder}.
+ * GWT tests for {@link DomTextAreaBuilder}.
  */
-public class GwtHtmlOptionBuilderTest extends HtmlOptionBuilderTest {
+public class GwtTextAreaBuilderTest extends HtmlTextAreaBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtTitleBuilderTest.java
similarity index 73%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtTitleBuilderTest.java
index e49c505..8a56383 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtTitleBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlTitleBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link com.google.gwt.dom.builder.shared.HtmlTitleBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtTitleBuilderTest extends HtmlTitleBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtUListBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtUListBuilderTest.java
index e49c505..4bdd747 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtUListBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlUListBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomUListBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtUListBuilderTest extends HtmlUListBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/client/GwtVideoBuilderTest.java
similarity index 76%
copy from user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
copy to user/test/com/google/gwt/dom/builder/client/GwtVideoBuilderTest.java
index e49c505..67e1c40 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/client/GwtVideoBuilderTest.java
@@ -13,12 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.dom.builder.shared;
+package com.google.gwt.dom.builder.client;
+
+import com.google.gwt.dom.builder.shared.HtmlVideoBuilderTest;
 
 /**
- * GWT tests for {@link HtmlDivBuilder}.
+ * GWT tests for {@link DomVideoBuilder}.
  */
-public class GwtHtmlDivBuilderTest extends HtmlDivBuilderTest {
+public class GwtVideoBuilderTest extends HtmlVideoBuilderTest {
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/dom/builder/shared/ElementBuilderTestBase.java b/user/test/com/google/gwt/dom/builder/shared/ElementBuilderTestBase.java
index 575fb9f..295467e 100644
--- a/user/test/com/google/gwt/dom/builder/shared/ElementBuilderTestBase.java
+++ b/user/test/com/google/gwt/dom/builder/shared/ElementBuilderTestBase.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.dom.builder.shared;
 
+import com.google.gwt.dom.builder.client.DomBuilderFactory;
 import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.safehtml.shared.SafeHtmlUtils;
@@ -27,11 +28,6 @@
 public abstract class ElementBuilderTestBase<T extends ElementBuilderBase<?>> extends GWTTestCase {
 
   /**
-   * The GWT module name when running tests on the client.
-   */
-  protected static final String GWT_MODULE_NAME = "com.google.gwt.dom.builder.DomBuilder";
-
-  /**
    * A command that operates on a builder.
    */
   protected interface BuilderCommand<T extends ElementBuilderBase<?>> {
@@ -43,6 +39,31 @@
     void execute(T builder);
   }
 
+  /**
+   * The GWT module name when running tests on the client.
+   */
+  protected static final String GWT_MODULE_NAME = "com.google.gwt.dom.builder.DomBuilder";
+
+  /**
+   * Indicates whether or not the element under test supports child elements.
+   */
+  private boolean isChildElementSupported;
+
+  /**
+   * Indicates whether or not the element under test supports an end tag.
+   */
+  private boolean isEndTagForbidden;
+
+  /**
+   * Indicates whether or not the element under test supports inner html.
+   */
+  private boolean isInnerHtmlSupported;
+
+  /**
+   * Indicates whether or not the element under test supports inner text.
+   */
+  private boolean isInnerTextSupported;
+
   @Override
   public String getModuleName() {
     // Default to JVM implementation.
@@ -53,28 +74,35 @@
    * Test that you cannot append text, html, or elements after setting the text.
    */
   public void testAppendAfterHtml() {
-    T builder = createElementBuilder();
-    builder.html(SafeHtmlUtils.fromString("Hello World"));
-
-    try {
-      builder.text("moretext");
-      fail("Expected IllegalStateException: setting text after setting html");
-    } catch (IllegalStateException e) {
-      // Expected.
+    // Skip this test if inner html is not supported.
+    if (!isInnerHtmlSupported) {
+      return;
     }
 
-    try {
-      builder.html(SafeHtmlUtils.fromString("morehtml"));
-      fail("Expected IllegalStateException: setting html twice");
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
+      builder.html(SafeHtmlUtils.fromString("Hello World"));
 
-    try {
-      builder.startDiv();
-      fail("Expected IllegalStateException: appending a div after setting html");
-    } catch (IllegalStateException e) {
-      // Expected.
+      try {
+        builder.text("moretext");
+        fail("Expected IllegalStateException: setting text after setting html");
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
+
+      try {
+        builder.html(SafeHtmlUtils.fromString("morehtml"));
+        fail("Expected IllegalStateException: setting html twice");
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
+
+      try {
+        builder.startDiv();
+        fail("Expected IllegalStateException: appending a div after setting html");
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
     }
   }
 
@@ -82,28 +110,37 @@
    * Test that you cannot append text, html, or elements after setting the text.
    */
   public void testAppendAfterText() {
-    T builder = createElementBuilder();
-    builder.text("Hello World");
-
-    try {
-      builder.text("moretext");
-      fail("Expected IllegalStateException: setting text twice");
-    } catch (IllegalStateException e) {
-      // Expected.
+    // Skip this test if inner text is not supported.
+    if (!isInnerTextSupported) {
+      return;
     }
 
-    try {
-      builder.html(SafeHtmlUtils.fromString("morehtml"));
-      fail("Expected IllegalStateException: setting html after setting text");
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
+      builder.text("Hello World");
 
-    try {
-      builder.startDiv();
-      fail("Expected IllegalStateException: appending a div after setting text");
-    } catch (IllegalStateException e) {
-      // Expected.
+      try {
+        builder.text("moretext");
+        fail("Expected IllegalStateException: setting text twice");
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
+
+      if (isInnerHtmlSupported) {
+        try {
+          builder.html(SafeHtmlUtils.fromString("morehtml"));
+          fail("Expected IllegalStateException: setting html after setting text");
+        } catch (IllegalStateException e) {
+          // Expected.
+        }
+      }
+
+      try {
+        builder.startDiv();
+        fail("Expected IllegalStateException: appending a div after setting text");
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
     }
   }
 
@@ -134,6 +171,256 @@
     }, "Cannot add attribute after adding a child element");
   }
 
+  public void testClassNameAfterAppendHtml() {
+    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
+      @Override
+      public void execute(T builder) {
+        builder.className("value");
+      }
+    }, "Cannot add attribute after appending html");
+  }
+
+  public void testDirNameAfterAppendHtml() {
+    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
+      @Override
+      public void execute(T builder) {
+        builder.dir("value");
+      }
+    }, "Cannot add attribute after appending html");
+  }
+
+  public void testDraggableNameAfterAppendHtml() {
+    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
+      @Override
+      public void execute(T builder) {
+        builder.draggable("value");
+      }
+    }, "Cannot add attribute after appending html");
+  }
+
+  public void testEndReturnType() {
+    if (!isChildElementSupported) {
+      return;
+    }
+
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
+      DivBuilder divBuilder0 = builder.startDiv();
+      DivBuilder divBuilder1 = divBuilder0.startDiv();
+      assertEquals(divBuilder0, divBuilder1.end());
+      assertEquals(builder, divBuilder0.end());
+      assertNull(builder.end());
+    }
+  }
+
+  public void testEndReturnTypeSpecified() {
+    if (!isChildElementSupported) {
+      return;
+    }
+
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
+      DivBuilder divBuilder0 = builder.startDiv();
+      DivBuilder divBuilder1 = divBuilder0.startDiv();
+      assertEquals(divBuilder0, divBuilder1.<DivBuilder> end());
+    }
+  }
+
+  public void testEndSpecifiedType() {
+    for (ElementBuilderFactory factory : getFactories()) {
+      // Test that a builder can be ended if it comes directly from the factory.
+      {
+        T builder = createElementBuilder(factory);
+        builder.id("myid");
+        assertNull(endElement(builder));
+      }
+
+      /*
+       * Test that a builder can be ended if it was started from another
+       * builder.
+       * 
+       * Skip this test if child elements are not supported.
+       */
+      if (isChildElementSupported) {
+        T builder = createElementBuilder(factory);
+        T elem = startElement(builder);
+        assertEquals(builder, endElement(elem));
+        assertNull(builder.end());
+      }
+    }
+  }
+
+  public void testEndUnmatchedTagName() {
+    // Skip this test if child elements are not supported.
+    if (!isChildElementSupported) {
+      return;
+    }
+
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
+      T child = startElement(builder);
+
+      try {
+        child.end("notamatch");
+        fail("Expected IllegalStateException: end tag does not match start tag");
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
+    }
+  }
+
+  public void testHtmlAfterAppend() {
+    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
+      @Override
+      public void execute(T builder) {
+        builder.html(SafeHtmlUtils.fromString("hello world"));
+      }
+    }, "Cannot set html after appending a child element");
+  }
+
+  public void testHtmlAfterEnd() {
+    if (!isInnerHtmlSupported) {
+      return;
+    }
+
+    assertActionFailsAfterEnd(new BuilderCommand<T>() {
+      @Override
+      public void execute(T builder) {
+        builder.html(SafeHtmlUtils.fromString("hello world"));
+      }
+    }, "Cannot set html after adding a child element");
+  }
+
+  /**
+   * Test that HTML can be set after ending one element and starting another.
+   */
+  public void testHtmlAfterRestart() {
+    if (!isInnerHtmlSupported || !isChildElementSupported) {
+      return;
+    }
+
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
+      builder.startDiv().id("test").html(SafeHtmlUtils.fromString("test")).end();
+
+      // Should not cause any errors.
+      builder.startDiv().html(SafeHtmlUtils.fromString("hello"));
+    }
+  }
+
+  /**
+   * Test that all implementations of a builder are consistent in their support
+   * of setting inner html.
+   */
+  public void testHtmlConsistent() {
+    boolean expected = false;
+    ElementBuilderFactory[] factories = getFactories();
+    for (int i = 0; i < factories.length; i++) {
+      T builder = createElementBuilder(factories[0]);
+      boolean isSupported = true;
+      try {
+        builder.html(SafeHtmlUtils.EMPTY_SAFE_HTML);
+      } catch (UnsupportedOperationException e) {
+        // Child elements are not supported.
+        isSupported = false;
+      }
+
+      assertEquals(isInnerHtmlSupported, isSupported);
+    }
+  }
+
+  public void testIdNameAfterAppendHtml() {
+    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
+      @Override
+      public void execute(T builder) {
+        builder.id("value");
+      }
+    }, "Cannot add attribute after appending html");
+  }
+
+  public void testIsEndTagForbidden() {
+    // Skip this test if the end tag is allowed.
+    if (!isEndTagForbidden) {
+      return;
+    }
+
+    for (ElementBuilderFactory factory : getFactories()) {
+      try {
+        T builder = createElementBuilder(factory);
+        builder.html(SafeHtmlUtils.fromString("html is not allowed"));
+        fail("Expected UnsupportedOperationException: cannot set html if end tag is forbidden");
+      } catch (UnsupportedOperationException e) {
+        // Expected.
+      }
+
+      try {
+        T builder = createElementBuilder(factory);
+        builder.text("text is not allowed");
+        fail("Expected UnsupportedOperationException: cannot set text if end tag is forbidden");
+      } catch (UnsupportedOperationException e) {
+        // Expected.
+      }
+
+      try {
+        T builder = createElementBuilder(factory);
+        builder.startDiv();
+        fail("Expected UnsupportedOperationException: "
+            + "cannot append a child if end tag is forbidden");
+      } catch (UnsupportedOperationException e) {
+        // Expected.
+      }
+    }
+  }
+
+  /**
+   * Test that all implementations of a builder return the same value from
+   * {@link ElementBuilderBase#isEndTagForbidden()}.
+   */
+  public void testIsEndTagForbiddenConsistent() {
+    boolean expected = false;
+    ElementBuilderFactory[] factories = getFactories();
+    for (int i = 0; i < factories.length; i++) {
+      T builder = createElementBuilder(factories[0]);
+      assertEquals(isEndTagForbidden, builder.isEndTagForbidden());
+    }
+  }
+
+  public void testLangAfterAppendHtml() {
+    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
+      @Override
+      public void execute(T builder) {
+        builder.lang("value");
+      }
+    }, "Cannot add attribute after appending html");
+  }
+
+  /**
+   * Test that all implementations of a builder are consistent in their support
+   * of appending child elements.
+   */
+  public void testStartConsistent() {
+    boolean expected = false;
+    ElementBuilderFactory[] factories = getFactories();
+    for (int i = 0; i < factories.length; i++) {
+      T builder = createElementBuilder(factories[0]);
+      assertEquals(isChildElementSupported, builder.isChildElementSupported());
+    }
+  }
+
+  public void testStartSecondTopLevelElement() {
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
+      builder.end(); // Close the top level attribute.
+
+      try {
+        startElement(builder);
+        fail("Expected IllegalStateException: Cannot start multiple top level attributes");
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
+    }
+  }
+
   public void testStylePropertyAfterAppendHtml() {
     assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
       @Override
@@ -172,153 +459,41 @@
     }, "Cannot access StyleBuilder appending html");
   }
 
-  public void testClassNameAfterAppendHtml() {
-    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
-      @Override
-      public void execute(T builder) {
-        builder.className("value");
-      }
-    }, "Cannot add attribute after appending html");
-  }
-
-  public void testDirNameAfterAppendHtml() {
-    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
-      @Override
-      public void execute(T builder) {
-        builder.dir("value");
-      }
-    }, "Cannot add attribute after appending html");
-  }
-
-  public void testDraggableNameAfterAppendHtml() {
-    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
-      @Override
-      public void execute(T builder) {
-        builder.draggable("value");
-      }
-    }, "Cannot add attribute after appending html");
-  }
-
-  public void testEndReturnType() {
-    T builder = createElementBuilder();
-    DivBuilder divBuilder0 = builder.startDiv();
-    DivBuilder divBuilder1 = divBuilder0.startDiv();
-    assertEquals(divBuilder0, divBuilder1.end());
-    assertEquals(builder, divBuilder0.end());
-    assertNull(builder.end());
-  }
-
-  public void testEndReturnTypeSpecified() {
-    T builder = createElementBuilder();
-    DivBuilder divBuilder0 = builder.startDiv();
-    DivBuilder divBuilder1 = divBuilder0.startDiv();
-    assertEquals(divBuilder0, divBuilder1.<DivBuilder> end());
-  }
-
-  public void testEndUnmatchedTagName() {
-    T builder = createElementBuilder();
-    builder.startDiv();
-
-    try {
-      builder.end("span");
-      fail("Expected IllegalStateException: Started div but ended span");
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
-  }
-
-  public void testHtmlAfterAppend() {
-    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
-      @Override
-      public void execute(T builder) {
-        builder.html(SafeHtmlUtils.fromString("hello world"));
-      }
-    }, "Cannot set html after appending a child element");
-  }
-
-  public void testHtmlAfterEnd() {
-    assertActionFailsAfterEnd(new BuilderCommand<T>() {
-      @Override
-      public void execute(T builder) {
-        builder.html(SafeHtmlUtils.fromString("hello world"));
-      }
-    }, "Cannot set html after adding a child element");
-  }
-
-  /**
-   * Test that HTML can be set after ending one element and starting another.
-   */
-  public void testHtmlAfterRestart() {
-    T builder = createElementBuilder();
-    builder.startDiv().id("test").html(SafeHtmlUtils.fromString("test")).end();
-
-    // Should not cause any errors.
-    builder.startDiv().html(SafeHtmlUtils.fromString("hello"));
-  }
-
-  public void testIdNameAfterAppendHtml() {
-    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
-      @Override
-      public void execute(T builder) {
-        builder.id("value");
-      }
-    }, "Cannot add attribute after appending html");
-  }
-
-  public void testLangAfterAppendHtml() {
-    assertActionFailsAfterAppendHtml(new BuilderCommand<T>() {
-      @Override
-      public void execute(T builder) {
-        builder.lang("value");
-      }
-    }, "Cannot add attribute after appending html");
-  }
-
-  public void testStartSecondTopLevelElement() {
-    T builder = createElementBuilder();
-    builder.end(); // Close the top level attribute.
-
-    try {
-      startElement(builder);
-      fail("Expected IllegalStateException: Cannot start multiple top level attributes");
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
-  }
-
   /**
    * Test that you cannot add style properties after interrupting them with an
    * attribute.
    */
   public void testStyleTwice() {
-    T builder = createElementBuilder();
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
 
-    // Access style first time.
-    StylesBuilder style = builder.style().borderWidth(1.0, Unit.PX).fontSize(10.0, Unit.PX);
+      // Access style first time.
+      StylesBuilder style = builder.style().borderWidth(1.0, Unit.PX).fontSize(10.0, Unit.PX);
 
-    // Access style again, without interruption.
-    builder.style().trustedColor("red");
+      // Access style again, without interruption.
+      builder.style().trustedColor("red");
 
-    // Add an attribute.
-    builder.id("id");
+      // Add an attribute.
+      builder.id("id");
 
-    // Accessing style after interruption is allowed.
-    StylesBuilder style0 = builder.style();
+      // Accessing style after interruption is allowed.
+      StylesBuilder style0 = builder.style();
 
-    // Using it is not.
-    try {
-      style0.left(1.0, Unit.PX);
-      fail("Expected IllegalStateException: Cannot access StyleBuilder after interruption");
-    } catch (IllegalStateException e) {
-      // Expected.
-    }
+      // Using it is not.
+      try {
+        style0.left(1.0, Unit.PX);
+        fail("Expected IllegalStateException: Cannot access StyleBuilder after interruption");
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
 
-    // Reuse existing style after interruption.
-    try {
-      style.left(1.0, Unit.PX);
-      fail("Expected IllegalStateException: Cannot access StyleBuilder after interruption");
-    } catch (IllegalStateException e) {
-      // Expected.
+      // Reuse existing style after interruption.
+      try {
+        style.left(1.0, Unit.PX);
+        fail("Expected IllegalStateException: Cannot access StyleBuilder after interruption");
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
     }
   }
 
@@ -341,6 +516,10 @@
   }
 
   public void testTextAfterEnd() {
+    if (!isInnerTextSupported) {
+      return;
+    }
+
     assertActionFailsAfterEnd(new BuilderCommand<T>() {
       @Override
       public void execute(T builder) {
@@ -352,12 +531,39 @@
   /**
    * Test that text can be set after ending one element and starting another.
    */
-  public void testTextAfterRetart() {
-    T builder = createElementBuilder();
-    builder.startDiv().id("test").text("test").end();
+  public void testTextAfterRestart() {
+    if (!isInnerTextSupported || !isChildElementSupported) {
+      return;
+    }
 
-    // Should not cause any errors.
-    builder.startDiv().text("hello");
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
+      builder.startDiv().id("test").text("test").end();
+
+      // Should not cause any errors.
+      builder.startDiv().text("hello");
+    }
+  }
+
+  /**
+   * Test that all implementations of a builder are consistent in their support
+   * of setting inner text.
+   */
+  public void testTextConsistent() {
+    boolean expected = false;
+    ElementBuilderFactory[] factories = getFactories();
+    for (int i = 0; i < factories.length; i++) {
+      T builder = createElementBuilder(factories[0]);
+      boolean isSupported = true;
+      try {
+        builder.text("");
+      } catch (UnsupportedOperationException e) {
+        // Child elements are not supported.
+        isSupported = false;
+      }
+
+      assertEquals(isInnerTextSupported, isSupported);
+    }
   }
 
   public void testTitleAfterAppendHtml() {
@@ -377,14 +583,21 @@
    * @param message the failure message if the test fails
    */
   protected void assertActionFailsAfterAppendHtml(BuilderCommand<T> action, String message) {
-    T builder = createElementBuilder();
-    builder.html(SafeHtmlUtils.EMPTY_SAFE_HTML);
+    // Skip this test if inner html is not supported.
+    if (!isInnerHtmlSupported) {
+      return;
+    }
 
-    try {
-      action.execute(builder);
-      fail("Expected IllegalStateException: " + message);
-    } catch (IllegalStateException e) {
-      // Expected.
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
+      builder.html(SafeHtmlUtils.EMPTY_SAFE_HTML);
+
+      try {
+        action.execute(builder);
+        fail("Expected IllegalStateException: " + message);
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
     }
   }
 
@@ -396,23 +609,79 @@
    * @param message the failure message if the test fails
    */
   protected void assertActionFailsAfterEnd(BuilderCommand<T> action, String message) {
-    T builder = createElementBuilder();
+    // Skip this test if child elements are not supported.
+    if (!isChildElementSupported) {
+      return;
+    }
 
-    // Add a child.
-    builder.startDiv().end();
+    for (ElementBuilderFactory factory : getFactories()) {
+      T builder = createElementBuilder(factory);
 
-    try {
-      action.execute(builder);
-      fail("Expected IllegalStateException: " + message);
-    } catch (IllegalStateException e) {
-      // Expected.
+      // Add a child.
+      builder.startDiv().end();
+
+      try {
+        action.execute(builder);
+        fail("Expected IllegalStateException: " + message);
+      } catch (IllegalStateException e) {
+        // Expected.
+      }
     }
   }
 
   /**
    * Create an {@link ElementBuilderBase} to test.
+   * 
+   * @param factory the {@link ElementBuilderFactory} used to create the element
    */
-  protected abstract T createElementBuilder();
+  protected abstract T createElementBuilder(ElementBuilderFactory factory);
+
+  /**
+   * End the element within an existing builder.
+   * 
+   * @param builder the existing builder
+   * @return the builder for the new element
+   */
+  protected abstract T endElement(ElementBuilderBase<?> builder);
+
+  /**
+   * Get the array of factories to test.
+   * 
+   * @return an array of factories to test.
+   */
+  protected ElementBuilderFactory[] getFactories() {
+    if (getModuleName() == null) {
+      // JRE tests only work with HtmlBuilderFactory.
+      return new ElementBuilderFactory[]{HtmlBuilderFactory.get()};
+    } else {
+      // GWT tests work with both implementations.
+      return new ElementBuilderFactory[]{HtmlBuilderFactory.get(), DomBuilderFactory.get()};
+    }
+  }
+
+  @Override
+  protected void gwtSetUp() throws Exception {
+    isChildElementSupported = createElementBuilder(getFactories()[0]).isChildElementSupported();
+    isEndTagForbidden = createElementBuilder(getFactories()[0]).isEndTagForbidden();
+    isInnerHtmlSupported = true;
+    isInnerTextSupported = true;
+
+    try {
+      createElementBuilder(getFactories()[0]).html(SafeHtmlUtils.EMPTY_SAFE_HTML);
+    } catch (UnsupportedOperationException e) {
+      isInnerHtmlSupported = false;
+    }
+
+    try {
+      createElementBuilder(getFactories()[0]).text("");
+    } catch (UnsupportedOperationException e) {
+      isInnerTextSupported = false;
+    }
+  }
+
+  protected boolean isInnerHtmlSupported() {
+    return true;
+  }
 
   /**
    * Start a new element within an existing builder.
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtElementBuilderImplTestBase.java b/user/test/com/google/gwt/dom/builder/shared/GwtElementBuilderImplTestBase.java
index 48f1d06..808ec1a 100644
--- a/user/test/com/google/gwt/dom/builder/shared/GwtElementBuilderImplTestBase.java
+++ b/user/test/com/google/gwt/dom/builder/shared/GwtElementBuilderImplTestBase.java
@@ -17,6 +17,9 @@
 
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.Style.Position;
+import com.google.gwt.dom.client.TableCellElement;
+import com.google.gwt.dom.client.TableElement;
+import com.google.gwt.dom.client.TableRowElement;
 import com.google.gwt.junit.client.GWTTestCase;
 
 /**
@@ -59,6 +62,32 @@
     }
   }
 
+  public void testBuildTable() {
+    // Build a table.
+    TableBuilder tableBuilder = factory.createTableBuilder().id("mytable");
+    TableSectionBuilder tbody = tableBuilder.startTBody();
+    for (int r = 0; r < 5; r++) {
+      TableRowBuilder tr = tbody.startTR().id("row" + r);
+      for (int c = 0; c < 3; c++) {
+        tr.startTD().text(r + ":" + c).endTD();
+      }
+      tr.endTR();
+    }
+    tbody.endTBody().endTable();
+
+    // Check the rendered element.
+    TableElement table = tableBuilder.finish().cast();
+    assertEquals(5, table.getRows().getLength());
+    for (int r = 0; r < 5; r++) {
+      TableRowElement tr = table.getRows().getItem(r);
+      assertEquals(3, tr.getCells().getLength());
+      for (int c = 0; c < 3; c++) {
+        TableCellElement td = tr.getCells().getItem(c);
+        assertEquals(r + ":" + c, td.getInnerText());
+      }
+    }
+  }
+
   /**
    * Children nested at multiple levels.
    * 
diff --git a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlSelectBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/GwtHtmlSelectBuilderTest.java
deleted file mode 100644
index 1a9a939..0000000
--- a/user/test/com/google/gwt/dom/builder/shared/GwtHtmlSelectBuilderTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2011 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.dom.builder.shared;
-
-/**
- * Gwt tests for {@link HtmlSelectBuilder}.
- */
-public class GwtHtmlSelectBuilderTest extends HtmlSelectBuilderTest {
-
-  @Override
-  public String getModuleName() {
-    return GWT_MODULE_NAME;
-  }
-}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlAnchorBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlAnchorBuilderTest.java
new file mode 100644
index 0000000..f22fb84
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlAnchorBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlAnchorBuilder}.
+ */
+public class HtmlAnchorBuilderTest extends ElementBuilderTestBase<AnchorBuilder> {
+
+  @Override
+  protected AnchorBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createAnchorBuilder();
+  }
+
+  @Override
+  protected AnchorBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endAnchor();
+  }
+
+  @Override
+  protected AnchorBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startAnchor();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlAreaBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlAreaBuilderTest.java
new file mode 100644
index 0000000..b97875d
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlAreaBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlAreaBuilder}.
+ */
+public class HtmlAreaBuilderTest extends ElementBuilderTestBase<AreaBuilder> {
+
+  @Override
+  protected AreaBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createAreaBuilder();
+  }
+
+  @Override
+  protected AreaBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endArea();
+  }
+
+  @Override
+  protected AreaBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startArea();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlAudioBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlAudioBuilderTest.java
new file mode 100644
index 0000000..846f9a6
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlAudioBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlAudioBuilder}.
+ */
+public class HtmlAudioBuilderTest extends ElementBuilderTestBase<AudioBuilder> {
+
+  @Override
+  protected AudioBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createAudioBuilder();
+  }
+
+  @Override
+  protected AudioBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endAudio();
+  }
+
+  @Override
+  protected AudioBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startAudio();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlBRBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlBRBuilderTest.java
new file mode 100644
index 0000000..d1b3758
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlBRBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlBRBuilder}.
+ */
+public class HtmlBRBuilderTest extends ElementBuilderTestBase<BRBuilder> {
+
+  @Override
+  protected BRBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createBRBuilder();
+  }
+
+  @Override
+  protected BRBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endBR();
+  }
+
+  @Override
+  protected BRBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startBR();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlBaseBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlBaseBuilderTest.java
new file mode 100644
index 0000000..9350a4e
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlBaseBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlBaseBuilder}.
+ */
+public class HtmlBaseBuilderTest extends ElementBuilderTestBase<BaseBuilder> {
+
+  @Override
+  protected BaseBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createBaseBuilder();
+  }
+
+  @Override
+  protected BaseBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endBase();
+  }
+
+  @Override
+  protected BaseBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startBase();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlBodyBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlBodyBuilderTest.java
new file mode 100644
index 0000000..c4583f8
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlBodyBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlBodyBuilder}.
+ */
+public class HtmlBodyBuilderTest extends ElementBuilderTestBase<BodyBuilder> {
+
+  @Override
+  protected BodyBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createBodyBuilder();
+  }
+
+  @Override
+  protected BodyBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endBody();
+  }
+
+  @Override
+  protected BodyBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startBody();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlButtonBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlButtonBuilderTest.java
new file mode 100644
index 0000000..7e47393
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlButtonBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlButtonBuilder}.
+ */
+public class HtmlButtonBuilderTest extends ElementBuilderTestBase<ButtonBuilder> {
+
+  @Override
+  protected ButtonBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createPushButtonBuilder();
+  }
+
+  @Override
+  protected ButtonBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endButton();
+  }
+
+  @Override
+  protected ButtonBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startPushButton();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlCanvasBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlCanvasBuilderTest.java
new file mode 100644
index 0000000..8d62b88
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlCanvasBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlCanvasBuilder}.
+ */
+public class HtmlCanvasBuilderTest extends ElementBuilderTestBase<CanvasBuilder> {
+
+  @Override
+  protected CanvasBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createCanvasBuilder();
+  }
+
+  @Override
+  protected CanvasBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endCanvas();
+  }
+
+  @Override
+  protected CanvasBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startCanvas();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlDListBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlDListBuilderTest.java
new file mode 100644
index 0000000..48221b5
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlDListBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlDListBuilder}.
+ */
+public class HtmlDListBuilderTest extends ElementBuilderTestBase<DListBuilder> {
+
+  @Override
+  protected DListBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createDListBuilder();
+  }
+
+  @Override
+  protected DListBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endDList();
+  }
+
+  @Override
+  protected DListBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startDList();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlDivBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlDivBuilderTest.java
index dfb8bf1..977c739 100644
--- a/user/test/com/google/gwt/dom/builder/shared/HtmlDivBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlDivBuilderTest.java
@@ -21,8 +21,13 @@
 public class HtmlDivBuilderTest extends ElementBuilderTestBase<DivBuilder> {
 
   @Override
-  protected DivBuilder createElementBuilder() {
-    return HtmlBuilderFactory.get().createDivBuilder();
+  protected DivBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createDivBuilder();
+  }
+
+  @Override
+  protected DivBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endDiv();
   }
 
   @Override
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlFieldSetBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlFieldSetBuilderTest.java
new file mode 100644
index 0000000..9f9f47c
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlFieldSetBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlFieldSetBuilder}.
+ */
+public class HtmlFieldSetBuilderTest extends ElementBuilderTestBase<FieldSetBuilder> {
+
+  @Override
+  protected FieldSetBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createFieldSetBuilder();
+  }
+
+  @Override
+  protected FieldSetBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endFieldSet();
+  }
+
+  @Override
+  protected FieldSetBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startFieldSet();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlFormBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlFormBuilderTest.java
new file mode 100644
index 0000000..2af55bf
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlFormBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlFormBuilder}.
+ */
+public class HtmlFormBuilderTest extends ElementBuilderTestBase<FormBuilder> {
+
+  @Override
+  protected FormBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createFormBuilder();
+  }
+
+  @Override
+  protected FormBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endForm();
+  }
+
+  @Override
+  protected FormBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startForm();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlFrameBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlFrameBuilderTest.java
new file mode 100644
index 0000000..4780542
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlFrameBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlFrameBuilder}.
+ */
+public class HtmlFrameBuilderTest extends ElementBuilderTestBase<FrameBuilder> {
+
+  @Override
+  protected FrameBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createFrameBuilder();
+  }
+
+  @Override
+  protected FrameBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endFrame();
+  }
+
+  @Override
+  protected FrameBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startFrame();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlFrameSetBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlFrameSetBuilderTest.java
new file mode 100644
index 0000000..fbb2e6f
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlFrameSetBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlFrameSetBuilder}.
+ */
+public class HtmlFrameSetBuilderTest extends ElementBuilderTestBase<FrameSetBuilder> {
+
+  @Override
+  protected FrameSetBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createFrameSetBuilder();
+  }
+
+  @Override
+  protected FrameSetBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endFrameSet();
+  }
+
+  @Override
+  protected FrameSetBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startFrameSet();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlHRBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlHRBuilderTest.java
new file mode 100644
index 0000000..b8655cb
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlHRBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlHRBuilder}.
+ */
+public class HtmlHRBuilderTest extends ElementBuilderTestBase<HRBuilder> {
+
+  @Override
+  protected HRBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createHRBuilder();
+  }
+
+  @Override
+  protected HRBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endHR();
+  }
+
+  @Override
+  protected HRBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startHR();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlHeadBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlHeadBuilderTest.java
new file mode 100644
index 0000000..b360d29
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlHeadBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlHeadBuilder}.
+ */
+public class HtmlHeadBuilderTest extends ElementBuilderTestBase<HeadBuilder> {
+
+  @Override
+  protected HeadBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createHeadBuilder();
+  }
+
+  @Override
+  protected HeadBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endHead();
+  }
+
+  @Override
+  protected HeadBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startHead();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlHeadingBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlHeadingBuilderTest.java
new file mode 100644
index 0000000..c85a14a
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlHeadingBuilderTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlHeadingBuilder}.
+ */
+public class HtmlHeadingBuilderTest extends ElementBuilderTestBase<HeadingBuilder> {
+
+  /**
+   * Test that the start and end tags match for all Heading elements.
+   */
+  public void testEndAll() {
+    for (ElementBuilderFactory factory : getFactories()) {
+      HeadingBuilder h1 = factory.createH1Builder();
+      assertNull(h1.endH1());
+
+      HeadingBuilder h2 = factory.createH2Builder();
+      assertNull(h2.endH2());
+
+      HeadingBuilder h3 = factory.createH3Builder();
+      assertNull(h3.endH3());
+
+      HeadingBuilder h4 = factory.createH4Builder();
+      assertNull(h4.endH4());
+
+      HeadingBuilder h5 = factory.createH5Builder();
+      assertNull(h5.endH5());
+
+      HeadingBuilder h6 = factory.createH6Builder();
+      assertNull(h6.endH6());
+    }
+  }
+
+  @Override
+  protected HeadingBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createH1Builder();
+  }
+
+  @Override
+  protected HeadingBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endH1();
+  }
+
+  @Override
+  protected HeadingBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startH1();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlIFrameBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlIFrameBuilderTest.java
new file mode 100644
index 0000000..88a3eed
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlIFrameBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlIFrameBuilder}.
+ */
+public class HtmlIFrameBuilderTest extends ElementBuilderTestBase<IFrameBuilder> {
+
+  @Override
+  protected IFrameBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createIFrameBuilder();
+  }
+
+  @Override
+  protected IFrameBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endIFrame();
+  }
+
+  @Override
+  protected IFrameBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startIFrame();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlImageBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlImageBuilderTest.java
new file mode 100644
index 0000000..ecead6d
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlImageBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlImageBuilder}.
+ */
+public class HtmlImageBuilderTest extends ElementBuilderTestBase<ImageBuilder> {
+
+  @Override
+  protected ImageBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createImageBuilder();
+  }
+
+  @Override
+  protected ImageBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endImage();
+  }
+
+  @Override
+  protected ImageBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startImage();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlInputBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlInputBuilderTest.java
new file mode 100644
index 0000000..17de4e7
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlInputBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlInputBuilder}.
+ */
+public class HtmlInputBuilderTest extends ElementBuilderTestBase<InputBuilder> {
+
+  @Override
+  protected InputBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createButtonInputBuilder();
+  }
+
+  @Override
+  protected InputBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endInput();
+  }
+
+  @Override
+  protected InputBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startButtonInput();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlLIBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlLIBuilderTest.java
new file mode 100644
index 0000000..bc4513b
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlLIBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlLIBuilder}.
+ */
+public class HtmlLIBuilderTest extends ElementBuilderTestBase<LIBuilder> {
+
+  @Override
+  protected LIBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createLIBuilder();
+  }
+
+  @Override
+  protected LIBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endLI();
+  }
+
+  @Override
+  protected LIBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startLI();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlLabelBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlLabelBuilderTest.java
new file mode 100644
index 0000000..2da263a
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlLabelBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlLabelBuilder}.
+ */
+public class HtmlLabelBuilderTest extends ElementBuilderTestBase<LabelBuilder> {
+
+  @Override
+  protected LabelBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createLabelBuilder();
+  }
+
+  @Override
+  protected LabelBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endLabel();
+  }
+
+  @Override
+  protected LabelBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startLabel();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlLegendBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlLegendBuilderTest.java
new file mode 100644
index 0000000..210be9c
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlLegendBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlLegendBuilder}.
+ */
+public class HtmlLegendBuilderTest extends ElementBuilderTestBase<LegendBuilder> {
+
+  @Override
+  protected LegendBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createLegendBuilder();
+  }
+
+  @Override
+  protected LegendBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endLegend();
+  }
+
+  @Override
+  protected LegendBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startLegend();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlLinkBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlLinkBuilderTest.java
new file mode 100644
index 0000000..982d2a2
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlLinkBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlLinkBuilder}.
+ */
+public class HtmlLinkBuilderTest extends ElementBuilderTestBase<LinkBuilder> {
+
+  @Override
+  protected LinkBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createLinkBuilder();
+  }
+
+  @Override
+  protected LinkBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endLink();
+  }
+
+  @Override
+  protected LinkBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startLink();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlMapBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlMapBuilderTest.java
new file mode 100644
index 0000000..7746f1a
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlMapBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlMapBuilder}.
+ */
+public class HtmlMapBuilderTest extends ElementBuilderTestBase<MapBuilder> {
+
+  @Override
+  protected MapBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createMapBuilder();
+  }
+
+  @Override
+  protected MapBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endMap();
+  }
+
+  @Override
+  protected MapBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startMap();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlMetaBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlMetaBuilderTest.java
new file mode 100644
index 0000000..37b9df0
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlMetaBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlMetaBuilder}.
+ */
+public class HtmlMetaBuilderTest extends ElementBuilderTestBase<MetaBuilder> {
+
+  @Override
+  protected MetaBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createMetaBuilder();
+  }
+
+  @Override
+  protected MetaBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endMeta();
+  }
+
+  @Override
+  protected MetaBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startMeta();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlOListBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlOListBuilderTest.java
new file mode 100644
index 0000000..e315354
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlOListBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlOListBuilder}.
+ */
+public class HtmlOListBuilderTest extends ElementBuilderTestBase<OListBuilder> {
+
+  @Override
+  protected OListBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createOListBuilder();
+  }
+
+  @Override
+  protected OListBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endOList();
+  }
+
+  @Override
+  protected OListBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startOList();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlOptGroupBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlOptGroupBuilderTest.java
new file mode 100644
index 0000000..b064d48
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlOptGroupBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlOptGroupBuilder}.
+ */
+public class HtmlOptGroupBuilderTest extends ElementBuilderTestBase<OptGroupBuilder> {
+
+  @Override
+  protected OptGroupBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createOptGroupBuilder();
+  }
+
+  @Override
+  protected OptGroupBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endOptGroup();
+  }
+
+  @Override
+  protected OptGroupBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startOptGroup();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlOptionBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlOptionBuilderTest.java
index fc958b3..17de36f 100644
--- a/user/test/com/google/gwt/dom/builder/shared/HtmlOptionBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlOptionBuilderTest.java
@@ -21,8 +21,13 @@
 public class HtmlOptionBuilderTest extends ElementBuilderTestBase<OptionBuilder> {
 
   @Override
-  protected OptionBuilder createElementBuilder() {
-    return HtmlBuilderFactory.get().createOptionBuilder();
+  protected OptionBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createOptionBuilder();
+  }
+
+  @Override
+  protected OptionBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endOption();
   }
 
   @Override
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlParagraphBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlParagraphBuilderTest.java
new file mode 100644
index 0000000..70dce93
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlParagraphBuilderTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlParagraphBuilder}.
+ */
+public class HtmlParagraphBuilderTest extends ElementBuilderTestBase<ParagraphBuilder> {
+
+  @Override
+  protected ParagraphBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createParagraphBuilder();
+  }
+  @Override
+  protected ParagraphBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endParagraph();
+  }
+
+  @Override
+  protected ParagraphBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startParagraph();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlParamBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlParamBuilderTest.java
new file mode 100644
index 0000000..53afb9a
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlParamBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlParamBuilder}.
+ */
+public class HtmlParamBuilderTest extends ElementBuilderTestBase<ParamBuilder> {
+
+  @Override
+  protected ParamBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createParamBuilder();
+  }
+
+  @Override
+  protected ParamBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endParam();
+  }
+
+  @Override
+  protected ParamBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startParam();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlPreBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlPreBuilderTest.java
new file mode 100644
index 0000000..5c78ae0
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlPreBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlPreBuilder}.
+ */
+public class HtmlPreBuilderTest extends ElementBuilderTestBase<PreBuilder> {
+
+  @Override
+  protected PreBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createPreBuilder();
+  }
+
+  @Override
+  protected PreBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endPre();
+  }
+
+  @Override
+  protected PreBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startPre();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlQuoteBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlQuoteBuilderTest.java
new file mode 100644
index 0000000..6ef75f1
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlQuoteBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlQuoteBuilder}.
+ */
+public class HtmlQuoteBuilderTest extends ElementBuilderTestBase<QuoteBuilder> {
+
+  @Override
+  protected QuoteBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createQuoteBuilder();
+  }
+
+  @Override
+  protected QuoteBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endQuote();
+  }
+
+  @Override
+  protected QuoteBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startQuote();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlScriptBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlScriptBuilderTest.java
new file mode 100644
index 0000000..83f110a
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlScriptBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlScriptBuilder}.
+ */
+public class HtmlScriptBuilderTest extends ElementBuilderTestBase<ScriptBuilder> {
+
+  @Override
+  protected ScriptBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createScriptBuilder();
+  }
+
+  @Override
+  protected ScriptBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endScript();
+  }
+
+  @Override
+  protected ScriptBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startScript();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlSelectBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlSelectBuilderTest.java
index e0d57ae..0d73ebd 100644
--- a/user/test/com/google/gwt/dom/builder/shared/HtmlSelectBuilderTest.java
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlSelectBuilderTest.java
@@ -21,8 +21,13 @@
 public class HtmlSelectBuilderTest extends ElementBuilderTestBase<SelectBuilder> {
 
   @Override
-  protected SelectBuilder createElementBuilder() {
-    return HtmlBuilderFactory.get().createSelectBuilder();
+  protected SelectBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createSelectBuilder();
+  }
+
+  @Override
+  protected SelectBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endSelect();
   }
 
   @Override
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlSourceBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlSourceBuilderTest.java
new file mode 100644
index 0000000..8489f4b
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlSourceBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlSourceBuilder}.
+ */
+public class HtmlSourceBuilderTest extends ElementBuilderTestBase<SourceBuilder> {
+
+  @Override
+  protected SourceBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createSourceBuilder();
+  }
+
+  @Override
+  protected SourceBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endSource();
+  }
+
+  @Override
+  protected SourceBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startSource();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlSpanBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlSpanBuilderTest.java
new file mode 100644
index 0000000..5094f44
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlSpanBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlSpanBuilder}.
+ */
+public class HtmlSpanBuilderTest extends ElementBuilderTestBase<SpanBuilder> {
+
+  @Override
+  protected SpanBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createSpanBuilder();
+  }
+
+  @Override
+  protected SpanBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endSpan();
+  }
+
+  @Override
+  protected SpanBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startSpan();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlStyleBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlStyleBuilderTest.java
new file mode 100644
index 0000000..23dd36a
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlStyleBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlStyleBuilder}.
+ */
+public class HtmlStyleBuilderTest extends ElementBuilderTestBase<StyleBuilder> {
+
+  @Override
+  protected StyleBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createStyleBuilder();
+  }
+
+  @Override
+  protected StyleBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endStyle();
+  }
+
+  @Override
+  protected StyleBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startStyle();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlTableBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlTableBuilderTest.java
new file mode 100644
index 0000000..40835c9
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlTableBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlTableBuilder}.
+ */
+public class HtmlTableBuilderTest extends ElementBuilderTestBase<TableBuilder> {
+
+  @Override
+  protected TableBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createTableBuilder();
+  }
+
+  @Override
+  protected TableBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endTable();
+  }
+
+  @Override
+  protected TableBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startTable();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlTableCaptionBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlTableCaptionBuilderTest.java
new file mode 100644
index 0000000..a88abcb
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlTableCaptionBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlTableCaptionBuilder}.
+ */
+public class HtmlTableCaptionBuilderTest extends ElementBuilderTestBase<TableCaptionBuilder> {
+
+  @Override
+  protected TableCaptionBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createTableCaptionBuilder();
+  }
+
+  @Override
+  protected TableCaptionBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endTableCaption();
+  }
+
+  @Override
+  protected TableCaptionBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startTableCaption();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlTableCellBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlTableCellBuilderTest.java
new file mode 100644
index 0000000..14e4b1f
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlTableCellBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlTableCellBuilder}.
+ */
+public class HtmlTableCellBuilderTest extends ElementBuilderTestBase<TableCellBuilder> {
+
+  @Override
+  protected TableCellBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createTDBuilder();
+  }
+
+  @Override
+  protected TableCellBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endTD();
+  }
+
+  @Override
+  protected TableCellBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startTD();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlTableColBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlTableColBuilderTest.java
new file mode 100644
index 0000000..c9a5b86
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlTableColBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlTableColBuilder}.
+ */
+public class HtmlTableColBuilderTest extends ElementBuilderTestBase<TableColBuilder> {
+
+  @Override
+  protected TableColBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createColBuilder();
+  }
+
+  @Override
+  protected TableColBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endCol();
+  }
+
+  @Override
+  protected TableColBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startCol();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlTableRowBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlTableRowBuilderTest.java
new file mode 100644
index 0000000..3b555ba
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlTableRowBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlTableRowBuilder}.
+ */
+public class HtmlTableRowBuilderTest extends ElementBuilderTestBase<TableRowBuilder> {
+
+  @Override
+  protected TableRowBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createTRBuilder();
+  }
+
+  @Override
+  protected TableRowBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endTR();
+  }
+
+  @Override
+  protected TableRowBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startTR();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlTableSectionBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlTableSectionBuilderTest.java
new file mode 100644
index 0000000..7db40e8
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlTableSectionBuilderTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlTableSectionBuilder}.
+ */
+public class HtmlTableSectionBuilderTest extends ElementBuilderTestBase<TableSectionBuilder> {
+
+  /**
+   * Test that the start and end tags match for all table section elements.
+   */
+  public void testEndAll() {
+    for (ElementBuilderFactory factory : getFactories()) {
+      TableSectionBuilder tbody = factory.createTBodyBuilder();
+      assertNull(tbody.endTBody());
+
+      TableSectionBuilder thead = factory.createTHeadBuilder();
+      assertNull(thead.endTHead());
+
+      TableSectionBuilder tfoot = factory.createTFootBuilder();
+      assertNull(tfoot.endTFoot());
+    }
+  }
+
+  @Override
+  protected TableSectionBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createTBodyBuilder();
+  }
+
+  @Override
+  protected TableSectionBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endTBody();
+  }
+
+  @Override
+  protected TableSectionBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startTBody();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlTextAreaBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlTextAreaBuilderTest.java
new file mode 100644
index 0000000..8e3fe61
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlTextAreaBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlTextAreaBuilder}.
+ */
+public class HtmlTextAreaBuilderTest extends ElementBuilderTestBase<TextAreaBuilder> {
+
+  @Override
+  protected TextAreaBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createTextAreaBuilder();
+  }
+
+  @Override
+  protected TextAreaBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endTextArea();
+  }
+
+  @Override
+  protected TextAreaBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startTextArea();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlTitleBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlTitleBuilderTest.java
new file mode 100644
index 0000000..64f2719
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlTitleBuilderTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlTitleBuilder}.
+ */
+public class HtmlTitleBuilderTest extends ElementBuilderTestBase<TitleBuilder> {
+
+  @Override
+  protected TitleBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return HtmlBuilderFactory.get().createTitleBuilder();
+  }
+
+  @Override
+  protected TitleBuilder endElement(ElementBuilderBase<?> builder) {
+    return ((HtmlElementBuilderBase<?>) builder).endTitle();
+  }
+
+  @Override
+  protected ElementBuilderFactory[] getFactories() {
+    // Only supported by HTML implementation.
+    return new ElementBuilderFactory[]{HtmlBuilderFactory.get()};
+  }
+
+  @Override
+  protected TitleBuilder startElement(ElementBuilderBase<?> builder) {
+    return ((HtmlElementBuilderBase<?>) builder).startTitle();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlUListBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlUListBuilderTest.java
new file mode 100644
index 0000000..73289ab
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlUListBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlUListBuilder}.
+ */
+public class HtmlUListBuilderTest extends ElementBuilderTestBase<UListBuilder> {
+
+  @Override
+  protected UListBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createUListBuilder();
+  }
+
+  @Override
+  protected UListBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endUList();
+  }
+
+  @Override
+  protected UListBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startUList();
+  }
+}
diff --git a/user/test/com/google/gwt/dom/builder/shared/HtmlVideoBuilderTest.java b/user/test/com/google/gwt/dom/builder/shared/HtmlVideoBuilderTest.java
new file mode 100644
index 0000000..cdfd746
--- /dev/null
+++ b/user/test/com/google/gwt/dom/builder/shared/HtmlVideoBuilderTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011 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.dom.builder.shared;
+
+/**
+ * Tests for {@link HtmlVideoBuilder}.
+ */
+public class HtmlVideoBuilderTest extends ElementBuilderTestBase<VideoBuilder> {
+
+  @Override
+  protected VideoBuilder createElementBuilder(ElementBuilderFactory factory) {
+    return factory.createVideoBuilder();
+  }
+
+  @Override
+  protected VideoBuilder endElement(ElementBuilderBase<?> builder) {
+    return builder.endVideo();
+  }
+
+  @Override
+  protected VideoBuilder startElement(ElementBuilderBase<?> builder) {
+    return builder.startVideo();
+  }
+}