diff --git a/BUILD.gn b/BUILD.gn
index 9c9d865..5426860 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -197,6 +197,10 @@
   sources = [
     "core/fpdfdoc/clines.cpp",
     "core/fpdfdoc/clines.h",
+    "core/fpdfdoc/cpdf_annot.cpp",
+    "core/fpdfdoc/cpdf_annot.h",
+    "core/fpdfdoc/cpdf_annotlist.cpp",
+    "core/fpdfdoc/cpdf_annotlist.h",
     "core/fpdfdoc/cpdf_variabletext.cpp",
     "core/fpdfdoc/cpvt_color.cpp",
     "core/fpdfdoc/cpvt_color.h",
@@ -216,7 +220,6 @@
     "core/fpdfdoc/ctypeset.cpp",
     "core/fpdfdoc/ctypeset.h",
     "core/fpdfdoc/doc_action.cpp",
-    "core/fpdfdoc/doc_annot.cpp",
     "core/fpdfdoc/doc_basic.cpp",
     "core/fpdfdoc/doc_bookmark.cpp",
     "core/fpdfdoc/doc_form.cpp",
diff --git a/core/fpdfdoc/doc_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp
similarity index 66%
rename from core/fpdfdoc/doc_annot.cpp
rename to core/fpdfdoc/cpdf_annot.cpp
index e1a9760..dcdd89c 100644
--- a/core/fpdfdoc/doc_annot.cpp
+++ b/core/fpdfdoc/cpdf_annot.cpp
@@ -1,126 +1,19 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
+#include "core/fpdfdoc/cpdf_annot.h"
+
 #include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/fpdfapi/fpdf_parser/include/cpdf_reference.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_rendercontext.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
-#include "core/fpdfdoc/cpvt_generateap.h"
-#include "core/fpdfdoc/include/fpdf_doc.h"
 #include "core/fxge/include/fx_ge.h"
 
-CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage)
-    : m_pDocument(pPage->m_pDocument) {
-  if (!pPage->m_pFormDict)
-    return;
-
-  CPDF_Array* pAnnots = pPage->m_pFormDict->GetArrayBy("Annots");
-  if (!pAnnots)
-    return;
-
-  CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
-  CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm");
-  FX_BOOL bRegenerateAP =
-      pAcroForm && pAcroForm->GetBooleanBy("NeedAppearances");
-  for (size_t i = 0; i < pAnnots->GetCount(); ++i) {
-    CPDF_Dictionary* pDict = ToDictionary(pAnnots->GetDirectObjectAt(i));
-    if (!pDict)
-      continue;
-
-    uint32_t dwObjNum = pDict->GetObjNum();
-    if (dwObjNum == 0) {
-      dwObjNum = m_pDocument->AddIndirectObject(pDict);
-      CPDF_Reference* pAction = new CPDF_Reference(m_pDocument, dwObjNum);
-      pAnnots->InsertAt(i, pAction);
-      pAnnots->RemoveAt(i + 1);
-      pDict = pAnnots->GetDictAt(i);
-    }
-    m_AnnotList.push_back(
-        std::unique_ptr<CPDF_Annot>(new CPDF_Annot(pDict, m_pDocument)));
-    if (bRegenerateAP && pDict->GetStringBy("Subtype") == "Widget" &&
-        CPDF_InterForm::IsUpdateAPEnabled()) {
-      FPDF_GenerateAP(m_pDocument, pDict);
-    }
-  }
-}
-
-CPDF_AnnotList::~CPDF_AnnotList() {}
-
-void CPDF_AnnotList::DisplayPass(CPDF_Page* pPage,
-                                 CFX_RenderDevice* pDevice,
-                                 CPDF_RenderContext* pContext,
-                                 FX_BOOL bPrinting,
-                                 CFX_Matrix* pMatrix,
-                                 FX_BOOL bWidgetPass,
-                                 CPDF_RenderOptions* pOptions,
-                                 FX_RECT* clip_rect) {
-  for (const auto& pAnnot : m_AnnotList) {
-    bool bWidget = pAnnot->GetSubType() == "Widget";
-    if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget))
-      continue;
-
-    uint32_t annot_flags = pAnnot->GetFlags();
-    if (annot_flags & ANNOTFLAG_HIDDEN)
-      continue;
-
-    if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0)
-      continue;
-
-    if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW))
-      continue;
-
-    if (pOptions) {
-      CPDF_OCContext* pOCContext = pOptions->m_pOCContext;
-      CPDF_Dictionary* pAnnotDict = pAnnot->GetAnnotDict();
-      if (pOCContext && pAnnotDict &&
-          !pOCContext->CheckOCGVisible(pAnnotDict->GetDictBy("OC"))) {
-        continue;
-      }
-    }
-    CFX_FloatRect annot_rect_f;
-    pAnnot->GetRect(annot_rect_f);
-    CFX_Matrix matrix = *pMatrix;
-    if (clip_rect) {
-      annot_rect_f.Transform(&matrix);
-      FX_RECT annot_rect = annot_rect_f.GetOutterRect();
-      annot_rect.Intersect(*clip_rect);
-      if (annot_rect.IsEmpty()) {
-        continue;
-      }
-    }
-    if (pContext) {
-      pAnnot->DrawInContext(pPage, pContext, &matrix, CPDF_Annot::Normal);
-    } else if (!pAnnot->DrawAppearance(pPage, pDevice, &matrix,
-                                       CPDF_Annot::Normal, pOptions)) {
-      pAnnot->DrawBorder(pDevice, &matrix, pOptions);
-    }
-  }
-}
-
-void CPDF_AnnotList::DisplayAnnots(CPDF_Page* pPage,
-                                   CFX_RenderDevice* pDevice,
-                                   CPDF_RenderContext* pContext,
-                                   FX_BOOL bPrinting,
-                                   CFX_Matrix* pUser2Device,
-                                   uint32_t dwAnnotFlags,
-                                   CPDF_RenderOptions* pOptions,
-                                   FX_RECT* pClipRect) {
-  if (dwAnnotFlags & 0x01) {
-    DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, FALSE,
-                pOptions, pClipRect);
-  }
-  if (dwAnnotFlags & 0x02) {
-    DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE,
-                pOptions, pClipRect);
-  }
-}
-
 CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict, CPDF_Document* pDocument)
     : m_pAnnotDict(pDict),
       m_pDocument(pDocument),
diff --git a/core/fpdfdoc/cpdf_annot.h b/core/fpdfdoc/cpdf_annot.h
new file mode 100644
index 0000000..b5d9186
--- /dev/null
+++ b/core/fpdfdoc/cpdf_annot.h
@@ -0,0 +1,70 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FPDFDOC_CPDF_ANNOT_H_
+#define CORE_FPDFDOC_CPDF_ANNOT_H_
+
+#include <map>
+#include <memory>
+
+#include "core/fxcrt/include/fx_coordinates.h"
+#include "core/fxcrt/include/fx_string.h"
+#include "core/fxcrt/include/fx_system.h"
+
+class CFX_RenderDevice;
+class CPDF_Dictionary;
+class CPDF_Document;
+class CPDF_Form;
+class CPDF_Page;
+class CPDF_RenderContext;
+class CPDF_RenderOptions;
+class CPDF_Stream;
+
+#define ANNOTFLAG_INVISIBLE 0x0001
+#define ANNOTFLAG_HIDDEN 0x0002
+#define ANNOTFLAG_PRINT 0x0004
+#define ANNOTFLAG_NOZOOM 0x0008
+#define ANNOTFLAG_NOROTATE 0x0010
+#define ANNOTFLAG_NOVIEW 0x0020
+#define ANNOTFLAG_READONLY 0x0040
+#define ANNOTFLAG_LOCKED 0x0080
+#define ANNOTFLAG_TOGGLENOVIEW 0x0100
+
+class CPDF_Annot {
+ public:
+  enum AppearanceMode { Normal, Rollover, Down };
+
+  CPDF_Annot(CPDF_Dictionary* pDict, CPDF_Document* pDocument);
+  ~CPDF_Annot();
+
+  CFX_ByteString GetSubType() const;
+  uint32_t GetFlags() const;
+  void GetRect(CFX_FloatRect& rect) const;
+  const CPDF_Dictionary* GetAnnotDict() const { return m_pAnnotDict; }
+  CPDF_Dictionary* GetAnnotDict() { return m_pAnnotDict; }
+  FX_BOOL DrawAppearance(CPDF_Page* pPage,
+                         CFX_RenderDevice* pDevice,
+                         const CFX_Matrix* pUser2Device,
+                         AppearanceMode mode,
+                         const CPDF_RenderOptions* pOptions);
+  FX_BOOL DrawInContext(const CPDF_Page* pPage,
+                        CPDF_RenderContext* pContext,
+                        const CFX_Matrix* pUser2Device,
+                        AppearanceMode mode);
+  void ClearCachedAP();
+  void DrawBorder(CFX_RenderDevice* pDevice,
+                  const CFX_Matrix* pUser2Device,
+                  const CPDF_RenderOptions* pOptions);
+  CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);
+
+ private:
+  CPDF_Dictionary* const m_pAnnotDict;
+  CPDF_Document* const m_pDocument;
+  const CFX_ByteString m_sSubtype;
+  std::map<CPDF_Stream*, CPDF_Form*> m_APMap;
+};
+
+#endif  // CORE_FPDFDOC_CPDF_ANNOT_H_
diff --git a/core/fpdfdoc/cpdf_annotlist.cpp b/core/fpdfdoc/cpdf_annotlist.cpp
new file mode 100644
index 0000000..8b8c0e9
--- /dev/null
+++ b/core/fpdfdoc/cpdf_annotlist.cpp
@@ -0,0 +1,132 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfdoc/cpdf_annotlist.h"
+
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_reference.h"
+#include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
+#include "core/fpdfdoc/cpdf_annot.h"
+#include "core/fpdfdoc/cpvt_generateap.h"
+
+CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage)
+    : m_pDocument(pPage->m_pDocument) {
+  if (!pPage->m_pFormDict)
+    return;
+
+  CPDF_Array* pAnnots = pPage->m_pFormDict->GetArrayBy("Annots");
+  if (!pAnnots)
+    return;
+
+  CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
+  CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm");
+  FX_BOOL bRegenerateAP =
+      pAcroForm && pAcroForm->GetBooleanBy("NeedAppearances");
+  for (size_t i = 0; i < pAnnots->GetCount(); ++i) {
+    CPDF_Dictionary* pDict = ToDictionary(pAnnots->GetDirectObjectAt(i));
+    if (!pDict)
+      continue;
+
+    uint32_t dwObjNum = pDict->GetObjNum();
+    if (dwObjNum == 0) {
+      dwObjNum = m_pDocument->AddIndirectObject(pDict);
+      CPDF_Reference* pAction = new CPDF_Reference(m_pDocument, dwObjNum);
+      pAnnots->InsertAt(i, pAction);
+      pAnnots->RemoveAt(i + 1);
+      pDict = pAnnots->GetDictAt(i);
+    }
+    m_AnnotList.push_back(
+        std::unique_ptr<CPDF_Annot>(new CPDF_Annot(pDict, m_pDocument)));
+    if (bRegenerateAP && pDict->GetStringBy("Subtype") == "Widget" &&
+        CPDF_InterForm::IsUpdateAPEnabled()) {
+      FPDF_GenerateAP(m_pDocument, pDict);
+    }
+  }
+}
+
+CPDF_AnnotList::~CPDF_AnnotList() {}
+
+void CPDF_AnnotList::DisplayPass(CPDF_Page* pPage,
+                                 CFX_RenderDevice* pDevice,
+                                 CPDF_RenderContext* pContext,
+                                 FX_BOOL bPrinting,
+                                 CFX_Matrix* pMatrix,
+                                 FX_BOOL bWidgetPass,
+                                 CPDF_RenderOptions* pOptions,
+                                 FX_RECT* clip_rect) {
+  for (const auto& pAnnot : m_AnnotList) {
+    bool bWidget = pAnnot->GetSubType() == "Widget";
+    if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget))
+      continue;
+
+    uint32_t annot_flags = pAnnot->GetFlags();
+    if (annot_flags & ANNOTFLAG_HIDDEN)
+      continue;
+
+    if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0)
+      continue;
+
+    if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW))
+      continue;
+
+    if (pOptions) {
+      CPDF_OCContext* pOCContext = pOptions->m_pOCContext;
+      CPDF_Dictionary* pAnnotDict = pAnnot->GetAnnotDict();
+      if (pOCContext && pAnnotDict &&
+          !pOCContext->CheckOCGVisible(pAnnotDict->GetDictBy("OC"))) {
+        continue;
+      }
+    }
+    CFX_FloatRect annot_rect_f;
+    pAnnot->GetRect(annot_rect_f);
+    CFX_Matrix matrix = *pMatrix;
+    if (clip_rect) {
+      annot_rect_f.Transform(&matrix);
+      FX_RECT annot_rect = annot_rect_f.GetOutterRect();
+      annot_rect.Intersect(*clip_rect);
+      if (annot_rect.IsEmpty()) {
+        continue;
+      }
+    }
+    if (pContext) {
+      pAnnot->DrawInContext(pPage, pContext, &matrix, CPDF_Annot::Normal);
+    } else if (!pAnnot->DrawAppearance(pPage, pDevice, &matrix,
+                                       CPDF_Annot::Normal, pOptions)) {
+      pAnnot->DrawBorder(pDevice, &matrix, pOptions);
+    }
+  }
+}
+
+void CPDF_AnnotList::DisplayAnnots(CPDF_Page* pPage,
+                                   CFX_RenderDevice* pDevice,
+                                   CPDF_RenderContext* pContext,
+                                   FX_BOOL bPrinting,
+                                   CFX_Matrix* pUser2Device,
+                                   uint32_t dwAnnotFlags,
+                                   CPDF_RenderOptions* pOptions,
+                                   FX_RECT* pClipRect) {
+  if (dwAnnotFlags & ANNOTFLAG_INVISIBLE) {
+    DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, FALSE,
+                pOptions, pClipRect);
+  }
+  if (dwAnnotFlags & ANNOTFLAG_HIDDEN) {
+    DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE,
+                pOptions, pClipRect);
+  }
+}
+
+void CPDF_AnnotList::DisplayAnnots(CPDF_Page* pPage,
+                                   CPDF_RenderContext* pContext,
+                                   FX_BOOL bPrinting,
+                                   CFX_Matrix* pMatrix,
+                                   FX_BOOL bShowWidget,
+                                   CPDF_RenderOptions* pOptions) {
+  uint32_t dwAnnotFlags = bShowWidget ? ANNOTFLAG_INVISIBLE | ANNOTFLAG_HIDDEN
+                                      : ANNOTFLAG_INVISIBLE;
+  DisplayAnnots(pPage, nullptr, pContext, bPrinting, pMatrix, dwAnnotFlags,
+                pOptions, nullptr);
+}
diff --git a/core/fpdfdoc/cpdf_annotlist.h b/core/fpdfdoc/cpdf_annotlist.h
new file mode 100644
index 0000000..afe85f3
--- /dev/null
+++ b/core/fpdfdoc/cpdf_annotlist.h
@@ -0,0 +1,64 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FPDFDOC_CPDF_ANNOTLIST_H_
+#define CORE_FPDFDOC_CPDF_ANNOTLIST_H_
+
+#include <memory>
+#include <vector>
+
+#include "core/fxcrt/include/fx_coordinates.h"
+#include "core/fxcrt/include/fx_system.h"
+
+class CFX_RenderDevice;
+class CPDF_Annot;
+class CPDF_Document;
+class CPDF_Page;
+class CPDF_RenderContext;
+class CPDF_RenderOptions;
+
+class CPDF_AnnotList {
+ public:
+  explicit CPDF_AnnotList(CPDF_Page* pPage);
+  ~CPDF_AnnotList();
+
+  void DisplayAnnots(CPDF_Page* pPage,
+                     CPDF_RenderContext* pContext,
+                     FX_BOOL bPrinting,
+                     CFX_Matrix* pMatrix,
+                     FX_BOOL bShowWidget,
+                     CPDF_RenderOptions* pOptions);
+
+  void DisplayAnnots(CPDF_Page* pPage,
+                     CFX_RenderDevice* pDevice,
+                     CPDF_RenderContext* pContext,
+                     FX_BOOL bPrinting,
+                     CFX_Matrix* pMatrix,
+                     uint32_t dwAnnotFlags,
+                     CPDF_RenderOptions* pOptions,
+                     FX_RECT* pClipRect);
+
+  size_t Count() const { return m_AnnotList.size(); }
+  CPDF_Annot* GetAt(size_t index) const { return m_AnnotList[index].get(); }
+  const std::vector<std::unique_ptr<CPDF_Annot>>& All() const {
+    return m_AnnotList;
+  }
+
+ private:
+  void DisplayPass(CPDF_Page* pPage,
+                   CFX_RenderDevice* pDevice,
+                   CPDF_RenderContext* pContext,
+                   FX_BOOL bPrinting,
+                   CFX_Matrix* pMatrix,
+                   FX_BOOL bWidget,
+                   CPDF_RenderOptions* pOptions,
+                   FX_RECT* clip_rect);
+
+  CPDF_Document* const m_pDocument;
+  std::vector<std::unique_ptr<CPDF_Annot>> m_AnnotList;
+};
+
+#endif  // CORE_FPDFDOC_CPDF_ANNOTLIST_H_
diff --git a/core/fpdfdoc/include/fpdf_doc.h b/core/fpdfdoc/include/fpdf_doc.h
index 887b0dc..edcec23 100644
--- a/core/fpdfdoc/include/fpdf_doc.h
+++ b/core/fpdfdoc/include/fpdf_doc.h
@@ -14,6 +14,8 @@
 
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
+#include "core/fpdfdoc/cpdf_annot.h"
+#include "core/fpdfdoc/cpdf_annotlist.h"
 #include "core/fxge/include/fx_dib.h"
 
 class CFDF_Document;
@@ -22,8 +24,6 @@
 class CPDF_AAction;
 class CPDF_Action;
 class CPDF_ActionFields;
-class CPDF_Annot;
-class CPDF_AnnotList;
 class CPDF_ApSettings;
 class CPDF_Bookmark;
 class CPDF_BookmarkTree;
@@ -306,93 +306,6 @@
   CPDF_Dictionary* m_pDict;
 };
 
-#define ANNOTFLAG_INVISIBLE 0x0001
-#define ANNOTFLAG_HIDDEN 0x0002
-#define ANNOTFLAG_PRINT 0x0004
-#define ANNOTFLAG_NOZOOM 0x0008
-#define ANNOTFLAG_NOROTATE 0x0010
-#define ANNOTFLAG_NOVIEW 0x0020
-#define ANNOTFLAG_READONLY 0x0040
-#define ANNOTFLAG_LOCKED 0x0080
-#define ANNOTFLAG_TOGGLENOVIEW 0x0100
-
-class CPDF_Annot {
- public:
-  enum AppearanceMode { Normal, Rollover, Down };
-
-  CPDF_Annot(CPDF_Dictionary* pDict, CPDF_Document* pDocument);
-  ~CPDF_Annot();
-
-  CFX_ByteString GetSubType() const;
-  uint32_t GetFlags() const;
-  void GetRect(CFX_FloatRect& rect) const;
-  const CPDF_Dictionary* GetAnnotDict() const { return m_pAnnotDict; }
-  CPDF_Dictionary* GetAnnotDict() { return m_pAnnotDict; }
-  FX_BOOL DrawAppearance(CPDF_Page* pPage,
-                         CFX_RenderDevice* pDevice,
-                         const CFX_Matrix* pUser2Device,
-                         AppearanceMode mode,
-                         const CPDF_RenderOptions* pOptions);
-  FX_BOOL DrawInContext(const CPDF_Page* pPage,
-                        CPDF_RenderContext* pContext,
-                        const CFX_Matrix* pUser2Device,
-                        AppearanceMode mode);
-  void ClearCachedAP();
-  void DrawBorder(CFX_RenderDevice* pDevice,
-                  const CFX_Matrix* pUser2Device,
-                  const CPDF_RenderOptions* pOptions);
-  CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);
-
- private:
-  CPDF_Dictionary* const m_pAnnotDict;
-  CPDF_Document* const m_pDocument;
-  const CFX_ByteString m_sSubtype;
-  std::map<CPDF_Stream*, CPDF_Form*> m_APMap;
-};
-
-class CPDF_AnnotList {
- public:
-  explicit CPDF_AnnotList(CPDF_Page* pPage);
-  ~CPDF_AnnotList();
-
-  void DisplayAnnots(CPDF_Page* pPage,
-                     CPDF_RenderContext* pContext,
-                     FX_BOOL bPrinting,
-                     CFX_Matrix* pMatrix,
-                     FX_BOOL bShowWidget,
-                     CPDF_RenderOptions* pOptions) {
-    DisplayAnnots(pPage, nullptr, pContext, bPrinting, pMatrix,
-                  bShowWidget ? 3 : 1, pOptions, nullptr);
-  }
-
-  void DisplayAnnots(CPDF_Page* pPage,
-                     CFX_RenderDevice* pDevice,
-                     CPDF_RenderContext* pContext,
-                     FX_BOOL bPrinting,
-                     CFX_Matrix* pMatrix,
-                     uint32_t dwAnnotFlags,
-                     CPDF_RenderOptions* pOptions,
-                     FX_RECT* pClipRect);
-  size_t Count() const { return m_AnnotList.size(); }
-  CPDF_Annot* GetAt(size_t index) const { return m_AnnotList[index].get(); }
-  const std::vector<std::unique_ptr<CPDF_Annot>>& All() const {
-    return m_AnnotList;
-  }
-
- protected:
-  void DisplayPass(CPDF_Page* pPage,
-                   CFX_RenderDevice* pDevice,
-                   CPDF_RenderContext* pContext,
-                   FX_BOOL bPrinting,
-                   CFX_Matrix* pMatrix,
-                   FX_BOOL bWidget,
-                   CPDF_RenderOptions* pOptions,
-                   FX_RECT* clip_rect);
-
-  CPDF_Document* const m_pDocument;
-  std::vector<std::unique_ptr<CPDF_Annot>> m_AnnotList;
-};
-
 #define COLORTYPE_TRANSPARENT 0
 #define COLORTYPE_GRAY 1
 #define COLORTYPE_RGB 2
diff --git a/pdfium.gyp b/pdfium.gyp
index 0faf6fd..ecef4a7 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -182,6 +182,10 @@
         'core/fpdfdoc/include/fpdf_doc.h',
         'core/fpdfdoc/include/fpdf_tagged.h',
         'core/fpdfdoc/cpdf_variabletext.cpp',
+        'core/fpdfdoc/cpdf_annot.cpp',
+        'core/fpdfdoc/cpdf_annot.h',
+        'core/fpdfdoc/cpdf_annotlist.cpp',
+        'core/fpdfdoc/cpdf_annotlist.h',
         'core/fpdfdoc/cpvt_color.cpp',
         'core/fpdfdoc/cpvt_color.h',
         'core/fpdfdoc/cpvt_dash.h',
@@ -200,7 +204,6 @@
         'core/fpdfdoc/ctypeset.cpp',
         'core/fpdfdoc/ctypeset.h',
         'core/fpdfdoc/doc_action.cpp',
-        'core/fpdfdoc/doc_annot.cpp',
         'core/fpdfdoc/doc_basic.cpp',
         'core/fpdfdoc/doc_bookmark.cpp',
         'core/fpdfdoc/doc_form.cpp',
