diff --git a/xfa/fxfa/cxfa_ffwidgethandler.cpp b/xfa/fxfa/cxfa_ffwidgethandler.cpp
index aeb6a4a..3335a9e 100644
--- a/xfa/fxfa/cxfa_ffwidgethandler.cpp
+++ b/xfa/fxfa/cxfa_ffwidgethandler.cpp
@@ -258,312 +258,6 @@
                              gs_EventActivity[pParam->m_eType], pParam);
 }
 
-CXFA_FFWidget* CXFA_FFWidgetHandler::CreateWidget(CXFA_FFWidget* hParent,
-                                                  XFA_WIDGETTYPE eType,
-                                                  CXFA_FFWidget* hBefore) {
-  CXFA_Node* pParentFormItem = hParent ? hParent->GetNode() : nullptr;
-  CXFA_Node* pBeforeFormItem = hBefore ? hBefore->GetNode() : nullptr;
-  CXFA_Node* pNewFormItem =
-      CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem);
-  if (!pNewFormItem)
-    return nullptr;
-
-  CXFA_Node* templateNode = pNewFormItem->GetTemplateNodeIfExists();
-  if (!templateNode)
-    return nullptr;
-
-  templateNode->SetFlagAndNotify(XFA_NodeFlag_Initialized);
-  pNewFormItem->SetFlagAndNotify(XFA_NodeFlag_Initialized);
-  m_pDocView->RunLayout();
-  CXFA_LayoutItem* pLayout =
-      m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);
-  return GetFFWidget(ToContentLayoutItem(pLayout));
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(
-    XFA_WIDGETTYPE eType,
-    CXFA_Node* pParent,
-    CXFA_Node* pBefore) const {
-  switch (eType) {
-    case XFA_WIDGETTYPE_Barcode:
-      return nullptr;
-    case XFA_WIDGETTYPE_PushButton:
-      return CreatePushButton(pParent, pBefore);
-    case XFA_WIDGETTYPE_CheckButton:
-      return CreateCheckButton(pParent, pBefore);
-    case XFA_WIDGETTYPE_ExcludeGroup:
-      return CreateExclGroup(pParent, pBefore);
-    case XFA_WIDGETTYPE_RadioButton:
-      return CreateRadioButton(pParent, pBefore);
-    case XFA_WIDGETTYPE_Arc:
-      return CreateArc(pParent, pBefore);
-    case XFA_WIDGETTYPE_Rectangle:
-      return CreateRectangle(pParent, pBefore);
-    case XFA_WIDGETTYPE_Image:
-      return CreateImage(pParent, pBefore);
-    case XFA_WIDGETTYPE_Line:
-      return CreateLine(pParent, pBefore);
-    case XFA_WIDGETTYPE_Text:
-      return CreateText(pParent, pBefore);
-    case XFA_WIDGETTYPE_DatetimeEdit:
-      return CreateDatetimeEdit(pParent, pBefore);
-    case XFA_WIDGETTYPE_DecimalField:
-      return CreateDecimalField(pParent, pBefore);
-    case XFA_WIDGETTYPE_NumericField:
-      return CreateNumericField(pParent, pBefore);
-    case XFA_WIDGETTYPE_Signature:
-      return CreateSignature(pParent, pBefore);
-    case XFA_WIDGETTYPE_TextEdit:
-      return CreateTextEdit(pParent, pBefore);
-    case XFA_WIDGETTYPE_DropdownList:
-      return CreateDropdownList(pParent, pBefore);
-    case XFA_WIDGETTYPE_ListBox:
-      return CreateListBox(pParent, pBefore);
-    case XFA_WIDGETTYPE_ImageField:
-      return CreateImageField(pParent, pBefore);
-    case XFA_WIDGETTYPE_PasswordEdit:
-      return CreatePasswordEdit(pParent, pBefore);
-    case XFA_WIDGETTYPE_Subform:
-      return CreateSubform(pParent, pBefore);
-    default:
-      return nullptr;
-  }
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent,
-                                                  CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_Element::Button, pParent, pBefore);
-  CXFA_Node* pCaption = CreateCopyNode(XFA_Element::Caption, pField, nullptr);
-  CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pCaption, nullptr);
-  CXFA_Node* pText = CreateCopyNode(XFA_Element::Text, pValue, nullptr);
-  pText->JSObject()->SetContent(L"Button", L"Button", false, false, true);
-
-  CXFA_Node* pPara = CreateCopyNode(XFA_Element::Para, pCaption, nullptr);
-  pPara->JSObject()->SetEnum(XFA_Attribute::VAlign, XFA_AttributeValue::Middle,
-                             false);
-  pPara->JSObject()->SetEnum(XFA_Attribute::HAlign, XFA_AttributeValue::Center,
-                             false);
-  CreateFontNode(pCaption);
-
-  CXFA_Node* pBorder = CreateCopyNode(XFA_Element::Border, pField, nullptr);
-  pBorder->JSObject()->SetEnum(XFA_Attribute::Hand, XFA_AttributeValue::Right,
-                               false);
-
-  CXFA_Node* pEdge = CreateCopyNode(XFA_Element::Edge, pBorder, nullptr);
-  pEdge->JSObject()->SetEnum(XFA_Attribute::Stroke, XFA_AttributeValue::Raised,
-                             false);
-
-  CXFA_Node* pFill = CreateCopyNode(XFA_Element::Fill, pBorder, nullptr);
-  CXFA_Node* pColor = CreateCopyNode(XFA_Element::Color, pFill, nullptr);
-  pColor->JSObject()->SetCData(XFA_Attribute::Value, L"212, 208, 200", false,
-                               false);
-
-  CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField, nullptr);
-  pBind->JSObject()->SetEnum(XFA_Attribute::Match, XFA_AttributeValue::None,
-                             false);
-
-  return pField;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent,
-                                                   CXFA_Node* pBefore) const {
-  return CreateField(XFA_Element::CheckButton, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent,
-                                                 CXFA_Node* pBefore) const {
-  return CreateFormItem(XFA_Element::ExclGroup, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateRadioButton(CXFA_Node* pParent,
-                                                   CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_Element::CheckButton, pParent, pBefore);
-  CXFA_Ui* pUi = pField->GetFirstChildByClass<CXFA_Ui>(XFA_Element::Ui);
-  if (!pUi)
-    return nullptr;
-
-  CXFA_CheckButton* pWidget =
-      pUi->GetFirstChildByClass<CXFA_CheckButton>(XFA_Element::CheckButton);
-  if (!pWidget)
-    return nullptr;
-
-  pWidget->JSObject()->SetEnum(XFA_Attribute::Shape, XFA_AttributeValue::Round,
-                               false);
-  return pField;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_Element::DateTimeEdit, pParent, pBefore);
-  CreateValueNode(XFA_Element::Date, pField);
-  return pField;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateNumericField(pParent, pBefore);
-  CreateValueNode(XFA_Element::Decimal, pField);
-  return pField;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  return CreateField(XFA_Element::NumericEdit, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent,
-                                                 CXFA_Node* pBefore) const {
-  return CreateField(XFA_Element::Signature, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent,
-                                                CXFA_Node* pBefore) const {
-  return CreateField(XFA_Element::TextEdit, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  return CreateField(XFA_Element::ChoiceList, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent,
-                                               CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateDropdownList(pParent, pBefore);
-  CXFA_Node* pUi = pField->GetFirstChild();
-  CXFA_Node* pListBox = pUi->GetFirstChild();
-  pListBox->JSObject()->SetEnum(XFA_Attribute::Open, XFA_AttributeValue::Always,
-                                false);
-  pListBox->JSObject()->SetEnum(XFA_Attribute::CommitOn,
-                                XFA_AttributeValue::Exit, false);
-  return pField;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent,
-                                                  CXFA_Node* pBefore) const {
-  return CreateField(XFA_Element::ImageEdit, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_Element::PasswordEdit, pParent, pBefore);
-  CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField, nullptr);
-  pBind->JSObject()->SetEnum(XFA_Attribute::Match, XFA_AttributeValue::None,
-                             false);
-  return pField;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_Element eElement,
-                                             CXFA_Node* pParent,
-                                             CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateFormItem(XFA_Element::Field, pParent, pBefore);
-  CreateCopyNode(eElement, CreateCopyNode(XFA_Element::Ui, pField, nullptr),
-                 nullptr);
-  CreateFontNode(pField);
-  return pField;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent,
-                                           CXFA_Node* pBefore) const {
-  return CreateDraw(XFA_Element::Arc, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent,
-                                                 CXFA_Node* pBefore) const {
-  return CreateDraw(XFA_Element::Rectangle, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent,
-                                             CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateDraw(XFA_Element::Image, pParent, pBefore);
-  CreateCopyNode(XFA_Element::ImageEdit,
-                 CreateCopyNode(XFA_Element::Ui, pField, nullptr), nullptr);
-  return pField;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent,
-                                            CXFA_Node* pBefore) const {
-  return CreateDraw(XFA_Element::Line, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent,
-                                            CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateDraw(XFA_Element::Text, pParent, pBefore);
-  CreateCopyNode(XFA_Element::TextEdit,
-                 CreateCopyNode(XFA_Element::Ui, pField, nullptr), nullptr);
-  CreateFontNode(pField);
-  return pField;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_Element eElement,
-                                            CXFA_Node* pParent,
-                                            CXFA_Node* pBefore) const {
-  CXFA_Node* pDraw = CreateFormItem(XFA_Element::Draw, pParent, pBefore);
-  CreateValueNode(eElement, pDraw);
-  return pDraw;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent,
-                                               CXFA_Node* pBefore) const {
-  return CreateFormItem(XFA_Element::Subform, pParent, pBefore);
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_Element eElement,
-                                                CXFA_Node* pParent,
-                                                CXFA_Node* pBefore) const {
-  if (!pParent)
-    return nullptr;
-
-  CXFA_Node* pTemplateParent = pParent->GetTemplateNodeIfExists();
-  if (!pTemplateParent)
-    return nullptr;
-
-  CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(false);
-  if (pParent)
-    pParent->InsertChildAndNotify(pNewFormItem, pBefore);
-  return pNewFormItem;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_Element eElement,
-                                                CXFA_Node* pParent,
-                                                CXFA_Node* pBefore) const {
-  if (!pParent)
-    return nullptr;
-
-  CXFA_Node* pTemplateParent = pParent->GetTemplateNodeIfExists();
-  CXFA_Node* pNewNode =
-      CreateTemplateNode(eElement, pTemplateParent,
-                         pBefore ? pBefore->GetTemplateNodeIfExists() : nullptr)
-          ->Clone(false);
-  if (pParent)
-    pParent->InsertChildAndNotify(pNewNode, pBefore);
-  return pNewNode;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_Element eElement,
-                                                    CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  CXFA_Document* pXFADoc = GetXFADoc();
-  CXFA_Node* pNewTemplateNode =
-      pXFADoc->CreateNode(XFA_PacketType::Template, eElement);
-  if (pParent)
-    pParent->InsertChildAndNotify(pNewTemplateNode, pBefore);
-  return pNewTemplateNode;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const {
-  CXFA_Node* pFont = CreateCopyNode(XFA_Element::Font, pParent, nullptr);
-  pFont->JSObject()->SetCData(XFA_Attribute::Typeface, L"Myriad Pro", false,
-                              false);
-  return pFont;
-}
-
-CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_Element eValue,
-                                                 CXFA_Node* pParent) const {
-  CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pParent, nullptr);
-  CreateCopyNode(eValue, pValue, nullptr);
-  return pValue;
-}
-
 CXFA_Document* CXFA_FFWidgetHandler::GetObjFactory() const {
   return GetXFADoc();
 }
diff --git a/xfa/fxfa/cxfa_ffwidgethandler.h b/xfa/fxfa/cxfa_ffwidgethandler.h
index 93402f1..ab1cda1 100644
--- a/xfa/fxfa/cxfa_ffwidgethandler.h
+++ b/xfa/fxfa/cxfa_ffwidgethandler.h
@@ -21,10 +21,6 @@
   explicit CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView);
   ~CXFA_FFWidgetHandler();
 
-  CXFA_FFWidget* CreateWidget(CXFA_FFWidget* hParent,
-                              XFA_WIDGETTYPE eType,
-                              CXFA_FFWidget* hBefore);
-
   bool OnMouseEnter(CXFA_FFWidget* hWidget);
   bool OnMouseExit(CXFA_FFWidget* hWidget);
   bool OnLButtonDown(CXFA_FFWidget* hWidget,
@@ -75,47 +71,6 @@
   XFA_EventError ProcessEvent(CXFA_Node* pNode, CXFA_EventParam* pParam);
 
  private:
-  CXFA_Node* CreateWidgetFormItem(XFA_WIDGETTYPE eType,
-                                  CXFA_Node* pParent,
-                                  CXFA_Node* pBefore) const;
-
-  CXFA_Node* CreatePushButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateCheckButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateExclGroup(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateRadioButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateDatetimeEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateDecimalField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateNumericField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateSignature(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateTextEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateDropdownList(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateListBox(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateImageField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreatePasswordEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateField(XFA_Element eElement,
-                         CXFA_Node* pParent,
-                         CXFA_Node* pBefore) const;
-  CXFA_Node* CreateArc(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateRectangle(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateImage(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateLine(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateText(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateDraw(XFA_Element eElement,
-                        CXFA_Node* pParent,
-                        CXFA_Node* pBefore) const;
-
-  CXFA_Node* CreateSubform(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateFormItem(XFA_Element eElement,
-                            CXFA_Node* pParent,
-                            CXFA_Node* pBefore) const;
-  CXFA_Node* CreateCopyNode(XFA_Element eElement,
-                            CXFA_Node* pParent,
-                            CXFA_Node* pBefore) const;
-  CXFA_Node* CreateTemplateNode(XFA_Element eElement,
-                                CXFA_Node* pParent,
-                                CXFA_Node* pBefore) const;
-  CXFA_Node* CreateFontNode(CXFA_Node* pParent) const;
-  CXFA_Node* CreateValueNode(XFA_Element eValue, CXFA_Node* pParent) const;
   CXFA_Document* GetObjFactory() const;
   CXFA_Document* GetXFADoc() const;
 
diff --git a/xfa/fxfa/fxfa.h b/xfa/fxfa/fxfa.h
index 5c01da5..2028cd3 100644
--- a/xfa/fxfa/fxfa.h
+++ b/xfa/fxfa/fxfa.h
@@ -89,30 +89,6 @@
   XFA_WidgetStatus_Visible = 1 << 8
 };
 
-enum XFA_WIDGETTYPE {
-  XFA_WIDGETTYPE_Barcode,
-  XFA_WIDGETTYPE_PushButton,
-  XFA_WIDGETTYPE_CheckButton,
-  XFA_WIDGETTYPE_RadioButton,
-  XFA_WIDGETTYPE_DatetimeEdit,
-  XFA_WIDGETTYPE_DecimalField,
-  XFA_WIDGETTYPE_NumericField,
-  XFA_WIDGETTYPE_Signature,
-  XFA_WIDGETTYPE_TextEdit,
-  XFA_WIDGETTYPE_DropdownList,
-  XFA_WIDGETTYPE_ListBox,
-  XFA_WIDGETTYPE_ImageField,
-  XFA_WIDGETTYPE_PasswordEdit,
-  XFA_WIDGETTYPE_Arc,
-  XFA_WIDGETTYPE_Rectangle,
-  XFA_WIDGETTYPE_Image,
-  XFA_WIDGETTYPE_Line,
-  XFA_WIDGETTYPE_Text,
-  XFA_WIDGETTYPE_ExcludeGroup,
-  XFA_WIDGETTYPE_Subform,
-  XFA_WIDGETTYPE_Unknown,
-};
-
 // Probably should be called IXFA_AppDelegate.
 class IXFA_AppProvider {
  public:
