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();
+  }
+}
