diff --git a/xfa/fwl/core/cfwl_barcode.cpp b/xfa/fwl/core/cfwl_barcode.cpp
index b12a875..77faefe 100644
--- a/xfa/fwl/core/cfwl_barcode.cpp
+++ b/xfa/fwl/core/cfwl_barcode.cpp
@@ -18,7 +18,8 @@
 
 }  // namespace
 
-CFWL_Barcode::CFWL_Barcode(const IFWL_App* app) : CFWL_Edit(app) {}
+CFWL_Barcode::CFWL_Barcode(const IFWL_App* app)
+    : CFWL_Edit(app), m_dwAttributeMask(FWL_BCDATTRIBUTE_NONE) {}
 
 CFWL_Barcode::~CFWL_Barcode() {}
 
@@ -26,66 +27,79 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_Barcode>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_barcodeData));
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
 
   CFWL_Widget::Initialize();
 }
 
 void CFWL_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_CHARENCODING;
-  m_barcodeData.m_eCharEncoding = encoding;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_CHARENCODING;
+  m_eCharEncoding = encoding;
 }
+
 void CFWL_Barcode::SetModuleHeight(int32_t height) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_MODULEHEIGHT;
-  m_barcodeData.m_nModuleHeight = height;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_MODULEHEIGHT;
+  m_nModuleHeight = height;
 }
+
 void CFWL_Barcode::SetModuleWidth(int32_t width) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_MODULEWIDTH;
-  m_barcodeData.m_nModuleWidth = width;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_MODULEWIDTH;
+  m_nModuleWidth = width;
 }
+
 void CFWL_Barcode::SetDataLength(int32_t dataLength) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_DATALENGTH;
-  m_barcodeData.m_nDataLength = dataLength;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_DATALENGTH;
+  m_nDataLength = dataLength;
   ToBarcode(GetWidget())->SetLimit(dataLength);
 }
+
 void CFWL_Barcode::SetCalChecksum(bool calChecksum) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_CALCHECKSUM;
-  m_barcodeData.m_bCalChecksum = calChecksum;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_CALCHECKSUM;
+  m_bCalChecksum = calChecksum;
 }
+
 void CFWL_Barcode::SetPrintChecksum(bool printChecksum) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_PRINTCHECKSUM;
-  m_barcodeData.m_bPrintChecksum = printChecksum;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_PRINTCHECKSUM;
+  m_bPrintChecksum = printChecksum;
 }
+
 void CFWL_Barcode::SetTextLocation(BC_TEXT_LOC location) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_TEXTLOCATION;
-  m_barcodeData.m_eTextLocation = location;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_TEXTLOCATION;
+  m_eTextLocation = location;
 }
+
 void CFWL_Barcode::SetWideNarrowRatio(int32_t ratio) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_WIDENARROWRATIO;
-  m_barcodeData.m_nWideNarrowRatio = ratio;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_WIDENARROWRATIO;
+  m_nWideNarrowRatio = ratio;
 }
+
 void CFWL_Barcode::SetStartChar(FX_CHAR startChar) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_STARTCHAR;
-  m_barcodeData.m_cStartChar = startChar;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_STARTCHAR;
+  m_cStartChar = startChar;
 }
+
 void CFWL_Barcode::SetEndChar(FX_CHAR endChar) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_ENDCHAR;
-  m_barcodeData.m_cEndChar = endChar;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_ENDCHAR;
+  m_cEndChar = endChar;
 }
+
 void CFWL_Barcode::SetVersion(int32_t version) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_VERSION;
-  m_barcodeData.m_nVersion = version;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_VERSION;
+  m_nVersion = version;
 }
+
 void CFWL_Barcode::SetErrorCorrectionLevel(int32_t ecLevel) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_ECLEVEL;
-  m_barcodeData.m_nECLevel = ecLevel;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_ECLEVEL;
+  m_nECLevel = ecLevel;
 }
+
 void CFWL_Barcode::SetTruncated(bool truncated) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_TRUNCATED;
-  m_barcodeData.m_bTruncated = truncated;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_TRUNCATED;
+  m_bTruncated = truncated;
 }
+
 void CFWL_Barcode::ResetBarcodeAttributes() {
-  m_barcodeData.m_dwAttributeMask = FWL_BCDATTRIBUTE_NONE;
+  m_dwAttributeMask = FWL_BCDATTRIBUTE_NONE;
 }
 
 void CFWL_Barcode::SetType(BC_TYPE type) {
@@ -97,66 +111,63 @@
   return GetWidget() ? ToBarcode(GetWidget())->IsProtectedType() : false;
 }
 
-CFWL_Barcode::CFWL_BarcodeDP::CFWL_BarcodeDP()
-    : m_dwAttributeMask(FWL_BCDATTRIBUTE_NONE) {}
-
-FWL_Error CFWL_Barcode::CFWL_BarcodeDP::GetCaption(IFWL_Widget* pWidget,
-                                                   CFX_WideString& wsCaption) {
+FWL_Error CFWL_Barcode::GetCaption(IFWL_Widget* pWidget,
+                                   CFX_WideString& wsCaption) {
   return FWL_Error::Succeeded;
 }
 
-BC_CHAR_ENCODING CFWL_Barcode::CFWL_BarcodeDP::GetCharEncoding() const {
+BC_CHAR_ENCODING CFWL_Barcode::GetCharEncoding() const {
   return m_eCharEncoding;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetModuleHeight() const {
+int32_t CFWL_Barcode::GetModuleHeight() const {
   return m_nModuleHeight;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetModuleWidth() const {
+int32_t CFWL_Barcode::GetModuleWidth() const {
   return m_nModuleWidth;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetDataLength() const {
+int32_t CFWL_Barcode::GetDataLength() const {
   return m_nDataLength;
 }
 
-bool CFWL_Barcode::CFWL_BarcodeDP::GetCalChecksum() const {
+bool CFWL_Barcode::GetCalChecksum() const {
   return m_bCalChecksum;
 }
 
-bool CFWL_Barcode::CFWL_BarcodeDP::GetPrintChecksum() const {
+bool CFWL_Barcode::GetPrintChecksum() const {
   return m_bPrintChecksum;
 }
 
-BC_TEXT_LOC CFWL_Barcode::CFWL_BarcodeDP::GetTextLocation() const {
+BC_TEXT_LOC CFWL_Barcode::GetTextLocation() const {
   return m_eTextLocation;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetWideNarrowRatio() const {
+int32_t CFWL_Barcode::GetWideNarrowRatio() const {
   return m_nWideNarrowRatio;
 }
 
-FX_CHAR CFWL_Barcode::CFWL_BarcodeDP::GetStartChar() const {
+FX_CHAR CFWL_Barcode::GetStartChar() const {
   return m_cStartChar;
 }
 
-FX_CHAR CFWL_Barcode::CFWL_BarcodeDP::GetEndChar() const {
+FX_CHAR CFWL_Barcode::GetEndChar() const {
   return m_cEndChar;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetVersion() const {
+int32_t CFWL_Barcode::GetVersion() const {
   return m_nVersion;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetErrorCorrectionLevel() const {
+int32_t CFWL_Barcode::GetErrorCorrectionLevel() const {
   return m_nECLevel;
 }
 
-bool CFWL_Barcode::CFWL_BarcodeDP::GetTruncated() const {
+bool CFWL_Barcode::GetTruncated() const {
   return m_bTruncated;
 }
 
-uint32_t CFWL_Barcode::CFWL_BarcodeDP::GetBarcodeAttributeMask() const {
+uint32_t CFWL_Barcode::GetBarcodeAttributeMask() const {
   return m_dwAttributeMask;
 }
diff --git a/xfa/fwl/core/cfwl_barcode.h b/xfa/fwl/core/cfwl_barcode.h
index b5642d2..be89318 100644
--- a/xfa/fwl/core/cfwl_barcode.h
+++ b/xfa/fwl/core/cfwl_barcode.h
@@ -11,9 +11,7 @@
 #include "xfa/fwl/core/fwl_error.h"
 #include "xfa/fwl/core/ifwl_barcode.h"
 
-class CFWL_Widget;
-
-class CFWL_Barcode : public CFWL_Edit {
+class CFWL_Barcode : public CFWL_Edit, public IFWL_BarcodeDP {
  public:
   CFWL_Barcode(const IFWL_App*);
   ~CFWL_Barcode() override;
@@ -38,48 +36,41 @@
   void SetTruncated(bool truncated);
   void ResetBarcodeAttributes();
 
- protected:
-  class CFWL_BarcodeDP : public IFWL_BarcodeDP {
-   public:
-    CFWL_BarcodeDP();
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_BarcodeDP
+  BC_CHAR_ENCODING GetCharEncoding() const override;
+  int32_t GetModuleHeight() const override;
+  int32_t GetModuleWidth() const override;
+  int32_t GetDataLength() const override;
+  bool GetCalChecksum() const override;
+  bool GetPrintChecksum() const override;
+  BC_TEXT_LOC GetTextLocation() const override;
+  int32_t GetWideNarrowRatio() const override;
+  FX_CHAR GetStartChar() const override;
+  FX_CHAR GetEndChar() const override;
+  int32_t GetVersion() const override;
+  int32_t GetErrorCorrectionLevel() const override;
+  bool GetTruncated() const override;
+  uint32_t GetBarcodeAttributeMask() const override;
 
-    // IFWL_BarcodeDP
-    BC_CHAR_ENCODING GetCharEncoding() const override;
-    int32_t GetModuleHeight() const override;
-    int32_t GetModuleWidth() const override;
-    int32_t GetDataLength() const override;
-    bool GetCalChecksum() const override;
-    bool GetPrintChecksum() const override;
-    BC_TEXT_LOC GetTextLocation() const override;
-    int32_t GetWideNarrowRatio() const override;
-    FX_CHAR GetStartChar() const override;
-    FX_CHAR GetEndChar() const override;
-    int32_t GetVersion() const override;
-    int32_t GetErrorCorrectionLevel() const override;
-    bool GetTruncated() const override;
-    uint32_t GetBarcodeAttributeMask() const override;
-
-    BC_CHAR_ENCODING m_eCharEncoding;
-    int32_t m_nModuleHeight;
-    int32_t m_nModuleWidth;
-    int32_t m_nDataLength;
-    bool m_bCalChecksum;
-    bool m_bPrintChecksum;
-    BC_TEXT_LOC m_eTextLocation;
-    int32_t m_nWideNarrowRatio;
-    FX_CHAR m_cStartChar;
-    FX_CHAR m_cEndChar;
-    int32_t m_nVersion;
-    int32_t m_nECLevel;
-    bool m_bTruncated;
-    uint32_t m_dwAttributeMask;
-  };
-
-  CFWL_BarcodeDP m_barcodeData;
+ private:
+  BC_CHAR_ENCODING m_eCharEncoding;
+  int32_t m_nModuleHeight;
+  int32_t m_nModuleWidth;
+  int32_t m_nDataLength;
+  bool m_bCalChecksum;
+  bool m_bPrintChecksum;
+  BC_TEXT_LOC m_eTextLocation;
+  int32_t m_nWideNarrowRatio;
+  FX_CHAR m_cStartChar;
+  FX_CHAR m_cEndChar;
+  int32_t m_nVersion;
+  int32_t m_nECLevel;
+  bool m_bTruncated;
+  uint32_t m_dwAttributeMask;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_BARCODE_H_
diff --git a/xfa/fwl/core/cfwl_checkbox.cpp b/xfa/fwl/core/cfwl_checkbox.cpp
index 9baea41..5372083 100644
--- a/xfa/fwl/core/cfwl_checkbox.cpp
+++ b/xfa/fwl/core/cfwl_checkbox.cpp
@@ -19,7 +19,8 @@
 
 }  // namespace
 
-CFWL_CheckBox::CFWL_CheckBox(const IFWL_App* app) : CFWL_Widget(app) {}
+CFWL_CheckBox::CFWL_CheckBox(const IFWL_App* app)
+    : CFWL_Widget(app), m_fBoxHeight(16.0f), m_wsCaption(L"Check box") {}
 
 CFWL_CheckBox::~CFWL_CheckBox() {}
 
@@ -27,18 +28,18 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_CheckBox>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_checkboxData));
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
 
   CFWL_Widget::Initialize();
 }
 
 FWL_Error CFWL_CheckBox::SetCaption(const CFX_WideStringC& wsCaption) {
-  m_checkboxData.m_wsCaption = wsCaption;
+  m_wsCaption = wsCaption;
   return FWL_Error::Succeeded;
 }
 
 FWL_Error CFWL_CheckBox::SetBoxSize(FX_FLOAT fHeight) {
-  m_checkboxData.m_fBoxHeight = fHeight;
+  m_fBoxHeight = fHeight;
   return FWL_Error::Succeeded;
 }
 
@@ -50,16 +51,12 @@
   return ToCheckBox(GetWidget())->SetCheckState(iCheck);
 }
 
-CFWL_CheckBox::CFWL_CheckBoxDP::CFWL_CheckBoxDP()
-    : m_fBoxHeight(16.0f), m_wsCaption(L"Check box") {}
-
-FWL_Error CFWL_CheckBox::CFWL_CheckBoxDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
+FWL_Error CFWL_CheckBox::GetCaption(IFWL_Widget* pWidget,
+                                    CFX_WideString& wsCaption) {
   wsCaption = m_wsCaption;
   return FWL_Error::Succeeded;
 }
 
-FX_FLOAT CFWL_CheckBox::CFWL_CheckBoxDP::GetBoxSize(IFWL_Widget* pWidget) {
+FX_FLOAT CFWL_CheckBox::GetBoxSize(IFWL_Widget* pWidget) {
   return m_fBoxHeight;
 }
diff --git a/xfa/fwl/core/cfwl_checkbox.h b/xfa/fwl/core/cfwl_checkbox.h
index 22574b4..8ab8885 100644
--- a/xfa/fwl/core/cfwl_checkbox.h
+++ b/xfa/fwl/core/cfwl_checkbox.h
@@ -10,7 +10,7 @@
 #include "xfa/fwl/core/cfwl_widget.h"
 #include "xfa/fwl/core/ifwl_checkbox.h"
 
-class CFWL_CheckBox : public CFWL_Widget {
+class CFWL_CheckBox : public CFWL_Widget, public IFWL_CheckBoxDP {
  public:
   CFWL_CheckBox(const IFWL_App*);
   ~CFWL_CheckBox() override;
@@ -22,23 +22,16 @@
   int32_t GetCheckState();
   FWL_Error SetCheckState(int32_t iCheck);
 
- protected:
-  class CFWL_CheckBoxDP : public IFWL_CheckBoxDP {
-   public:
-    CFWL_CheckBoxDP();
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_CheckBoxDP
+  FX_FLOAT GetBoxSize(IFWL_Widget* pWidget) override;
 
-    // IFWL_CheckBoxDP
-    FX_FLOAT GetBoxSize(IFWL_Widget* pWidget) override;
-
-    FX_FLOAT m_fBoxHeight;
-    CFX_WideString m_wsCaption;
-  };
-
-  CFWL_CheckBoxDP m_checkboxData;
+ private:
+  FX_FLOAT m_fBoxHeight;
+  CFX_WideString m_wsCaption;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_CHECKBOX_H_
diff --git a/xfa/fwl/core/cfwl_combobox.cpp b/xfa/fwl/core/cfwl_combobox.cpp
index 60b6e50..fa2698b 100644
--- a/xfa/fwl/core/cfwl_combobox.cpp
+++ b/xfa/fwl/core/cfwl_combobox.cpp
@@ -24,7 +24,8 @@
 
 }  // namespace
 
-CFWL_ComboBox::CFWL_ComboBox(const IFWL_App* app) : CFWL_Widget(app) {}
+CFWL_ComboBox::CFWL_ComboBox(const IFWL_App* app)
+    : CFWL_Widget(app), m_fMaxListHeight(0), m_fItemHeight(0) {}
 
 CFWL_ComboBox::~CFWL_ComboBox() {}
 
@@ -32,7 +33,7 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_ComboBox>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_comboBoxData));
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
 
   CFWL_Widget::Initialize();
 }
@@ -41,8 +42,8 @@
   std::unique_ptr<CFWL_ComboBoxItem> pItem(new CFWL_ComboBoxItem);
   pItem->m_wsText = wsText;
   pItem->m_dwStyles = 0;
-  m_comboBoxData.m_ItemArray.push_back(std::move(pItem));
-  return m_comboBoxData.m_ItemArray.size() - 1;
+  m_ItemArray.push_back(std::move(pItem));
+  return m_ItemArray.size() - 1;
 }
 
 int32_t CFWL_ComboBox::AddString(const CFX_WideStringC& wsText,
@@ -51,31 +52,30 @@
   pItem->m_wsText = wsText;
   pItem->m_dwStyles = 0;
   pItem->m_pDIB = pIcon;
-  m_comboBoxData.m_ItemArray.push_back(std::move(pItem));
-  return m_comboBoxData.m_ItemArray.size() - 1;
+  m_ItemArray.push_back(std::move(pItem));
+  return m_ItemArray.size() - 1;
 }
 
 bool CFWL_ComboBox::RemoveAt(int32_t iIndex) {
-  if (iIndex < 0 ||
-      static_cast<size_t>(iIndex) >= m_comboBoxData.m_ItemArray.size()) {
+  if (iIndex < 0 || static_cast<size_t>(iIndex) >= m_ItemArray.size()) {
     return false;
   }
-  m_comboBoxData.m_ItemArray.erase(m_comboBoxData.m_ItemArray.begin() + iIndex);
+  m_ItemArray.erase(m_ItemArray.begin() + iIndex);
   return true;
 }
 
 void CFWL_ComboBox::RemoveAll() {
-  m_comboBoxData.m_ItemArray.clear();
+  m_ItemArray.clear();
 }
 
 int32_t CFWL_ComboBox::CountItems() {
-  return m_comboBoxData.CountItems(GetWidget());
+  return CountItems(GetWidget());
 }
 
 FWL_Error CFWL_ComboBox::GetTextByIndex(int32_t iIndex,
                                         CFX_WideString& wsText) {
-  CFWL_ComboBoxItem* pItem = static_cast<CFWL_ComboBoxItem*>(
-      m_comboBoxData.GetItem(m_pIface.get(), iIndex));
+  CFWL_ComboBoxItem* pItem =
+      static_cast<CFWL_ComboBoxItem*>(GetItem(m_pIface.get(), iIndex));
   if (!pItem)
     return FWL_Error::Indefinite;
   wsText = pItem->m_wsText;
@@ -141,13 +141,13 @@
 }
 
 FWL_Error CFWL_ComboBox::SetMaxListHeight(FX_FLOAT fMaxHeight) {
-  m_comboBoxData.m_fMaxListHeight = fMaxHeight;
+  m_fMaxListHeight = fMaxHeight;
   return FWL_Error::Succeeded;
 }
 
 FWL_Error CFWL_ComboBox::SetItemData(int32_t iIndex, void* pData) {
-  CFWL_ComboBoxItem* pItem = static_cast<CFWL_ComboBoxItem*>(
-      m_comboBoxData.GetItem(m_pIface.get(), iIndex));
+  CFWL_ComboBoxItem* pItem =
+      static_cast<CFWL_ComboBoxItem*>(GetItem(m_pIface.get(), iIndex));
   if (!pItem)
     return FWL_Error::Indefinite;
   pItem->m_pData = pData;
@@ -155,8 +155,8 @@
 }
 
 void* CFWL_ComboBox::GetItemData(int32_t iIndex) {
-  CFWL_ComboBoxItem* pItem = static_cast<CFWL_ComboBoxItem*>(
-      m_comboBoxData.GetItem(m_pIface.get(), iIndex));
+  CFWL_ComboBoxItem* pItem =
+      static_cast<CFWL_ComboBoxItem*>(GetItem(m_pIface.get(), iIndex));
   return pItem ? pItem->m_pData : nullptr;
 }
 
@@ -237,34 +237,25 @@
              : FWL_Error::Indefinite;
 }
 
-CFWL_ComboBox::CFWL_ComboBoxDP::CFWL_ComboBoxDP() {
-  m_fItemHeight = 0;
-  m_fMaxListHeight = 0;
-}
-
-CFWL_ComboBox::CFWL_ComboBoxDP::~CFWL_ComboBoxDP() {}
-
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
+FWL_Error CFWL_ComboBox::GetCaption(IFWL_Widget* pWidget,
+                                    CFX_WideString& wsCaption) {
   return FWL_Error::Succeeded;
 }
 
-int32_t CFWL_ComboBox::CFWL_ComboBoxDP::CountItems(const IFWL_Widget* pWidget) {
+int32_t CFWL_ComboBox::CountItems(const IFWL_Widget* pWidget) {
   return m_ItemArray.size();
 }
 
-IFWL_ListItem* CFWL_ComboBox::CFWL_ComboBoxDP::GetItem(
-    const IFWL_Widget* pWidget,
-    int32_t nIndex) {
+IFWL_ListItem* CFWL_ComboBox::GetItem(const IFWL_Widget* pWidget,
+                                      int32_t nIndex) {
   if (nIndex < 0 || static_cast<size_t>(nIndex) >= m_ItemArray.size())
     return nullptr;
 
   return m_ItemArray[nIndex].get();
 }
 
-int32_t CFWL_ComboBox::CFWL_ComboBoxDP::GetItemIndex(IFWL_Widget* pWidget,
-                                                     IFWL_ListItem* pItem) {
+int32_t CFWL_ComboBox::GetItemIndex(IFWL_Widget* pWidget,
+                                    IFWL_ListItem* pItem) {
   auto it = std::find_if(
       m_ItemArray.begin(), m_ItemArray.end(),
       [pItem](const std::unique_ptr<CFWL_ComboBoxItem>& candidate) {
@@ -273,9 +264,9 @@
   return it != m_ItemArray.end() ? it - m_ItemArray.begin() : -1;
 }
 
-bool CFWL_ComboBox::CFWL_ComboBoxDP::SetItemIndex(IFWL_Widget* pWidget,
-                                                  IFWL_ListItem* pItem,
-                                                  int32_t nIndex) {
+bool CFWL_ComboBox::SetItemIndex(IFWL_Widget* pWidget,
+                                 IFWL_ListItem* pItem,
+                                 int32_t nIndex) {
   if (nIndex < 0 || static_cast<size_t>(nIndex) >= m_ItemArray.size())
     return false;
 
@@ -283,25 +274,25 @@
   return true;
 }
 
-uint32_t CFWL_ComboBox::CFWL_ComboBoxDP::GetItemStyles(IFWL_Widget* pWidget,
-                                                       IFWL_ListItem* pItem) {
+uint32_t CFWL_ComboBox::GetItemStyles(IFWL_Widget* pWidget,
+                                      IFWL_ListItem* pItem) {
   if (!pItem)
     return 0;
   return static_cast<CFWL_ComboBoxItem*>(pItem)->m_dwStyles;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::GetItemText(IFWL_Widget* pWidget,
-                                                      IFWL_ListItem* pItem,
-                                                      CFX_WideString& wsText) {
+FWL_Error CFWL_ComboBox::GetItemText(IFWL_Widget* pWidget,
+                                     IFWL_ListItem* pItem,
+                                     CFX_WideString& wsText) {
   if (!pItem)
     return FWL_Error::Indefinite;
   wsText = static_cast<CFWL_ComboBoxItem*>(pItem)->m_wsText;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::GetItemRect(IFWL_Widget* pWidget,
-                                                      IFWL_ListItem* pItem,
-                                                      CFX_RectF& rtItem) {
+FWL_Error CFWL_ComboBox::GetItemRect(IFWL_Widget* pWidget,
+                                     IFWL_ListItem* pItem,
+                                     CFX_RectF& rtItem) {
   if (!pItem)
     return FWL_Error::Indefinite;
   CFWL_ComboBoxItem* pComboItem = static_cast<CFWL_ComboBoxItem*>(pItem);
@@ -310,78 +301,73 @@
   return FWL_Error::Succeeded;
 }
 
-void* CFWL_ComboBox::CFWL_ComboBoxDP::GetItemData(IFWL_Widget* pWidget,
-                                                  IFWL_ListItem* pItem) {
+void* CFWL_ComboBox::GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) {
   return pItem ? static_cast<CFWL_ComboBoxItem*>(pItem)->m_pData : nullptr;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::SetItemStyles(IFWL_Widget* pWidget,
-                                                        IFWL_ListItem* pItem,
-                                                        uint32_t dwStyle) {
+FWL_Error CFWL_ComboBox::SetItemStyles(IFWL_Widget* pWidget,
+                                       IFWL_ListItem* pItem,
+                                       uint32_t dwStyle) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ComboBoxItem*>(pItem)->m_dwStyles = dwStyle;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::SetItemText(IFWL_Widget* pWidget,
-                                                      IFWL_ListItem* pItem,
-                                                      const FX_WCHAR* pszText) {
+FWL_Error CFWL_ComboBox::SetItemText(IFWL_Widget* pWidget,
+                                     IFWL_ListItem* pItem,
+                                     const FX_WCHAR* pszText) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ComboBoxItem*>(pItem)->m_wsText = pszText;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::SetItemRect(IFWL_Widget* pWidget,
-                                                      IFWL_ListItem* pItem,
-                                                      const CFX_RectF& rtItem) {
+FWL_Error CFWL_ComboBox::SetItemRect(IFWL_Widget* pWidget,
+                                     IFWL_ListItem* pItem,
+                                     const CFX_RectF& rtItem) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ComboBoxItem*>(pItem)->m_rtItem = rtItem;
   return FWL_Error::Succeeded;
 }
 
-FX_FLOAT CFWL_ComboBox::CFWL_ComboBoxDP::GetItemHeight(IFWL_Widget* pWidget) {
+FX_FLOAT CFWL_ComboBox::GetItemHeight(IFWL_Widget* pWidget) {
   return m_fItemHeight;
 }
 
-CFX_DIBitmap* CFWL_ComboBox::CFWL_ComboBoxDP::GetItemIcon(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem) {
+CFX_DIBitmap* CFWL_ComboBox::GetItemIcon(IFWL_Widget* pWidget,
+                                         IFWL_ListItem* pItem) {
   return pItem ? static_cast<CFWL_ComboBoxItem*>(pItem)->m_pDIB : nullptr;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::GetItemCheckRect(IFWL_Widget* pWidget,
-                                                           IFWL_ListItem* pItem,
-                                                           CFX_RectF& rtCheck) {
+FWL_Error CFWL_ComboBox::GetItemCheckRect(IFWL_Widget* pWidget,
+                                          IFWL_ListItem* pItem,
+                                          CFX_RectF& rtCheck) {
   rtCheck = static_cast<CFWL_ComboBoxItem*>(pItem)->m_rtCheckBox;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::SetItemCheckRect(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem,
-    const CFX_RectF& rtCheck) {
+FWL_Error CFWL_ComboBox::SetItemCheckRect(IFWL_Widget* pWidget,
+                                          IFWL_ListItem* pItem,
+                                          const CFX_RectF& rtCheck) {
   static_cast<CFWL_ComboBoxItem*>(pItem)->m_rtCheckBox = rtCheck;
   return FWL_Error::Succeeded;
 }
 
-uint32_t CFWL_ComboBox::CFWL_ComboBoxDP::GetItemCheckState(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem) {
+uint32_t CFWL_ComboBox::GetItemCheckState(IFWL_Widget* pWidget,
+                                          IFWL_ListItem* pItem) {
   return static_cast<CFWL_ComboBoxItem*>(pItem)->m_dwCheckState;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::SetItemCheckState(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem,
-    uint32_t dwCheckState) {
+FWL_Error CFWL_ComboBox::SetItemCheckState(IFWL_Widget* pWidget,
+                                           IFWL_ListItem* pItem,
+                                           uint32_t dwCheckState) {
   static_cast<CFWL_ComboBoxItem*>(pItem)->m_dwCheckState = dwCheckState;
   return FWL_Error::Succeeded;
 }
 
-FX_FLOAT CFWL_ComboBox::CFWL_ComboBoxDP::GetListHeight(IFWL_Widget* pWidget) {
+FX_FLOAT CFWL_ComboBox::GetListHeight(IFWL_Widget* pWidget) {
   return m_fMaxListHeight;
 }
 
diff --git a/xfa/fwl/core/cfwl_combobox.h b/xfa/fwl/core/cfwl_combobox.h
index c85b0e7..cd409ff 100644
--- a/xfa/fwl/core/cfwl_combobox.h
+++ b/xfa/fwl/core/cfwl_combobox.h
@@ -13,11 +13,21 @@
 #include "xfa/fwl/core/cfwl_widget.h"
 #include "xfa/fwl/core/ifwl_combobox.h"
 
-class IFWL_ComboBoxDP;
-class CFWL_ComboBoxDP;
-class CFWL_ComboBoxItem;
+class CFWL_ComboBoxItem : public IFWL_ListItem {
+ public:
+  CFWL_ComboBoxItem();
+  ~CFWL_ComboBoxItem();
 
-class CFWL_ComboBox : public CFWL_Widget {
+  CFX_RectF m_rtItem;
+  uint32_t m_dwStyles;
+  CFX_WideString m_wsText;
+  CFX_DIBitmap* m_pDIB;
+  uint32_t m_dwCheckState;
+  CFX_RectF m_rtCheckBox;
+  void* m_pData;
+};
+
+class CFWL_ComboBox : public CFWL_Widget, public IFWL_ComboBoxDP {
  public:
   CFWL_ComboBox(const IFWL_App*);
   ~CFWL_ComboBox() override;
@@ -68,78 +78,57 @@
   FWL_Error EditModifyStylesEx(uint32_t dwStylesExAdded,
                                uint32_t dwStylesExRemoved);
 
- protected:
-  class CFWL_ComboBoxDP : public IFWL_ComboBoxDP {
-   public:
-    CFWL_ComboBoxDP();
-    ~CFWL_ComboBoxDP() override;
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_ListBoxDP
+  int32_t CountItems(const IFWL_Widget* pWidget) override;
+  IFWL_ListItem* GetItem(const IFWL_Widget* pWidget, int32_t nIndex) override;
+  int32_t GetItemIndex(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  bool SetItemIndex(IFWL_Widget* pWidget,
+                    IFWL_ListItem* pItem,
+                    int32_t nIndex) override;
 
-    // IFWL_ListBoxDP
-    int32_t CountItems(const IFWL_Widget* pWidget) override;
-    IFWL_ListItem* GetItem(const IFWL_Widget* pWidget, int32_t nIndex) override;
-    int32_t GetItemIndex(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    bool SetItemIndex(IFWL_Widget* pWidget,
-                      IFWL_ListItem* pItem,
-                      int32_t nIndex) override;
-
-    uint32_t GetItemStyles(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    FWL_Error GetItemText(IFWL_Widget* pWidget,
+  uint32_t GetItemStyles(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  FWL_Error GetItemText(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        CFX_WideString& wsText) override;
+  FWL_Error GetItemRect(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        CFX_RectF& rtItem) override;
+  void* GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  FWL_Error SetItemStyles(IFWL_Widget* pWidget,
                           IFWL_ListItem* pItem,
-                          CFX_WideString& wsText) override;
-    FWL_Error GetItemRect(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          CFX_RectF& rtItem) override;
-    void* GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    FWL_Error SetItemStyles(IFWL_Widget* pWidget,
-                            IFWL_ListItem* pItem,
-                            uint32_t dwStyle) override;
-    FWL_Error SetItemText(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          const FX_WCHAR* pszText) override;
-    FWL_Error SetItemRect(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          const CFX_RectF& rtItem) override;
-    FX_FLOAT GetItemHeight(IFWL_Widget* pWidget) override;
-    CFX_DIBitmap* GetItemIcon(IFWL_Widget* pWidget,
-                              IFWL_ListItem* pItem) override;
-    FWL_Error GetItemCheckRect(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem,
-                               CFX_RectF& rtCheck) override;
-    FWL_Error SetItemCheckRect(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem,
-                               const CFX_RectF& rtCheck) override;
-    uint32_t GetItemCheckState(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem) override;
-    FWL_Error SetItemCheckState(IFWL_Widget* pWidget,
-                                IFWL_ListItem* pItem,
-                                uint32_t dwCheckState) override;
+                          uint32_t dwStyle) override;
+  FWL_Error SetItemText(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        const FX_WCHAR* pszText) override;
+  FWL_Error SetItemRect(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        const CFX_RectF& rtItem) override;
+  FX_FLOAT GetItemHeight(IFWL_Widget* pWidget) override;
+  CFX_DIBitmap* GetItemIcon(IFWL_Widget* pWidget,
+                            IFWL_ListItem* pItem) override;
+  FWL_Error GetItemCheckRect(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem,
+                             CFX_RectF& rtCheck) override;
+  FWL_Error SetItemCheckRect(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem,
+                             const CFX_RectF& rtCheck) override;
+  uint32_t GetItemCheckState(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem) override;
+  FWL_Error SetItemCheckState(IFWL_Widget* pWidget,
+                              IFWL_ListItem* pItem,
+                              uint32_t dwCheckState) override;
 
-    // IFWL_ComboBoxDP
-    FX_FLOAT GetListHeight(IFWL_Widget* pWidget) override;
+  // IFWL_ComboBoxDP
+  FX_FLOAT GetListHeight(IFWL_Widget* pWidget) override;
 
-    std::vector<std::unique_ptr<CFWL_ComboBoxItem>> m_ItemArray;
-    FX_FLOAT m_fMaxListHeight;
-    FX_FLOAT m_fItemHeight;
-  };
-  CFWL_ComboBoxDP m_comboBoxData;
-};
-
-class CFWL_ComboBoxItem : public IFWL_ListItem {
- public:
-  CFWL_ComboBoxItem();
-  ~CFWL_ComboBoxItem();
-
-  CFX_RectF m_rtItem;
-  uint32_t m_dwStyles;
-  CFX_WideString m_wsText;
-  CFX_DIBitmap* m_pDIB;
-  uint32_t m_dwCheckState;
-  CFX_RectF m_rtCheckBox;
-  void* m_pData;
+ private:
+  std::vector<std::unique_ptr<CFWL_ComboBoxItem>> m_ItemArray;
+  FX_FLOAT m_fMaxListHeight;
+  FX_FLOAT m_fItemHeight;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_COMBOBOX_H_
diff --git a/xfa/fwl/core/cfwl_datetimepicker.cpp b/xfa/fwl/core/cfwl_datetimepicker.cpp
index fba04b6..554a16b 100644
--- a/xfa/fwl/core/cfwl_datetimepicker.cpp
+++ b/xfa/fwl/core/cfwl_datetimepicker.cpp
@@ -22,7 +22,7 @@
 }  // namespace
 
 CFWL_DateTimePicker::CFWL_DateTimePicker(const IFWL_App* app)
-    : CFWL_Widget(app) {}
+    : CFWL_Widget(app), m_iYear(2011), m_iMonth(1), m_iDay(1) {}
 
 CFWL_DateTimePicker::~CFWL_DateTimePicker() {}
 
@@ -30,7 +30,7 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_DateTimePicker>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_DateTimePickerDP));
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
 
   CFWL_Widget::Initialize();
 }
@@ -38,9 +38,9 @@
 FWL_Error CFWL_DateTimePicker::SetToday(int32_t iYear,
                                         int32_t iMonth,
                                         int32_t iDay) {
-  m_DateTimePickerDP.m_iYear = iYear;
-  m_DateTimePickerDP.m_iMonth = iMonth;
-  m_DateTimePickerDP.m_iDay = iDay;
+  m_iYear = iYear;
+  m_iMonth = iMonth;
+  m_iDay = iDay;
   return FWL_Error::Succeeded;
 }
 
@@ -72,24 +72,16 @@
   return ToDateTimePicker(GetWidget())->SetCurSel(iYear, iMonth, iDay);
 }
 
-CFWL_DateTimePicker::CFWL_DateTimePickerDP::CFWL_DateTimePickerDP() {
-  m_iYear = 2011;
-  m_iMonth = 1;
-  m_iDay = 1;
-}
-
-FWL_Error CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
+FWL_Error CFWL_DateTimePicker::GetCaption(IFWL_Widget* pWidget,
+                                          CFX_WideString& wsCaption) {
   wsCaption = m_wsData;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetToday(
-    IFWL_Widget* pWidget,
-    int32_t& iYear,
-    int32_t& iMonth,
-    int32_t& iDay) {
+FWL_Error CFWL_DateTimePicker::GetToday(IFWL_Widget* pWidget,
+                                        int32_t& iYear,
+                                        int32_t& iMonth,
+                                        int32_t& iDay) {
   iYear = m_iYear;
   iMonth = m_iMonth;
   iDay = m_iDay;
diff --git a/xfa/fwl/core/cfwl_datetimepicker.h b/xfa/fwl/core/cfwl_datetimepicker.h
index 327364c..2b5277f 100644
--- a/xfa/fwl/core/cfwl_datetimepicker.h
+++ b/xfa/fwl/core/cfwl_datetimepicker.h
@@ -10,7 +10,7 @@
 #include "xfa/fwl/core/cfwl_widget.h"
 #include "xfa/fwl/core/ifwl_datetimepicker.h"
 
-class CFWL_DateTimePicker : public CFWL_Widget {
+class CFWL_DateTimePicker : public CFWL_Widget, public IFWL_DateTimePickerDP {
  public:
   CFWL_DateTimePicker(const IFWL_App*);
   ~CFWL_DateTimePicker() override;
@@ -42,27 +42,21 @@
   FWL_Error ModifyEditStylesEx(uint32_t dwStylesExAdded,
                                uint32_t dwStylesExRemoved);
 
- protected:
-  class CFWL_DateTimePickerDP : public IFWL_DateTimePickerDP {
-   public:
-    CFWL_DateTimePickerDP();
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_DateTimePickerDP
+  FWL_Error GetToday(IFWL_Widget* pWidget,
+                     int32_t& iYear,
+                     int32_t& iMonth,
+                     int32_t& iDay) override;
 
-    // IFWL_DateTimePickerDP
-    FWL_Error GetToday(IFWL_Widget* pWidget,
-                       int32_t& iYear,
-                       int32_t& iMonth,
-                       int32_t& iDay) override;
-    int32_t m_iYear;
-    int32_t m_iMonth;
-    int32_t m_iDay;
-    CFX_WideString m_wsData;
-  };
-
-  CFWL_DateTimePickerDP m_DateTimePickerDP;
+ private:
+  int32_t m_iYear;
+  int32_t m_iMonth;
+  int32_t m_iDay;
+  CFX_WideString m_wsData;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_DATETIMEPICKER_H_
diff --git a/xfa/fwl/core/cfwl_listbox.cpp b/xfa/fwl/core/cfwl_listbox.cpp
index 8590540..458a0eb 100644
--- a/xfa/fwl/core/cfwl_listbox.cpp
+++ b/xfa/fwl/core/cfwl_listbox.cpp
@@ -27,7 +27,7 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_ListBox>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_ListBoxDP), nullptr);
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this), nullptr);
 
   CFWL_Widget::Initialize();
 }
@@ -43,17 +43,16 @@
   pItem->m_dwStates = 0;
   pItem->m_wsText = wsAdd;
   pItem->m_dwStates = bSelect ? FWL_ITEMSTATE_LTB_Selected : 0;
-  m_ListBoxDP.m_ItemArray.push_back(std::move(pItem));
-  return m_ListBoxDP.m_ItemArray.back().get();
+  m_ItemArray.push_back(std::move(pItem));
+  return m_ItemArray.back().get();
 }
 
 bool CFWL_ListBox::DeleteString(IFWL_ListItem* pItem) {
-  int32_t nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), pItem);
-  if (nIndex < 0 ||
-      static_cast<size_t>(nIndex) >= m_ListBoxDP.m_ItemArray.size()) {
+  int32_t nIndex = GetItemIndex(GetWidget(), pItem);
+  if (nIndex < 0 || static_cast<size_t>(nIndex) >= m_ItemArray.size()) {
     return false;
   }
-  int32_t iCount = m_ListBoxDP.CountItems(m_pIface.get());
+  int32_t iCount = CountItems(m_pIface.get());
   int32_t iSel = nIndex + 1;
   if (iSel >= iCount) {
     iSel = nIndex - 1;
@@ -63,15 +62,15 @@
   }
   if (iSel >= 0) {
     CFWL_ListItem* pSel =
-        static_cast<CFWL_ListItem*>(m_ListBoxDP.GetItem(m_pIface.get(), iSel));
+        static_cast<CFWL_ListItem*>(GetItem(m_pIface.get(), iSel));
     pSel->m_dwStates |= FWL_ITEMSTATE_LTB_Selected;
   }
-  m_ListBoxDP.m_ItemArray.erase(m_ListBoxDP.m_ItemArray.begin() + nIndex);
+  m_ItemArray.erase(m_ItemArray.begin() + nIndex);
   return true;
 }
 
 void CFWL_ListBox::DeleteAll() {
-  m_ListBoxDP.m_ItemArray.clear();
+  m_ItemArray.clear();
 }
 
 int32_t CFWL_ListBox::CountSelItems() {
@@ -112,12 +111,12 @@
 }
 
 FWL_Error CFWL_ListBox::SetItemHeight(FX_FLOAT fItemHeight) {
-  m_ListBoxDP.m_fItemHeight = fItemHeight;
+  m_fItemHeight = fItemHeight;
   return FWL_Error::Succeeded;
 }
 
 IFWL_ListItem* CFWL_ListBox::GetFocusItem() {
-  for (const auto& pItem : m_ListBoxDP.m_ItemArray) {
+  for (const auto& pItem : m_ItemArray) {
     if (pItem->m_dwStates & FWL_ITEMSTATE_LTB_Focused)
       return pItem.get();
   }
@@ -125,20 +124,20 @@
 }
 
 FWL_Error CFWL_ListBox::SetFocusItem(IFWL_ListItem* pItem) {
-  int32_t nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), pItem);
-  m_ListBoxDP.m_ItemArray[nIndex]->m_dwStates |= FWL_ITEMSTATE_LTB_Focused;
+  int32_t nIndex = GetItemIndex(GetWidget(), pItem);
+  m_ItemArray[nIndex]->m_dwStates |= FWL_ITEMSTATE_LTB_Focused;
   return FWL_Error::Succeeded;
 }
 
 int32_t CFWL_ListBox::CountItems() {
-  return pdfium::CollectionSize<int32_t>(m_ListBoxDP.m_ItemArray);
+  return pdfium::CollectionSize<int32_t>(m_ItemArray);
 }
 
 IFWL_ListItem* CFWL_ListBox::GetItem(int32_t nIndex) {
   if (nIndex < 0 || nIndex >= CountItems())
     return nullptr;
 
-  return m_ListBoxDP.m_ItemArray[nIndex].get();
+  return m_ItemArray[nIndex].get();
 }
 
 FWL_Error CFWL_ListBox::SetItemString(IFWL_ListItem* pItem,
@@ -177,14 +176,14 @@
   FX_FLOAT fPosY = 0;
   ToListBox(GetWidget())->GetScrollPos(fx);
   ToListBox(GetWidget())->GetScrollPos(fy, false);
-  int32_t nCount = m_ListBoxDP.CountItems(nullptr);
+  int32_t nCount = CountItems(nullptr);
   for (int32_t i = 0; i < nCount; i++) {
-    IFWL_ListItem* pItem = m_ListBoxDP.GetItem(nullptr, i);
+    IFWL_ListItem* pItem = GetItem(nullptr, i);
     if (!pItem) {
       continue;
     }
     CFX_RectF rtItem;
-    m_ListBoxDP.GetItemRect(nullptr, pItem, rtItem);
+    GetItemRect(nullptr, pItem, rtItem);
     rtItem.Offset(-fPosX, -fPosY);
     if (rtItem.Contains(fx, fy)) {
       return pItem;
@@ -200,30 +199,25 @@
   return pListItem->m_dwStates | pListItem->m_dwCheckState;
 }
 
-CFWL_ListBox::CFWL_ListBoxDP::CFWL_ListBoxDP() {}
-
-CFWL_ListBox::CFWL_ListBoxDP::~CFWL_ListBoxDP() {}
-
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::GetCaption(IFWL_Widget* pWidget,
-                                                   CFX_WideString& wsCaption) {
+FWL_Error CFWL_ListBox::GetCaption(IFWL_Widget* pWidget,
+                                   CFX_WideString& wsCaption) {
   wsCaption = m_wsData;
   return FWL_Error::Succeeded;
 }
 
-int32_t CFWL_ListBox::CFWL_ListBoxDP::CountItems(const IFWL_Widget* pWidget) {
+int32_t CFWL_ListBox::CountItems(const IFWL_Widget* pWidget) {
   return pdfium::CollectionSize<int32_t>(m_ItemArray);
 }
 
-IFWL_ListItem* CFWL_ListBox::CFWL_ListBoxDP::GetItem(const IFWL_Widget* pWidget,
-                                                     int32_t nIndex) {
+IFWL_ListItem* CFWL_ListBox::GetItem(const IFWL_Widget* pWidget,
+                                     int32_t nIndex) {
   if (nIndex < 0 || nIndex >= CountItems(pWidget))
     return nullptr;
 
   return m_ItemArray[nIndex].get();
 }
 
-int32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemIndex(IFWL_Widget* pWidget,
-                                                   IFWL_ListItem* pItem) {
+int32_t CFWL_ListBox::GetItemIndex(IFWL_Widget* pWidget, IFWL_ListItem* pItem) {
   auto it = std::find_if(
       m_ItemArray.begin(), m_ItemArray.end(),
       [pItem](const std::unique_ptr<CFWL_ListItem>& candidate) {
@@ -232,105 +226,102 @@
   return it != m_ItemArray.end() ? it - m_ItemArray.begin() : -1;
 }
 
-bool CFWL_ListBox::CFWL_ListBoxDP::SetItemIndex(IFWL_Widget* pWidget,
-                                                IFWL_ListItem* pItem,
-                                                int32_t nIndex) {
+bool CFWL_ListBox::SetItemIndex(IFWL_Widget* pWidget,
+                                IFWL_ListItem* pItem,
+                                int32_t nIndex) {
   if (nIndex < 0 || nIndex >= CountItems(pWidget))
     return false;
   m_ItemArray[nIndex].reset(static_cast<CFWL_ListItem*>(pItem));
   return true;
 }
 
-uint32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemStyles(IFWL_Widget* pWidget,
-                                                     IFWL_ListItem* pItem) {
+uint32_t CFWL_ListBox::GetItemStyles(IFWL_Widget* pWidget,
+                                     IFWL_ListItem* pItem) {
   if (!pItem)
     return 0;
   return static_cast<CFWL_ListItem*>(pItem)->m_dwStates;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::GetItemText(IFWL_Widget* pWidget,
-                                                    IFWL_ListItem* pItem,
-                                                    CFX_WideString& wsText) {
+FWL_Error CFWL_ListBox::GetItemText(IFWL_Widget* pWidget,
+                                    IFWL_ListItem* pItem,
+                                    CFX_WideString& wsText) {
   if (!pItem)
     return FWL_Error::Indefinite;
   wsText = static_cast<CFWL_ListItem*>(pItem)->m_wsText;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::GetItemRect(IFWL_Widget* pWidget,
-                                                    IFWL_ListItem* pItem,
-                                                    CFX_RectF& rtItem) {
+FWL_Error CFWL_ListBox::GetItemRect(IFWL_Widget* pWidget,
+                                    IFWL_ListItem* pItem,
+                                    CFX_RectF& rtItem) {
   if (!pItem)
     return FWL_Error::Indefinite;
   rtItem = static_cast<CFWL_ListItem*>(pItem)->m_rtItem;
   return FWL_Error::Succeeded;
 }
 
-void* CFWL_ListBox::CFWL_ListBoxDP::GetItemData(IFWL_Widget* pWidget,
-                                                IFWL_ListItem* pItem) {
+void* CFWL_ListBox::GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) {
   return pItem ? static_cast<CFWL_ListItem*>(pItem)->m_pData : nullptr;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::SetItemStyles(IFWL_Widget* pWidget,
-                                                      IFWL_ListItem* pItem,
-                                                      uint32_t dwStyle) {
+FWL_Error CFWL_ListBox::SetItemStyles(IFWL_Widget* pWidget,
+                                      IFWL_ListItem* pItem,
+                                      uint32_t dwStyle) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ListItem*>(pItem)->m_dwStates = dwStyle;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::SetItemText(IFWL_Widget* pWidget,
-                                                    IFWL_ListItem* pItem,
-                                                    const FX_WCHAR* pszText) {
+FWL_Error CFWL_ListBox::SetItemText(IFWL_Widget* pWidget,
+                                    IFWL_ListItem* pItem,
+                                    const FX_WCHAR* pszText) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ListItem*>(pItem)->m_wsText = pszText;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::SetItemRect(IFWL_Widget* pWidget,
-                                                    IFWL_ListItem* pItem,
-                                                    const CFX_RectF& rtItem) {
+FWL_Error CFWL_ListBox::SetItemRect(IFWL_Widget* pWidget,
+                                    IFWL_ListItem* pItem,
+                                    const CFX_RectF& rtItem) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ListItem*>(pItem)->m_rtItem = rtItem;
   return FWL_Error::Succeeded;
 }
 
-FX_FLOAT CFWL_ListBox::CFWL_ListBoxDP::GetItemHeight(IFWL_Widget* pWidget) {
+FX_FLOAT CFWL_ListBox::GetItemHeight(IFWL_Widget* pWidget) {
   return m_fItemHeight;
 }
 
-CFX_DIBitmap* CFWL_ListBox::CFWL_ListBoxDP::GetItemIcon(IFWL_Widget* pWidget,
-                                                        IFWL_ListItem* pItem) {
+CFX_DIBitmap* CFWL_ListBox::GetItemIcon(IFWL_Widget* pWidget,
+                                        IFWL_ListItem* pItem) {
   return static_cast<CFWL_ListItem*>(pItem)->m_pDIB;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckRect(IFWL_Widget* pWidget,
-                                                         IFWL_ListItem* pItem,
-                                                         CFX_RectF& rtCheck) {
+FWL_Error CFWL_ListBox::GetItemCheckRect(IFWL_Widget* pWidget,
+                                         IFWL_ListItem* pItem,
+                                         CFX_RectF& rtCheck) {
   rtCheck = static_cast<CFWL_ListItem*>(pItem)->m_rtCheckBox;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckRect(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem,
-    const CFX_RectF& rtCheck) {
+FWL_Error CFWL_ListBox::SetItemCheckRect(IFWL_Widget* pWidget,
+                                         IFWL_ListItem* pItem,
+                                         const CFX_RectF& rtCheck) {
   static_cast<CFWL_ListItem*>(pItem)->m_rtCheckBox = rtCheck;
   return FWL_Error::Succeeded;
 }
 
-uint32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckState(IFWL_Widget* pWidget,
-                                                         IFWL_ListItem* pItem) {
+uint32_t CFWL_ListBox::GetItemCheckState(IFWL_Widget* pWidget,
+                                         IFWL_ListItem* pItem) {
   return static_cast<CFWL_ListItem*>(pItem)->m_dwCheckState;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckState(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem,
-    uint32_t dwCheckState) {
+FWL_Error CFWL_ListBox::SetItemCheckState(IFWL_Widget* pWidget,
+                                          IFWL_ListItem* pItem,
+                                          uint32_t dwCheckState) {
   static_cast<CFWL_ListItem*>(pItem)->m_dwCheckState = dwCheckState;
   return FWL_Error::Succeeded;
 }
diff --git a/xfa/fwl/core/cfwl_listbox.h b/xfa/fwl/core/cfwl_listbox.h
index cb77f90..d91ddff 100644
--- a/xfa/fwl/core/cfwl_listbox.h
+++ b/xfa/fwl/core/cfwl_listbox.h
@@ -15,9 +15,21 @@
 #include "xfa/fwl/core/ifwl_listbox.h"
 #include "xfa/fwl/core/ifwl_widget.h"
 
-class CFWL_ListItem;
+class CFWL_ListItem : public IFWL_ListItem {
+ public:
+  CFWL_ListItem();
+  ~CFWL_ListItem();
 
-class CFWL_ListBox : public CFWL_Widget {
+  CFX_RectF m_rtItem;
+  uint32_t m_dwStates;
+  CFX_WideString m_wsText;
+  CFX_DIBitmap* m_pDIB;
+  void* m_pData;
+  uint32_t m_dwCheckState;
+  CFX_RectF m_rtCheckBox;
+};
+
+class CFWL_ListBox : public CFWL_Widget, public IFWL_ListBoxDP {
  public:
   CFWL_ListBox(const IFWL_App*);
   ~CFWL_ListBox() override;
@@ -46,75 +58,53 @@
   IFWL_ListItem* GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy);
   uint32_t GetItemStates(IFWL_ListItem* pItem);
 
- protected:
-  class CFWL_ListBoxDP : public IFWL_ListBoxDP {
-   public:
-    CFWL_ListBoxDP();
-    ~CFWL_ListBoxDP() override;
+  // IFWL_DataProvider:
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider:
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
-
-    // IFWL_ListBoxDP:
-    int32_t CountItems(const IFWL_Widget* pWidget) override;
-    IFWL_ListItem* GetItem(const IFWL_Widget* pWidget, int32_t nIndex) override;
-    int32_t GetItemIndex(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    bool SetItemIndex(IFWL_Widget* pWidget,
-                      IFWL_ListItem* pItem,
-                      int32_t nIndex) override;
-    uint32_t GetItemStyles(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    FWL_Error GetItemText(IFWL_Widget* pWidget,
+  // IFWL_ListBoxDP:
+  int32_t CountItems(const IFWL_Widget* pWidget) override;
+  IFWL_ListItem* GetItem(const IFWL_Widget* pWidget, int32_t nIndex) override;
+  int32_t GetItemIndex(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  bool SetItemIndex(IFWL_Widget* pWidget,
+                    IFWL_ListItem* pItem,
+                    int32_t nIndex) override;
+  uint32_t GetItemStyles(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  FWL_Error GetItemText(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        CFX_WideString& wsText) override;
+  FWL_Error GetItemRect(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        CFX_RectF& rtItem) override;
+  void* GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  FWL_Error SetItemStyles(IFWL_Widget* pWidget,
                           IFWL_ListItem* pItem,
-                          CFX_WideString& wsText) override;
-    FWL_Error GetItemRect(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          CFX_RectF& rtItem) override;
-    void* GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    FWL_Error SetItemStyles(IFWL_Widget* pWidget,
-                            IFWL_ListItem* pItem,
-                            uint32_t dwStyle) override;
-    FWL_Error SetItemText(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          const FX_WCHAR* pszText) override;
-    FWL_Error SetItemRect(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          const CFX_RectF& rtItem) override;
-    FX_FLOAT GetItemHeight(IFWL_Widget* pWidget) override;
-    CFX_DIBitmap* GetItemIcon(IFWL_Widget* pWidget,
-                              IFWL_ListItem* pItem) override;
-    FWL_Error GetItemCheckRect(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem,
-                               CFX_RectF& rtCheck) override;
-    FWL_Error SetItemCheckRect(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem,
-                               const CFX_RectF& rtCheck) override;
-    uint32_t GetItemCheckState(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem) override;
-    FWL_Error SetItemCheckState(IFWL_Widget* pWidget,
-                                IFWL_ListItem* pItem,
-                                uint32_t dwCheckState) override;
+                          uint32_t dwStyle) override;
+  FWL_Error SetItemText(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        const FX_WCHAR* pszText) override;
+  FWL_Error SetItemRect(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        const CFX_RectF& rtItem) override;
+  FX_FLOAT GetItemHeight(IFWL_Widget* pWidget) override;
+  CFX_DIBitmap* GetItemIcon(IFWL_Widget* pWidget,
+                            IFWL_ListItem* pItem) override;
+  FWL_Error GetItemCheckRect(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem,
+                             CFX_RectF& rtCheck) override;
+  FWL_Error SetItemCheckRect(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem,
+                             const CFX_RectF& rtCheck) override;
+  uint32_t GetItemCheckState(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem) override;
+  FWL_Error SetItemCheckState(IFWL_Widget* pWidget,
+                              IFWL_ListItem* pItem,
+                              uint32_t dwCheckState) override;
 
-    std::vector<std::unique_ptr<CFWL_ListItem>> m_ItemArray;
-    CFX_WideString m_wsData;
-    FX_FLOAT m_fItemHeight;
-  };
-
-  CFWL_ListBoxDP m_ListBoxDP;
-};
-
-class CFWL_ListItem : public IFWL_ListItem {
- public:
-  CFWL_ListItem();
-  ~CFWL_ListItem();
-
-  CFX_RectF m_rtItem;
-  uint32_t m_dwStates;
-  CFX_WideString m_wsText;
-  CFX_DIBitmap* m_pDIB;
-  void* m_pData;
-  uint32_t m_dwCheckState;
-  CFX_RectF m_rtCheckBox;
+ private:
+  std::vector<std::unique_ptr<CFWL_ListItem>> m_ItemArray;
+  CFX_WideString m_wsData;
+  FX_FLOAT m_fItemHeight;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_LISTBOX_H_
diff --git a/xfa/fwl/core/cfwl_picturebox.cpp b/xfa/fwl/core/cfwl_picturebox.cpp
index a0e1c30..28d3186 100644
--- a/xfa/fwl/core/cfwl_picturebox.cpp
+++ b/xfa/fwl/core/cfwl_picturebox.cpp
@@ -10,84 +10,9 @@
 
 #include "third_party/base/ptr_util.h"
 
-CFWL_PictureBox::CFWL_PictureBox(const IFWL_App* app) : CFWL_Widget(app) {}
-
-CFWL_PictureBox::~CFWL_PictureBox() {}
-
-void CFWL_PictureBox::Initialize() {
-  ASSERT(!m_pIface);
-
-  m_pIface = pdfium::MakeUnique<IFWL_PictureBox>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_PictureBoxDP));
-
-  CFWL_Widget::Initialize();
-}
-
-CFX_DIBitmap* CFWL_PictureBox::GetPicture() {
-  return m_PictureBoxDP.m_pBitmap;
-}
-
-FWL_Error CFWL_PictureBox::SetPicture(CFX_DIBitmap* pBitmap) {
-  m_PictureBoxDP.m_pBitmap = pBitmap;
-  return FWL_Error::Succeeded;
-}
-
-FX_FLOAT CFWL_PictureBox::GetRotation() {
-  return m_PictureBoxDP.m_fRotation;
-}
-
-FWL_Error CFWL_PictureBox::SetRotation(FX_FLOAT fRotation) {
-  m_PictureBoxDP.m_fRotation = fRotation;
-  return FWL_Error::Succeeded;
-}
-
-int32_t CFWL_PictureBox::GetFlipMode() {
-  return m_PictureBoxDP.GetFlipMode(m_pIface.get());
-}
-
-FWL_Error CFWL_PictureBox::SetFlipMode(int32_t iFlipMode) {
-  m_PictureBoxDP.m_iFlipMode = iFlipMode;
-  return FWL_Error::Succeeded;
-}
-
-int32_t CFWL_PictureBox::GetOpacity() {
-  return m_PictureBoxDP.GetOpacity(m_pIface.get());
-}
-
-FWL_Error CFWL_PictureBox::SetOpacity(int32_t iOpacity) {
-  m_PictureBoxDP.m_iOpacity = iOpacity;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PictureBox::GetScale(FX_FLOAT& fScaleX, FX_FLOAT& fScaleY) {
-  CFX_Matrix matrix;
-  m_PictureBoxDP.GetMatrix(m_pIface.get(), matrix);
-  matrix.Scale(fScaleX, fScaleY);
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PictureBox::SetScale(FX_FLOAT fScaleX, FX_FLOAT fScaleY) {
-  m_PictureBoxDP.m_fScaleX = fScaleX;
-  m_PictureBoxDP.m_fScaleY = fScaleY;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PictureBox::GetOffset(FX_FLOAT& fx, FX_FLOAT& fy) {
-  CFX_Matrix matrix;
-  m_PictureBoxDP.GetMatrix(m_pIface.get(), matrix);
-  fx = matrix.e;
-  fy = matrix.f;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PictureBox::SetOffset(FX_FLOAT fx, FX_FLOAT fy) {
-  m_PictureBoxDP.m_fOffSetX = fx;
-  m_PictureBoxDP.m_fOffSetY = fy;
-  return FWL_Error::Succeeded;
-}
-
-CFWL_PictureBox::CFWL_PictureBoxDP::CFWL_PictureBoxDP()
-    : m_pBitmap(nullptr),
+CFWL_PictureBox::CFWL_PictureBox(const IFWL_App* app)
+    : CFWL_Widget(app),
+      m_pBitmap(nullptr),
       m_iOpacity(0),
       m_iFlipMode(0),
       m_fRotation(0.0f),
@@ -96,33 +21,102 @@
       m_fOffSetX(0.0f),
       m_fOffSetY(0.0f) {}
 
-FWL_Error CFWL_PictureBox::CFWL_PictureBoxDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
+CFWL_PictureBox::~CFWL_PictureBox() {}
+
+void CFWL_PictureBox::Initialize() {
+  ASSERT(!m_pIface);
+
+  m_pIface = pdfium::MakeUnique<IFWL_PictureBox>(
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
+
+  CFWL_Widget::Initialize();
+}
+
+CFX_DIBitmap* CFWL_PictureBox::GetPicture() {
+  return m_pBitmap;
+}
+
+FWL_Error CFWL_PictureBox::SetPicture(CFX_DIBitmap* pBitmap) {
+  m_pBitmap = pBitmap;
   return FWL_Error::Succeeded;
 }
 
-CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetPicture(
-    IFWL_Widget* pWidget) {
+FX_FLOAT CFWL_PictureBox::GetRotation() {
+  return m_fRotation;
+}
+
+FWL_Error CFWL_PictureBox::SetRotation(FX_FLOAT fRotation) {
+  m_fRotation = fRotation;
+  return FWL_Error::Succeeded;
+}
+
+int32_t CFWL_PictureBox::GetFlipMode() {
+  return GetFlipMode(m_pIface.get());
+}
+
+FWL_Error CFWL_PictureBox::SetFlipMode(int32_t iFlipMode) {
+  m_iFlipMode = iFlipMode;
+  return FWL_Error::Succeeded;
+}
+
+int32_t CFWL_PictureBox::GetOpacity() {
+  return GetOpacity(m_pIface.get());
+}
+
+FWL_Error CFWL_PictureBox::SetOpacity(int32_t iOpacity) {
+  m_iOpacity = iOpacity;
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PictureBox::GetScale(FX_FLOAT& fScaleX, FX_FLOAT& fScaleY) {
+  CFX_Matrix matrix;
+  GetMatrix(m_pIface.get(), matrix);
+  matrix.Scale(fScaleX, fScaleY);
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PictureBox::SetScale(FX_FLOAT fScaleX, FX_FLOAT fScaleY) {
+  m_fScaleX = fScaleX;
+  m_fScaleY = fScaleY;
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PictureBox::GetOffset(FX_FLOAT& fx, FX_FLOAT& fy) {
+  CFX_Matrix matrix;
+  GetMatrix(m_pIface.get(), matrix);
+  fx = matrix.e;
+  fy = matrix.f;
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PictureBox::SetOffset(FX_FLOAT fx, FX_FLOAT fy) {
+  m_fOffSetX = fx;
+  m_fOffSetY = fy;
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PictureBox::GetCaption(IFWL_Widget* pWidget,
+                                      CFX_WideString& wsCaption) {
+  return FWL_Error::Succeeded;
+}
+
+CFX_DIBitmap* CFWL_PictureBox::GetPicture(IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
 
-CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetErrorPicture(
-    IFWL_Widget* pWidget) {
+CFX_DIBitmap* CFWL_PictureBox::GetErrorPicture(IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
 
-CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetInitialPicture(
-    IFWL_Widget* pWidget) {
+CFX_DIBitmap* CFWL_PictureBox::GetInitialPicture(IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
 
-int32_t CFWL_PictureBox::CFWL_PictureBoxDP::GetOpacity(IFWL_Widget* pWidget) {
+int32_t CFWL_PictureBox::GetOpacity(IFWL_Widget* pWidget) {
   return m_iOpacity;
 }
 
-FWL_Error CFWL_PictureBox::CFWL_PictureBoxDP::GetMatrix(IFWL_Widget* pWidget,
-                                                        CFX_Matrix& matrix) {
+FWL_Error CFWL_PictureBox::GetMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) {
   CFX_RectF rect;
   pWidget->GetClientRect(rect);
   FX_FLOAT fLen = rect.width / 2;
@@ -136,6 +130,6 @@
   return FWL_Error::Succeeded;
 }
 
-int32_t CFWL_PictureBox::CFWL_PictureBoxDP::GetFlipMode(IFWL_Widget* pWidget) {
+int32_t CFWL_PictureBox::GetFlipMode(IFWL_Widget* pWidget) {
   return m_iFlipMode;
 }
diff --git a/xfa/fwl/core/cfwl_picturebox.h b/xfa/fwl/core/cfwl_picturebox.h
index f8fcdfb..5cd7c6f 100644
--- a/xfa/fwl/core/cfwl_picturebox.h
+++ b/xfa/fwl/core/cfwl_picturebox.h
@@ -11,7 +11,7 @@
 #include "xfa/fwl/core/fwl_error.h"
 #include "xfa/fwl/core/ifwl_picturebox.h"
 
-class CFWL_PictureBox : public CFWL_Widget {
+class CFWL_PictureBox : public CFWL_Widget, public IFWL_PictureBoxDP {
  public:
   CFWL_PictureBox(const IFWL_App*);
   ~CFWL_PictureBox() override;
@@ -31,35 +31,28 @@
   FWL_Error GetOffset(FX_FLOAT& fx, FX_FLOAT& fy);
   FWL_Error SetOffset(FX_FLOAT fx, FX_FLOAT fy);
 
- protected:
-  class CFWL_PictureBoxDP : public IFWL_PictureBoxDP {
-   public:
-    CFWL_PictureBoxDP();
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_PictureBoxDP
+  CFX_DIBitmap* GetPicture(IFWL_Widget* pWidget) override;
+  CFX_DIBitmap* GetErrorPicture(IFWL_Widget* pWidget) override;
+  CFX_DIBitmap* GetInitialPicture(IFWL_Widget* pWidget) override;
+  int32_t GetOpacity(IFWL_Widget* pWidget) override;
+  int32_t GetFlipMode(IFWL_Widget* pWidget) override;
+  FWL_Error GetMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) override;
 
-    // IFWL_PictureBoxDP
-    CFX_DIBitmap* GetPicture(IFWL_Widget* pWidget) override;
-    CFX_DIBitmap* GetErrorPicture(IFWL_Widget* pWidget) override;
-    CFX_DIBitmap* GetInitialPicture(IFWL_Widget* pWidget) override;
-    int32_t GetOpacity(IFWL_Widget* pWidget) override;
-    int32_t GetFlipMode(IFWL_Widget* pWidget) override;
-    FWL_Error GetMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) override;
-
-    CFX_DIBitmap* m_pBitmap;
-    int32_t m_iOpacity;
-    int32_t m_iFlipMode;
-    FX_FLOAT m_fRotation;
-    FX_FLOAT m_fScaleX;
-    FX_FLOAT m_fScaleY;
-    FX_FLOAT m_fOffSetX;
-    FX_FLOAT m_fOffSetY;
-    CFX_WideString m_wsData;
-  };
-
-  CFWL_PictureBoxDP m_PictureBoxDP;
+ private:
+  CFX_DIBitmap* m_pBitmap;
+  int32_t m_iOpacity;
+  int32_t m_iFlipMode;
+  FX_FLOAT m_fRotation;
+  FX_FLOAT m_fScaleX;
+  FX_FLOAT m_fScaleY;
+  FX_FLOAT m_fOffSetX;
+  FX_FLOAT m_fOffSetY;
+  CFX_WideString m_wsData;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_PICTUREBOX_H_
diff --git a/xfa/fwl/core/cfwl_pushbutton.cpp b/xfa/fwl/core/cfwl_pushbutton.cpp
index 1b98d25..888c127 100644
--- a/xfa/fwl/core/cfwl_pushbutton.cpp
+++ b/xfa/fwl/core/cfwl_pushbutton.cpp
@@ -10,7 +10,8 @@
 
 #include "third_party/base/ptr_util.h"
 
-CFWL_PushButton::CFWL_PushButton(const IFWL_App* app) : CFWL_Widget(app) {}
+CFWL_PushButton::CFWL_PushButton(const IFWL_App* app)
+    : CFWL_Widget(app), m_pBitmap(nullptr) {}
 
 CFWL_PushButton::~CFWL_PushButton() {}
 
@@ -18,38 +19,36 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_PushButton>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_buttonData));
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
 
   CFWL_Widget::Initialize();
 }
 
 FWL_Error CFWL_PushButton::GetCaption(CFX_WideString& wsCaption) {
-  wsCaption = m_buttonData.m_wsCaption;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PushButton::SetCaption(const CFX_WideStringC& wsCaption) {
-  m_buttonData.m_wsCaption = wsCaption;
-  return FWL_Error::Succeeded;
-}
-
-CFX_DIBitmap* CFWL_PushButton::GetPicture() {
-  return m_buttonData.m_pBitmap;
-}
-
-FWL_Error CFWL_PushButton::SetPicture(CFX_DIBitmap* pBitmap) {
-  m_buttonData.m_pBitmap = pBitmap;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PushButton::CFWL_PushButtonDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
   wsCaption = m_wsCaption;
   return FWL_Error::Succeeded;
 }
 
-CFX_DIBitmap* CFWL_PushButton::CFWL_PushButtonDP::GetPicture(
-    IFWL_Widget* pWidget) {
+FWL_Error CFWL_PushButton::SetCaption(const CFX_WideStringC& wsCaption) {
+  m_wsCaption = wsCaption;
+  return FWL_Error::Succeeded;
+}
+
+CFX_DIBitmap* CFWL_PushButton::GetPicture() {
+  return m_pBitmap;
+}
+
+FWL_Error CFWL_PushButton::SetPicture(CFX_DIBitmap* pBitmap) {
+  m_pBitmap = pBitmap;
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PushButton::GetCaption(IFWL_Widget* pWidget,
+                                      CFX_WideString& wsCaption) {
+  wsCaption = m_wsCaption;
+  return FWL_Error::Succeeded;
+}
+
+CFX_DIBitmap* CFWL_PushButton::GetPicture(IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
diff --git a/xfa/fwl/core/cfwl_pushbutton.h b/xfa/fwl/core/cfwl_pushbutton.h
index 1c4b6b4..a146efc 100644
--- a/xfa/fwl/core/cfwl_pushbutton.h
+++ b/xfa/fwl/core/cfwl_pushbutton.h
@@ -10,7 +10,7 @@
 #include "xfa/fwl/core/cfwl_widget.h"
 #include "xfa/fwl/core/ifwl_pushbutton.h"
 
-class CFWL_PushButton : public CFWL_Widget {
+class CFWL_PushButton : public CFWL_Widget, public IFWL_PushButtonDP {
  public:
   CFWL_PushButton(const IFWL_App*);
   ~CFWL_PushButton() override;
@@ -22,23 +22,16 @@
   CFX_DIBitmap* GetPicture();
   FWL_Error SetPicture(CFX_DIBitmap* pBitmap);
 
- protected:
-  class CFWL_PushButtonDP : public IFWL_PushButtonDP {
-   public:
-    CFWL_PushButtonDP() : m_pBitmap(nullptr) {}
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_PushButtonDP
+  CFX_DIBitmap* GetPicture(IFWL_Widget* pWidget) override;
 
-    // IFWL_PushButtonDP
-    CFX_DIBitmap* GetPicture(IFWL_Widget* pWidget) override;
-
-    CFX_WideString m_wsCaption;
-    CFX_DIBitmap* m_pBitmap;
-  };
-
-  CFWL_PushButtonDP m_buttonData;
+ private:
+  CFX_WideString m_wsCaption;
+  CFX_DIBitmap* m_pBitmap;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_PUSHBUTTON_H_
diff --git a/xfa/fwl/core/fwl_noteimp.cpp b/xfa/fwl/core/fwl_noteimp.cpp
index 86a1ca8..fc7523a 100644
--- a/xfa/fwl/core/fwl_noteimp.cpp
+++ b/xfa/fwl/core/fwl_noteimp.cpp
@@ -637,58 +637,6 @@
   }
 }
 
-class CFWL_CoreToolTipDP : public IFWL_ToolTipDP {
- public:
-  CFWL_CoreToolTipDP(int32_t iInitDelayTime, int32_t iAutoDelayTime);
-
-  // IFWL_ToolTipDP
-  FWL_Error GetCaption(IFWL_Widget* pWidget,
-                       CFX_WideString& wsCaption) override;
-  int32_t GetInitialDelay(IFWL_Widget* pWidget) override;
-  int32_t GetAutoPopDelay(IFWL_Widget* pWidget) override;
-  CFX_DIBitmap* GetToolTipIcon(IFWL_Widget* pWidget) override;
-  CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget) override;
-
-  CFX_RectF GetAnchor();
-
-  CFX_WideString m_wsCaption;
-  int32_t m_nInitDelayTime;
-  int32_t m_nAutoPopDelayTime;
-  CFX_RectF m_fAnchor;
-};
-
-CFWL_CoreToolTipDP::CFWL_CoreToolTipDP(int32_t iInitDelayTime,
-                                       int32_t iAutoDelayTime)
-    : m_nInitDelayTime(iInitDelayTime), m_nAutoPopDelayTime(iAutoDelayTime) {
-  m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
-}
-
-FWL_Error CFWL_CoreToolTipDP::GetCaption(IFWL_Widget* pWidget,
-                                         CFX_WideString& wsCaption) {
-  wsCaption = m_wsCaption;
-  return FWL_Error::Succeeded;
-}
-
-int32_t CFWL_CoreToolTipDP::GetInitialDelay(IFWL_Widget* pWidget) {
-  return m_nInitDelayTime;
-}
-
-int32_t CFWL_CoreToolTipDP::GetAutoPopDelay(IFWL_Widget* pWidget) {
-  return m_nAutoPopDelayTime;
-}
-
-CFX_DIBitmap* CFWL_CoreToolTipDP::GetToolTipIcon(IFWL_Widget* pWidget) {
-  return nullptr;
-}
-
-CFX_SizeF CFWL_CoreToolTipDP::GetToolTipIconSize(IFWL_Widget* pWidget) {
-  return CFX_SizeF();
-}
-
-CFX_RectF CFWL_CoreToolTipDP::GetAnchor() {
-  return m_fAnchor;
-}
-
 CFWL_EventTarget::CFWL_EventTarget(CFWL_NoteDriver* pNoteDriver,
                                    IFWL_Widget* pListener)
     : m_pListener(pListener), m_pNoteDriver(pNoteDriver), m_bInvalid(false) {}
@@ -759,10 +707,38 @@
 CFWL_ToolTipContainer* CFWL_ToolTipContainer::s_pInstance = nullptr;
 
 CFWL_ToolTipContainer::CFWL_ToolTipContainer()
-    : m_pToolTipDp(new CFWL_CoreToolTipDP(0, 2000)) {}
+    : m_nInitDelayTime(0), m_nAutoPopDelayTime(2000) {
+  m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
+}
 
 CFWL_ToolTipContainer::~CFWL_ToolTipContainer() {}
 
+FWL_Error CFWL_ToolTipContainer::GetCaption(IFWL_Widget* pWidget,
+                                            CFX_WideString& wsCaption) {
+  wsCaption = m_wsCaption;
+  return FWL_Error::Succeeded;
+}
+
+int32_t CFWL_ToolTipContainer::GetInitialDelay(IFWL_Widget* pWidget) {
+  return m_nInitDelayTime;
+}
+
+int32_t CFWL_ToolTipContainer::GetAutoPopDelay(IFWL_Widget* pWidget) {
+  return m_nAutoPopDelayTime;
+}
+
+CFX_DIBitmap* CFWL_ToolTipContainer::GetToolTipIcon(IFWL_Widget* pWidget) {
+  return nullptr;
+}
+
+CFX_SizeF CFWL_ToolTipContainer::GetToolTipIconSize(IFWL_Widget* pWidget) {
+  return CFX_SizeF();
+}
+
+CFX_RectF CFWL_ToolTipContainer::GetAnchor() {
+  return m_fAnchor;
+}
+
 // static
 CFWL_ToolTipContainer* CFWL_ToolTipContainer::getInstance() {
   if (!s_pInstance)
diff --git a/xfa/fwl/core/fwl_noteimp.h b/xfa/fwl/core/fwl_noteimp.h
index e9a738a..0b99dba 100644
--- a/xfa/fwl/core/fwl_noteimp.h
+++ b/xfa/fwl/core/fwl_noteimp.h
@@ -13,10 +13,10 @@
 #include "xfa/fwl/core/cfwl_event.h"
 #include "xfa/fwl/core/cfwl_message.h"
 #include "xfa/fwl/core/fwl_error.h"
+#include "xfa/fwl/core/ifwl_tooltip.h"
 #include "xfa/fwl/core/ifwl_widget.h"
 #include "xfa/fxgraphics/cfx_graphics.h"
 
-class CFWL_CoreToolTipDP;
 class CFWL_EventTarget;
 class CFWL_MsgActivate;
 class CFWL_MsgDeactivate;
@@ -127,19 +127,31 @@
   bool m_bInvalid;
 };
 
-class CFWL_ToolTipContainer final {
+class CFWL_ToolTipContainer final : public IFWL_ToolTipDP {
  public:
   static CFWL_ToolTipContainer* getInstance();
   static void DeleteInstance();
 
+  // IFWL_ToolTipDP
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
+  int32_t GetInitialDelay(IFWL_Widget* pWidget) override;
+  int32_t GetAutoPopDelay(IFWL_Widget* pWidget) override;
+  CFX_DIBitmap* GetToolTipIcon(IFWL_Widget* pWidget) override;
+  CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget) override;
+
  protected:
   CFWL_ToolTipContainer();
-  ~CFWL_ToolTipContainer();
+  ~CFWL_ToolTipContainer() override;
 
-  std::unique_ptr<CFWL_CoreToolTipDP> m_pToolTipDp;
+  CFX_RectF GetAnchor();
 
  private:
   static CFWL_ToolTipContainer* s_pInstance;
+  CFX_WideString m_wsCaption;
+  int32_t m_nInitDelayTime;
+  int32_t m_nAutoPopDelayTime;
+  CFX_RectF m_fAnchor;
 };
 
 #endif  // XFA_FWL_CORE_FWL_NOTEIMP_H_
diff --git a/xfa/fwl/core/ifwl_datetimepicker.cpp b/xfa/fwl/core/ifwl_datetimepicker.cpp
index 8a59b00..915449a 100644
--- a/xfa/fwl/core/ifwl_datetimepicker.cpp
+++ b/xfa/fwl/core/ifwl_datetimepicker.cpp
@@ -32,13 +32,15 @@
       m_iYear(-1),
       m_iMonth(-1),
       m_iDay(-1),
-      m_bLBtnDown(false) {
+      m_bLBtnDown(false),
+      m_iCurYear(2010),
+      m_iCurMonth(3),
+      m_iCurDay(29) {
   m_rtBtn.Set(0, 0, 0, 0);
 
   m_pProperties->m_dwStyleExes = FWL_STYLEEXT_DTP_ShortDateFormat;
 
-  auto monthProp =
-      pdfium::MakeUnique<CFWL_WidgetProperties>(&m_MonthCalendarDP);
+  auto monthProp = pdfium::MakeUnique<CFWL_WidgetProperties>(this);
   monthProp->m_dwStyles = FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border;
   monthProp->m_dwStates = FWL_WGTSTATE_Invisible;
   monthProp->m_pParent = this;
@@ -112,8 +114,7 @@
   if (m_pProperties->m_pDataProvider) {
     IFWL_DateTimePickerDP* pData =
         static_cast<IFWL_DateTimePickerDP*>(m_pProperties->m_pDataProvider);
-    pData->GetToday(this, m_MonthCalendarDP.m_iCurYear,
-                    m_MonthCalendarDP.m_iCurMonth, m_MonthCalendarDP.m_iCurDay);
+    pData->GetToday(this, m_iCurYear, m_iCurMonth, m_iCurDay);
   }
   CFX_RectF rtMonthCal;
   m_pMonthCal->GetWidgetRect(rtMonthCal, true);
@@ -464,7 +465,7 @@
   if (m_pMonthCal)
     return;
 
-  auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>(&m_MonthCalendarDP);
+  auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>(this);
   prop->m_dwStyles =
       FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border | FWL_WGTSTYLE_EdgeSunken;
   prop->m_dwStates = FWL_WGTSTATE_Invisible;
@@ -575,8 +576,7 @@
   if (m_pProperties->m_pDataProvider) {
     IFWL_DateTimePickerDP* pData =
         static_cast<IFWL_DateTimePickerDP*>(m_pProperties->m_pDataProvider);
-    pData->GetToday(this, m_MonthCalendarDP.m_iCurYear,
-                    m_MonthCalendarDP.m_iCurMonth, m_MonthCalendarDP.m_iCurDay);
+    pData->GetToday(this, m_iCurYear, m_iCurMonth, m_iCurDay);
   }
   FX_FLOAT* pWidth = static_cast<FX_FLOAT*>(
       GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
@@ -788,29 +788,19 @@
   Repaint(&rtInvalidate);
 }
 
-IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::CFWL_MonthCalendarImpDP() {
-  m_iCurYear = 2010;
-  m_iCurMonth = 3;
-  m_iCurDay = 29;
-}
-
-FWL_Error IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
+FWL_Error IFWL_DateTimePicker::GetCaption(IFWL_Widget* pWidget,
+                                          CFX_WideString& wsCaption) {
   return FWL_Error::Succeeded;
 }
 
-int32_t IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::GetCurDay(
-    IFWL_Widget* pWidget) {
+int32_t IFWL_DateTimePicker::GetCurDay(IFWL_Widget* pWidget) {
   return m_iCurDay;
 }
 
-int32_t IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::GetCurMonth(
-    IFWL_Widget* pWidget) {
+int32_t IFWL_DateTimePicker::GetCurMonth(IFWL_Widget* pWidget) {
   return m_iCurMonth;
 }
 
-int32_t IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::GetCurYear(
-    IFWL_Widget* pWidget) {
+int32_t IFWL_DateTimePicker::GetCurYear(IFWL_Widget* pWidget) {
   return m_iCurYear;
 }
diff --git a/xfa/fwl/core/ifwl_datetimepicker.h b/xfa/fwl/core/ifwl_datetimepicker.h
index 8ebe54a..5e4ca5e 100644
--- a/xfa/fwl/core/ifwl_datetimepicker.h
+++ b/xfa/fwl/core/ifwl_datetimepicker.h
@@ -60,7 +60,7 @@
                              int32_t& iDay) = 0;
 };
 
-class IFWL_DateTimePicker : public IFWL_Widget {
+class IFWL_DateTimePicker : public IFWL_Widget, public IFWL_MonthCalendarDP {
  public:
   explicit IFWL_DateTimePicker(
       const IFWL_App* app,
@@ -113,25 +113,16 @@
 
   IFWL_FormProxy* GetFormProxy() const { return m_pForm.get(); }
 
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
+
+  // IFWL_MonthCalendarDP
+  int32_t GetCurDay(IFWL_Widget* pWidget) override;
+  int32_t GetCurMonth(IFWL_Widget* pWidget) override;
+  int32_t GetCurYear(IFWL_Widget* pWidget) override;
+
  protected:
-  class CFWL_MonthCalendarImpDP : public IFWL_MonthCalendarDP {
-   public:
-    CFWL_MonthCalendarImpDP();
-
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
-
-    // IFWL_MonthCalendarDP
-    int32_t GetCurDay(IFWL_Widget* pWidget) override;
-    int32_t GetCurMonth(IFWL_Widget* pWidget) override;
-    int32_t GetCurYear(IFWL_Widget* pWidget) override;
-
-    int32_t m_iCurDay;
-    int32_t m_iCurYear;
-    int32_t m_iCurMonth;
-  };
-
   void DrawDropDownButton(CFX_Graphics* pGraphics,
                           IFWL_ThemeProvider* pTheme,
                           const CFX_Matrix* pMatrix);
@@ -153,7 +144,6 @@
   std::unique_ptr<IFWL_DateTimeCalendar> m_pMonthCal;
   std::unique_ptr<IFWL_FormProxy> m_pForm;
   FX_FLOAT m_fBtn;
-  CFWL_MonthCalendarImpDP m_MonthCalendarDP;
 
  private:
   FWL_Error DisForm_Initialize();
@@ -175,6 +165,10 @@
   void OnMouseMove(CFWL_MsgMouse* pMsg);
   void OnMouseLeave(CFWL_MsgMouse* pMsg);
   void DisForm_OnFocusChanged(CFWL_Message* pMsg, bool bSet);
+
+  int32_t m_iCurYear;
+  int32_t m_iCurMonth;
+  int32_t m_iCurDay;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_DATETIMEPICKER_H_
