diff --git a/user/src/com/google/gwt/uibinder/elementparsers/HtmlInterpreter.java b/user/src/com/google/gwt/uibinder/elementparsers/HtmlInterpreter.java
index 562c11e..bc57c3c 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/HtmlInterpreter.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/HtmlInterpreter.java
@@ -16,6 +16,7 @@
 package com.google.gwt.uibinder.elementparsers;
 
 import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.uibinder.rebind.UiBinderWriter;
 import com.google.gwt.uibinder.rebind.XMLElement;
 import com.google.gwt.uibinder.rebind.XMLElement.Interpreter;
@@ -84,6 +85,11 @@
     if (writer.isWidgetElement(elem)) {
       writer.die(elem, "Found widget in an HTML context");
     }
+    if (writer.useLazyWidgetBuilders() &&
+        writer.isSubclassOf(elem, SafeHtml.class)) {
+      String childFieldName = writer.parseElementToField(elem);
+      return writer.tokenForExpression(childFieldName);
+    }
     return pipe.interpretElement(elem);
   }
 }
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
index 6ca0cb8..d0572f8 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -39,6 +39,7 @@
 import com.google.gwt.uibinder.rebind.model.OwnerClass;
 import com.google.gwt.uibinder.rebind.model.OwnerField;
 import com.google.gwt.user.client.ui.Attachable;
+import com.google.gwt.user.client.ui.Widget;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -557,7 +558,7 @@
       throws UnableToCompleteException {
     String tagName = elem.getLocalName();
 
-    if (!isWidgetElement(elem)) {
+    if (!isImportedElement(elem)) {
       return findDomElementTypeForTag(tagName);
     }
 
@@ -673,9 +674,20 @@
     return uri != null && UiBinderGenerator.BINDER_URI.equals(uri);
   }
 
-  public boolean isWidgetElement(XMLElement elem) {
+  public boolean isSubclassOf(XMLElement elem, Class<?> clazz)
+      throws UnableToCompleteException {
     String uri = elem.getNamespaceUri();
-    return uri != null && uri.startsWith(PACKAGE_URI_SCHEME);
+    JClassType t = findFieldType(elem);
+    if (t == null) {
+      return false;
+    }
+    JClassType widgetType = oracle.findType(clazz.getCanonicalName());
+    return t.isAssignableTo(widgetType);
+  }
+
+  public boolean isWidgetElement(XMLElement elem)
+      throws UnableToCompleteException {
+    return isSubclassOf(elem, Widget.class);
   }
 
   /**
@@ -1024,6 +1036,11 @@
     return parsers;
   }
 
+  private boolean isImportedElement(XMLElement elem) {
+    String uri = elem.getNamespaceUri();
+    return uri != null && uri.startsWith(PACKAGE_URI_SCHEME);  
+  }
+
   /**
    * Writes a field setter if the field is not provided and the field class is
    * compatible with its respective template field.
diff --git a/user/test/com/google/gwt/uibinder/UiBinderGwtSuite.java b/user/test/com/google/gwt/uibinder/UiBinderGwtSuite.java
index e251075..b45ba38 100644
--- a/user/test/com/google/gwt/uibinder/UiBinderGwtSuite.java
+++ b/user/test/com/google/gwt/uibinder/UiBinderGwtSuite.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -18,6 +18,7 @@
 import com.google.gwt.junit.tools.GWTTestSuite;
 import com.google.gwt.uibinder.client.UiBinderUtilTest;
 import com.google.gwt.uibinder.test.client.InnerWidgetTest;
+import com.google.gwt.uibinder.test.client.LazyWidgetBuildersTest;
 import com.google.gwt.uibinder.test.client.TestParameterizedWidgets;
 import com.google.gwt.uibinder.test.client.UiBinderTest;
 
@@ -35,6 +36,7 @@
     suite.addTestSuite(UiBinderUtilTest.class);
     suite.addTestSuite(TestParameterizedWidgets.class);
     suite.addTestSuite(InnerWidgetTest.class);
+    suite.addTestSuite(LazyWidgetBuildersTest.class);
 
     return suite;
   }
diff --git a/user/test/com/google/gwt/uibinder/elementparsers/AbsolutePanelParserTest.java b/user/test/com/google/gwt/uibinder/elementparsers/AbsolutePanelParserTest.java
index 2e981f7..8cdbabd 100644
--- a/user/test/com/google/gwt/uibinder/elementparsers/AbsolutePanelParserTest.java
+++ b/user/test/com/google/gwt/uibinder/elementparsers/AbsolutePanelParserTest.java
@@ -95,7 +95,7 @@
     b.append("  <g:at left='1' top='2'>");
     b.append("    <g:Button/>");
     b.append("  </g:at>");
-    b.append("  <g:TextBox/>");
+    b.append("  <g:Label/>");
     b.append("  <g:at left='10' top='20'>");
     b.append("    <g:Label/>");
     b.append("  </g:at>");
@@ -104,7 +104,7 @@
     tester.parse(b.toString());
 
     assertStatements("fieldName.add(<g:Button>, 1, 2);",
-        "fieldName.add(<g:TextBox>);", "fieldName.add(<g:Label>, 10, 20);");
+        "fieldName.add(<g:Label>);", "fieldName.add(<g:Label>, 10, 20);");
   }
 
   private void assertStatements(String... expected) {
diff --git a/user/test/com/google/gwt/uibinder/test/LazyWidgetBuilderTest.gwt.xml b/user/test/com/google/gwt/uibinder/test/LazyWidgetBuilderTest.gwt.xml
new file mode 100644
index 0000000..87eac8b
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/LazyWidgetBuilderTest.gwt.xml
@@ -0,0 +1,19 @@
+<!-- Copyright 2011 Google Inc.                                             -->
+<!-- Licensed under the Apache License, Version 2.0 (the "License"); you    -->
+<!-- may not use this file except in compliance with the License. You may   -->
+<!-- may obtain a copy of the License at                                    -->
+<!--                                                                        -->
+<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
+<!--                                                                        -->
+<!-- Unless required by applicable law or agreed to in writing, software    -->
+<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
+<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
+<!-- implied. License for the specific language governing permissions and   -->
+<!-- limitations under the License.                                         -->
+
+<!-- GWT UiBinder support.                                                  -->
+<module>
+  <inherits name="com.google.gwt.user.User" />
+  <inherits name="com.google.gwt.debug.Debug"/>
+  <set-configuration-property name="UiBinder.useLazyWidgetBuilders" value="true"/>
+</module>
diff --git a/user/test/com/google/gwt/uibinder/test/client/LazyWidgetBuildersTest.DomBasedUi.ui.xml b/user/test/com/google/gwt/uibinder/test/client/LazyWidgetBuildersTest.DomBasedUi.ui.xml
new file mode 100644
index 0000000..467f090
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/LazyWidgetBuildersTest.DomBasedUi.ui.xml
@@ -0,0 +1,21 @@
+<!--                                                                        -->
+<!-- Copyright 2011 Google Inc.                                             -->
+<!-- Licensed under the Apache License, Version 2.0 (the "License"); you    -->
+<!-- may not use this file except in compliance with the License. You may   -->
+<!-- may obtain a copy of the License at                                    -->
+<!--                                                                        -->
+<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
+<!--                                                                        -->
+<!-- Unless required by applicable law or agreed to in writing, software    -->
+<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
+<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
+<!-- implied. License for the specific language governing permissions and   -->
+<!-- limitations under the License.                                         -->
+<ui:UiBinder
+  xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:demo='urn:import:com.google.gwt.uibinder.test.client'
+  >
+  <div>
+    <div ui:field='div'><demo:SafeHtmlObject ui:field='safeObject' name="Bob" /></div>
+  </div>
+</ui:UiBinder>
diff --git a/user/test/com/google/gwt/uibinder/test/client/LazyWidgetBuildersTest.java b/user/test/com/google/gwt/uibinder/test/client/LazyWidgetBuildersTest.java
new file mode 100644
index 0000000..1b65ba7
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/LazyWidgetBuildersTest.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.uibinder.test.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.DivElement;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+
+/**
+ * Tests functionality guarded by UiBinder.useLazyWidgetBuilders.
+ */
+public class LazyWidgetBuildersTest extends GWTTestCase {
+  static class DomBasedUi {
+    interface Binder extends UiBinder<Element, DomBasedUi> {
+    }
+
+    static final Binder binder = GWT.create(Binder.class);
+
+    @UiField DivElement div;
+    @UiField SafeHtmlObject safeObject;
+
+    DomBasedUi() {
+      binder.createAndBindUi(this);
+    }
+  }
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.uibinder.test.LazyWidgetBuilderTest";
+  }
+
+  public void testSafeHtml() {
+    DomBasedUi domUi = new DomBasedUi();
+    assertNotNull(domUi.safeObject);
+    assertEquals(domUi.safeObject.asString(), domUi.div.getInnerHTML());
+    assertEquals("Hello <b>Bob</b>".toLowerCase(), domUi.div.getInnerHTML().toLowerCase());
+  }
+}
diff --git a/user/test/com/google/gwt/uibinder/test/client/SafeHtmlObject.java b/user/test/com/google/gwt/uibinder/test/client/SafeHtmlObject.java
new file mode 100644
index 0000000..4f9b0d2
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/SafeHtmlObject.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.test.client;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+/**
+ * Used by UiBinderTest.
+ */
+public class SafeHtmlObject implements SafeHtml {
+  private String name = "unset";
+
+  @Override
+  public String asString() {
+    return "Hello <b>" + name + "</b>";
+  }
+
+  public void setName(String name) {
+    // Bad - should escape this name
+    this.name = name;
+  }
+}
