diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
index c07806c..cc6c9e9 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
@@ -512,7 +512,7 @@
                           int pixels,
                           int image_width,
                           int image_height,
-                          FX_BOOL bTransMask = FALSE) const;
+                          FX_BOOL bTransMask = FALSE) const override;
 
   FX_FLOAT m_WhitePoint[3];
   FX_FLOAT m_BlackPoint[3];
diff --git a/fpdfsdk/include/formfiller/FFL_ComboBox.h b/fpdfsdk/include/formfiller/FFL_ComboBox.h
index 5be7198..5bfbc12 100644
--- a/fpdfsdk/include/formfiller/FFL_ComboBox.h
+++ b/fpdfsdk/include/formfiller/FFL_ComboBox.h
@@ -25,49 +25,40 @@
                       public IPWL_Edit_Notify {
  public:
   CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);
-  virtual ~CFFL_ComboBox();
+  ~CFFL_ComboBox() override;
 
-  virtual PWL_CREATEPARAM GetCreateParam();
-  virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp,
-                                 CPDFSDK_PageView* pPageView);
+  // CFFL_FormFiller:
+  PWL_CREATEPARAM GetCreateParam() override;
+  CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp,
+                         CPDFSDK_PageView* pPageView) override;
+  FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags) override;
+  FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView) override;
+  void SaveData(CPDFSDK_PageView* pPageView) override;
+  void GetActionData(CPDFSDK_PageView* pPageView,
+                     CPDF_AAction::AActionType type,
+                     PDFSDK_FieldAction& fa) override;
+  void SetActionData(CPDFSDK_PageView* pPageView,
+                     CPDF_AAction::AActionType type,
+                     const PDFSDK_FieldAction& fa) override;
+  FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type,
+                              const PDFSDK_FieldAction& faOld,
+                              const PDFSDK_FieldAction& faNew) override;
+  void SaveState(CPDFSDK_PageView* pPageView) override;
+  void RestoreState(CPDFSDK_PageView* pPageView) override;
+  CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView,
+                           FX_BOOL bRestoreValue) override;
+  void OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag) override;
 
-  virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+  // IPWL_FocusHandler:
+  void OnSetFocus(CPWL_Wnd* pWnd) override;
+  void OnKillFocus(CPWL_Wnd* pWnd) override;
 
-  virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
-  virtual void SaveData(CPDFSDK_PageView* pPageView);
-
-  virtual void GetActionData(CPDFSDK_PageView* pPageView,
-                             CPDF_AAction::AActionType type,
-                             PDFSDK_FieldAction& fa);
-  virtual void SetActionData(CPDFSDK_PageView* pPageView,
-                             CPDF_AAction::AActionType type,
-                             const PDFSDK_FieldAction& fa);
-  virtual FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type,
-                                      const PDFSDK_FieldAction& faOld,
-                                      const PDFSDK_FieldAction& faNew);
-  virtual void SaveState(CPDFSDK_PageView* pPageView);
-  virtual void RestoreState(CPDFSDK_PageView* pPageView);
-
-  virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView,
-                                   FX_BOOL bRestoreValue);
-  virtual void OnKeyStroke(FX_BOOL bKeyDown, FX_UINT nFlag);
-
- public:
-  virtual void OnSetFocus(CPWL_Wnd* pWnd);
-  virtual void OnKillFocus(CPWL_Wnd* pWnd);
-
- public:
-  virtual void OnAddUndo(CPWL_Edit* pEdit);
-
- public:
-  virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
-  virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
-  virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
+  // IPWL_Edit_Notify:
+  void OnAddUndo(CPWL_Edit* pEdit) override;
 
  private:
   CFX_WideString GetSelectExportText();
 
- private:
   CBA_FontMap* m_pFontMap;
   FFL_ComboBoxState m_State;
 };
diff --git a/fpdfsdk/include/formfiller/FFL_FormFiller.h b/fpdfsdk/include/formfiller/FFL_FormFiller.h
index 64c8136..87fb7ac 100644
--- a/fpdfsdk/include/formfiller/FFL_FormFiller.h
+++ b/fpdfsdk/include/formfiller/FFL_FormFiller.h
@@ -10,18 +10,16 @@
 #include "FFL_IFormFiller.h"
 #include "FFL_CBA_Fontmap.h"
 
-class CPDFSDK_Annot;
-class CFFL_FormFiller;
-class CFFL_Notify;
 class CPDFDoc_Environment;
-class CPDFSDK_PageView;
+class CPDFSDK_Annot;
 class CPDFSDK_Document;
+class CPDFSDK_PageView;
 class CPDFSDK_Widget;
 
 class CFFL_FormFiller : public IPWL_Provider, public CPWL_TimerHandler {
  public:
   CFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
-  virtual ~CFFL_FormFiller();
+  ~CFFL_FormFiller() override;
 
   virtual FX_RECT GetViewBBox(CPDFSDK_PageView* pPageView,
                               CPDFSDK_Annot* pAnnot);
@@ -78,23 +76,16 @@
                             FX_UINT nFlags);
   virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
 
-  virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
-  virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
-
-  virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
-  virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
-  virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
-
-  virtual void DoCopy(CPDFSDK_Document* pDocument);
-  virtual void DoCut(CPDFSDK_Document* pDocument);
-  virtual void DoPaste(CPDFSDK_Document* pDocument);
+  FX_BOOL SetFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+  FX_BOOL KillFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
 
   // CPWL_TimerHandler
-  virtual void TimerProc();
-  virtual IFX_SystemHandler* GetSystemHandler() const;
+  void TimerProc() override;
+  IFX_SystemHandler* GetSystemHandler() const override;
 
-  virtual CPDF_Matrix GetWindowMatrix(void* pAttachedData);
-  virtual CFX_WideString LoadPopupMenuString(int nIndex);
+  // IPWL_Provider
+  CPDF_Matrix GetWindowMatrix(void* pAttachedData) override;
+  CFX_WideString LoadPopupMenuString(int nIndex) override;
 
   virtual void GetActionData(CPDFSDK_PageView* pPageView,
                              CPDF_AAction::AActionType type,
@@ -112,7 +103,7 @@
   virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView,
                                    FX_BOOL bRestoreValue);
 
-  virtual void OnKeyStroke(FX_BOOL bKeyDown);
+  virtual void OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag);
 
   CPDF_Matrix GetCurMatrix();
 
diff --git a/fpdfsdk/include/formfiller/FFL_IFormFiller.h b/fpdfsdk/include/formfiller/FFL_IFormFiller.h
index 3acdb23..8421774 100644
--- a/fpdfsdk/include/formfiller/FFL_IFormFiller.h
+++ b/fpdfsdk/include/formfiller/FFL_IFormFiller.h
@@ -16,8 +16,8 @@
 
 class CFFL_IFormFiller : public IPWL_Filler_Notify {
  public:
-  CFFL_IFormFiller(CPDFDoc_Environment* pApp);
-  virtual ~CFFL_IFormFiller();
+  explicit CFFL_IFormFiller(CPDFDoc_Environment* pApp);
+  ~CFFL_IFormFiller() override;
 
   virtual FX_BOOL Annot_HitTest(CPDFSDK_PageView* pPageView,
                                 CPDFSDK_Annot* pAnnot,
@@ -25,10 +25,10 @@
   virtual FX_RECT GetViewBBox(CPDFSDK_PageView* pPageView,
                               CPDFSDK_Annot* pAnnot);
   virtual void OnDraw(CPDFSDK_PageView* pPageView,
-                      /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+                      CPDFSDK_Annot* pAnnot,
                       CFX_RenderDevice* pDevice,
                       CPDF_Matrix* pUser2Device,
-                      /*const CRect& rcWindow,*/ FX_DWORD dwFlags);
+                      FX_DWORD dwFlags);
 
   virtual void OnCreate(CPDFSDK_Annot* pAnnot);
   virtual void OnLoad(CPDFSDK_Annot* pAnnot);
@@ -79,27 +79,6 @@
   virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
   virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
 
-  virtual void QueryWherePopup(void* pPrivateData,
-                               FX_FLOAT fPopupMin,
-                               FX_FLOAT fPopupMax,
-                               int32_t& nRet,
-                               FX_FLOAT& fPopupRet);
-  virtual void OnBeforeKeyStroke(FX_BOOL bEditOrList,
-                                 void* pPrivateData,
-                                 int32_t nKeyCode,
-                                 CFX_WideString& strChange,
-                                 const CFX_WideString& strChangeEx,
-                                 int nSelStart,
-                                 int nSelEnd,
-                                 FX_BOOL bKeyDown,
-                                 FX_BOOL& bRC,
-                                 FX_BOOL& bExit,
-                                 FX_DWORD nFlag);
-  virtual void OnAfterKeyStroke(FX_BOOL bEditOrList,
-                                void* pPrivateData,
-                                FX_BOOL& bExit,
-                                FX_DWORD nFlag);
-
   CFFL_FormFiller* GetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister);
   void RemoveFormFiller(CPDFSDK_Annot* pAnnot);
 
@@ -137,6 +116,28 @@
  private:
   using CFFL_Widget2Filler = std::map<CPDFSDK_Annot*, CFFL_FormFiller*>;
 
+  // IPWL_Filler_Notify:
+  void QueryWherePopup(void* pPrivateData,
+                       FX_FLOAT fPopupMin,
+                       FX_FLOAT fPopupMax,
+                       int32_t& nRet,
+                       FX_FLOAT& fPopupRet) override;
+  void OnBeforeKeyStroke(FX_BOOL bEditOrList,
+                         void* pPrivateData,
+                         int32_t nKeyCode,
+                         CFX_WideString& strChange,
+                         const CFX_WideString& strChangeEx,
+                         int nSelStart,
+                         int nSelEnd,
+                         FX_BOOL bKeyDown,
+                         FX_BOOL& bRC,
+                         FX_BOOL& bExit,
+                         FX_DWORD nFlag) override;
+  void OnAfterKeyStroke(FX_BOOL bEditOrList,
+                        void* pPrivateData,
+                        FX_BOOL& bExit,
+                        FX_DWORD nFlag) override;
+
   void UnRegisterFormFiller(CPDFSDK_Annot* pAnnot);
 
   CPDFDoc_Environment* m_pApp;
diff --git a/fpdfsdk/include/formfiller/FFL_TextField.h b/fpdfsdk/include/formfiller/FFL_TextField.h
index 65da925..057825a 100644
--- a/fpdfsdk/include/formfiller/FFL_TextField.h
+++ b/fpdfsdk/include/formfiller/FFL_TextField.h
@@ -26,43 +26,35 @@
                        public IPWL_Edit_Notify {
  public:
   CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
-  virtual ~CFFL_TextField();
+  ~CFFL_TextField() override;
 
-  virtual PWL_CREATEPARAM GetCreateParam();
-  virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp,
-                                 CPDFSDK_PageView* pPageView);
+  // CFFL_FormFiller:
+  PWL_CREATEPARAM GetCreateParam() override;
+  CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp,
+                         CPDFSDK_PageView* pPageView) override;
+  FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags) override;
+  FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView) override;
+  void SaveData(CPDFSDK_PageView* pPageView) override;
+  void GetActionData(CPDFSDK_PageView* pPageView,
+                     CPDF_AAction::AActionType type,
+                     PDFSDK_FieldAction& fa) override;
+  void SetActionData(CPDFSDK_PageView* pPageView,
+                     CPDF_AAction::AActionType type,
+                     const PDFSDK_FieldAction& fa) override;
+  FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type,
+                              const PDFSDK_FieldAction& faOld,
+                              const PDFSDK_FieldAction& faNew) override;
+  void SaveState(CPDFSDK_PageView* pPageView) override;
+  void RestoreState(CPDFSDK_PageView* pPageView) override;
+  CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView,
+                           FX_BOOL bRestoreValue) override;
 
-  virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+  // IPWL_FocusHandler:
+  void OnSetFocus(CPWL_Wnd* pWnd) override;
+  void OnKillFocus(CPWL_Wnd* pWnd) override;
 
-  virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
-  virtual void SaveData(CPDFSDK_PageView* pPageView);
-
-  virtual void GetActionData(CPDFSDK_PageView* pPageView,
-                             CPDF_AAction::AActionType type,
-                             PDFSDK_FieldAction& fa);
-  virtual void SetActionData(CPDFSDK_PageView* pPageView,
-                             CPDF_AAction::AActionType type,
-                             const PDFSDK_FieldAction& fa);
-  virtual FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type,
-                                      const PDFSDK_FieldAction& faOld,
-                                      const PDFSDK_FieldAction& faNew);
-  virtual void SaveState(CPDFSDK_PageView* pPageView);
-  virtual void RestoreState(CPDFSDK_PageView* pPageView);
-
-  virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView,
-                                   FX_BOOL bRestoreValue);
-
- public:
-  virtual void OnSetFocus(CPWL_Wnd* pWnd);
-  virtual void OnKillFocus(CPWL_Wnd* pWnd);
-
- public:
-  virtual void OnAddUndo(CPWL_Edit* pEdit);
-
- public:
-  virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
-  virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
-  virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
+  // IPWL_Edit_Notify:
+  void OnAddUndo(CPWL_Edit* pEdit) override;
 
  private:
   CBA_FontMap* m_pFontMap;
diff --git a/fpdfsdk/include/fsdk_baseform.h b/fpdfsdk/include/fsdk_baseform.h
index 7b69e5d..bb3e7cd 100644
--- a/fpdfsdk/include/fsdk_baseform.h
+++ b/fpdfsdk/include/fsdk_baseform.h
@@ -231,18 +231,19 @@
   CFX_WideString GetTemporaryFileName(const CFX_WideString& sFileExt);
 
  private:
-  virtual int BeforeValueChange(const CPDF_FormField* pField,
-                                CFX_WideString& csValue);
-  virtual int AfterValueChange(const CPDF_FormField* pField);
-  virtual int BeforeSelectionChange(const CPDF_FormField* pField,
-                                    CFX_WideString& csValue);
-  virtual int AfterSelectionChange(const CPDF_FormField* pField);
-  virtual int AfterCheckedStatusChange(const CPDF_FormField* pField,
-                                       const CFX_ByteArray& statusArray);
-  virtual int BeforeFormReset(const CPDF_InterForm* pForm);
-  virtual int AfterFormReset(const CPDF_InterForm* pForm);
-  virtual int BeforeFormImportData(const CPDF_InterForm* pForm);
-  virtual int AfterFormImportData(const CPDF_InterForm* pForm);
+  // CPDF_FormNotify
+  int BeforeValueChange(const CPDF_FormField* pField,
+                        CFX_WideString& csValue) override;
+  int AfterValueChange(const CPDF_FormField* pField) override;
+  int BeforeSelectionChange(const CPDF_FormField* pField,
+                            CFX_WideString& csValue) override;
+  int AfterSelectionChange(const CPDF_FormField* pField) override;
+  int AfterCheckedStatusChange(const CPDF_FormField* pField,
+                               const CFX_ByteArray& statusArray) override;
+  int BeforeFormReset(const CPDF_InterForm* pForm) override;
+  int AfterFormReset(const CPDF_InterForm* pForm) override;
+  int BeforeFormImportData(const CPDF_InterForm* pForm) override;
+  int AfterFormImportData(const CPDF_InterForm* pForm) override;
 
   FX_BOOL FDFToURLEncodedData(CFX_WideString csFDFFile,
                               CFX_WideString csTxtFile);
diff --git a/fpdfsdk/src/formfiller/FFL_ComboBox.cpp b/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
index b49726d..2935221 100644
--- a/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
+++ b/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
@@ -300,24 +300,6 @@
   ASSERT(m_pApp != NULL);
 }
 
-FX_BOOL CFFL_ComboBox::CanCopy(CPDFSDK_Document* pDocument) {
-  ASSERT(pDocument != NULL);
-
-  return FALSE;
-}
-
-FX_BOOL CFFL_ComboBox::CanCut(CPDFSDK_Document* pDocument) {
-  ASSERT(pDocument != NULL);
-
-  return FALSE;
-}
-
-FX_BOOL CFFL_ComboBox::CanPaste(CPDFSDK_Document* pDocument) {
-  ASSERT(pDocument != NULL);
-
-  return FALSE;
-}
-
 void CFFL_ComboBox::OnAddUndo(CPWL_Edit* pEdit) {
   ASSERT(pEdit != NULL);
 }
diff --git a/fpdfsdk/src/formfiller/FFL_FormFiller.cpp b/fpdfsdk/src/formfiller/FFL_FormFiller.cpp
index 4fb7542..80e1b0e 100644
--- a/fpdfsdk/src/formfiller/FFL_FormFiller.cpp
+++ b/fpdfsdk/src/formfiller/FFL_FormFiller.cpp
@@ -242,7 +242,8 @@
   return FALSE;
 }
 
-FX_BOOL CFFL_FormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
+FX_BOOL CFFL_FormFiller::SetFocusForAnnot(CPDFSDK_Annot* pAnnot,
+                                          FX_UINT nFlag) {
   CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
   CPDF_Page* pPage = pWidget->GetPDFPage();
   CPDFSDK_Document* pDoc = m_pApp->GetSDKDocument();
@@ -256,7 +257,8 @@
   return TRUE;
 }
 
-FX_BOOL CFFL_FormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
+FX_BOOL CFFL_FormFiller::KillFocusForAnnot(CPDFSDK_Annot* pAnnot,
+                                           FX_UINT nFlag) {
   if (!IsValid())
     return TRUE;
 
@@ -597,7 +599,7 @@
   return m_pApp->GetSysHandler();
 }
 
-void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown) {}
+void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag) {}
 
 void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView,
                                    FX_BOOL bDestroyPDFWindow) {
@@ -610,24 +612,6 @@
     DestroyPDFWindow(pPageView);
 }
 
-FX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument) {
-  return FALSE;
-}
-
-FX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument) {
-  return FALSE;
-}
-
-FX_BOOL CFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument) {
-  return FALSE;
-}
-
-void CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument) {}
-
-void CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument) {}
-
-void CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument) {}
-
 void CFFL_FormFiller::InvalidateRect(double left,
                                      double top,
                                      double right,
diff --git a/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp b/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
index ad57347..f8f8c6a 100644
--- a/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
+++ b/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
@@ -459,7 +459,7 @@
   }
 
   if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
-    return pFormFiller->OnSetFocus(pAnnot, nFlag);
+    return pFormFiller->SetFocusForAnnot(pAnnot, nFlag);
 
   return TRUE;
 }
@@ -470,28 +470,28 @@
   ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
   if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) {
-    if (pFormFiller->OnKillFocus(pAnnot, nFlag)) {
-      if (!m_bNotifying) {
-        CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
-        if (pWidget->GetAAction(CPDF_AAction::LoseFocus)) {
-          m_bNotifying = TRUE;
-          pWidget->ClearAppModified();
-
-          CPDFSDK_PageView* pPageView = pWidget->GetPageView();
-          ASSERT(pPageView != NULL);
-
-          PDFSDK_FieldAction fa;
-          fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
-          fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
-
-          pFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa);
-
-          pWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView);
-          m_bNotifying = FALSE;
-        }
-      }
-    } else
+    if (!pFormFiller->KillFocusForAnnot(pAnnot, nFlag))
       return FALSE;
+
+    if (!m_bNotifying) {
+      CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+      if (pWidget->GetAAction(CPDF_AAction::LoseFocus)) {
+        m_bNotifying = TRUE;
+        pWidget->ClearAppModified();
+
+        CPDFSDK_PageView* pPageView = pWidget->GetPageView();
+        ASSERT(pPageView != NULL);
+
+        PDFSDK_FieldAction fa;
+        fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+        fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+
+        pFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa);
+
+        pWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView);
+        m_bNotifying = FALSE;
+      }
+    }
   }
 
   return TRUE;
@@ -898,13 +898,11 @@
                                         void* pPrivateData,
                                         FX_BOOL& bExit,
                                         FX_DWORD nFlag) {
-  ASSERT(pPrivateData != NULL);
   CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
-  ASSERT(pData->pWidget != NULL);
+  ASSERT(pData->pWidget);
 
   CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
-  ASSERT(pFormFiller != NULL);
 
   if (!bEditOrList)
-    pFormFiller->OnKeyStroke(bExit);
+    pFormFiller->OnKeyStroke(bExit, nFlag);
 }
diff --git a/fpdfsdk/src/formfiller/FFL_TextField.cpp b/fpdfsdk/src/formfiller/FFL_TextField.cpp
index 2acf6b8..b95ac93 100644
--- a/fpdfsdk/src/formfiller/FFL_TextField.cpp
+++ b/fpdfsdk/src/formfiller/FFL_TextField.cpp
@@ -287,22 +287,9 @@
                                      nCharacters, TRUE);
 
     pEdit->SetEditNotify(this);
-    // pUndo->BeginEdit(pDocument);
   }
 }
 
 void CFFL_TextField::OnKillFocus(CPWL_Wnd* pWnd) {}
 
-FX_BOOL CFFL_TextField::CanCopy(CPDFSDK_Document* pDocument) {
-  return FALSE;
-}
-
-FX_BOOL CFFL_TextField::CanCut(CPDFSDK_Document* pDocument) {
-  return FALSE;
-}
-
-FX_BOOL CFFL_TextField::CanPaste(CPDFSDK_Document* pDocument) {
-  return FALSE;
-}
-
 void CFFL_TextField::OnAddUndo(CPWL_Edit* pEdit) {}
