diff --git a/core/include/fpdfdoc/fpdf_doc.h b/core/include/fpdfdoc/fpdf_doc.h
index 715b79e..45cdebc 100644
--- a/core/include/fpdfdoc/fpdf_doc.h
+++ b/core/include/fpdfdoc/fpdf_doc.h
@@ -1,7 +1,7 @@
 // Copyright 2014 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_INCLUDE_FPDFDOC_FPDF_DOC_H_
@@ -10,37 +10,37 @@
 #include "../fpdfapi/fpdf_parser.h"
 #include "../fpdfapi/fpdf_render.h"
 
+class CFieldTree;
+class CPDF_AAction;
 class CPDF_Action;
+class CPDF_ActionFields;
 class CPDF_Annot;
 class CPDF_AnnotList;
+class CPDF_ApSettings;
 class CPDF_Bookmark;
 class CPDF_BookmarkTree;
-class CPDF_Dest;
-class CPDF_Link;
-class CPDF_LinkList;
-class CPDF_Metadata;
-class CPDF_NameTree;
-class CPDF_NumberTree;
-class CPDF_TextObject;
-class CPDF_ViewerPreferences;
-class CPDF_Page;
-class CPDF_RenderOptions;
-class CXML_Element;
-class CPDF_OCContext;
-class CPDF_DocJSActions;
-class CPDF_ActionFields;
-class CPDF_AAction;
-class CPDF_FileSpec;
-class CPDF_IconFit;
 class CPDF_DefaultAppearance;
-class CPDF_InterForm;
+class CPDF_Dest;
+class CPDF_DocJSActions;
+class CPDF_FileSpec;
+class CPDF_FormControl;
 class CPDF_FormField;
 class CPDF_FormNotify;
-class CPDF_FormControl;
+class CPDF_IconFit;
+class CPDF_InterForm;
+class CPDF_Link;
+class CPDF_LinkList;
 class CPDF_LWinParam;
-class CFieldTree;
-class CPDF_ApSettings;
-class CPDF_NameTree 
+class CPDF_Metadata;
+class CPDF_NumberTree;
+class CPDF_OCContext;
+class CPDF_Page;
+class CPDF_RenderOptions;
+class CPDF_TextObject;
+class CPDF_ViewerPreferences;
+class CXML_Element;
+
+class CPDF_NameTree
 {
 public:
 
@@ -71,7 +71,7 @@
 
     CPDF_Dictionary*		m_pRoot;
 };
-class CPDF_BookmarkTree 
+class CPDF_BookmarkTree
 {
 public:
     CPDF_BookmarkTree(CPDF_Document* pDoc) : m_pDocument(pDoc) {}
@@ -87,7 +87,7 @@
 };
 #define PDFBOOKMARK_ITALIC			1
 #define PDFBOOKMARK_BOLD			2
-class CPDF_Bookmark 
+class CPDF_Bookmark
 {
 public:
 
@@ -119,7 +119,7 @@
 #define PDFZOOM_FITBBOX				6
 #define PDFZOOM_FITBHORZ			7
 #define PDFZOOM_FITBVERT			8
-class CPDF_Dest 
+class CPDF_Dest
 {
 public:
     CPDF_Dest() : m_pObj(nullptr) { }
@@ -183,7 +183,7 @@
 
     CFX_MapPtrTemplate<const CPDF_Dictionary*, void*>	m_OCGStates;
 };
-class CPDF_LWinParam 
+class CPDF_LWinParam
 {
 public:
 
@@ -222,7 +222,7 @@
 
     CPDF_Dictionary*		m_pDict;
 };
-class CPDF_ActionFields 
+class CPDF_ActionFields
 {
 public:
 
@@ -250,7 +250,7 @@
 #define PDFNAMED_FIRSTPAGE		3
 #define PDFNAMED_LASTPAGE		4
 #define PDFJS_MAXLENGTH			64
-class CPDF_Action 
+class CPDF_Action
 {
 public:
     enum ActionType {
@@ -289,92 +289,50 @@
 
     ActionType			GetType() const;
 
-
-
     CPDF_Dest			GetDest(CPDF_Document* pDoc) const;
 
-
-
-
-
     CFX_WideString		GetFilePath() const;
 
-
-
-
     FX_BOOL				GetNewWindow() const
     {
         return m_pDict->GetBoolean("NewWindow");
     }
 
-
-
-
     CPDF_LWinParam		GetWinParam() const;
 
-
-
-
     CFX_ByteString		GetURI(CPDF_Document* pDoc) const;
 
-
-
-
     FX_BOOL				GetMouseMap() const
     {
         return m_pDict->GetBoolean("IsMap");
     }
 
-
-
-
     CPDF_ActionFields	GetWidgets() const
     {
         return this;
     }
 
-
-
-
     FX_BOOL				GetHideStatus() const
     {
         return m_pDict->GetBoolean("H", TRUE);
     }
 
-
-
-
     CFX_ByteString		GetNamedAction() const
     {
         return m_pDict->GetString("N");
     }
 
-
-
-
     FX_DWORD			GetFlags() const
     {
         return m_pDict->GetInteger("Flags");
     }
 
-
-
-
     CFX_WideString		GetJavaScript() const;
 
-
-
-
     CPDF_Dictionary*	GetAnnot() const;
 
-
-
-
     FX_INT32			GetOperationType() const;
 
-
-
-
     CPDF_Stream*		GetSoundStream() const
     {
         return m_pDict->GetStream("Sound");
@@ -400,9 +358,6 @@
         return m_pDict->GetBoolean("Mix");
     }
 
-
-
-
     FX_DWORD			GetSubActionsCount() const;
 
     CPDF_Action			GetSubAction(FX_DWORD iIndex) const;
@@ -410,7 +365,7 @@
 protected:
     CPDF_Dictionary*	m_pDict;
 };
-class CPDF_AAction 
+class CPDF_AAction
 {
 public:
 
@@ -458,7 +413,7 @@
 
     CPDF_Dictionary*	m_pDict;
 };
-class CPDF_DocJSActions 
+class CPDF_DocJSActions
 {
 public:
     CPDF_DocJSActions(CPDF_Document* pDoc);
@@ -482,7 +437,7 @@
 
     CPDF_Document*		m_pDocument;
 };
-class CPDF_FileSpec 
+class CPDF_FileSpec
 {
 public:
 
@@ -509,7 +464,7 @@
 
     CPDF_Object		*m_pObj;
 };
-class CPDF_LinkList 
+class CPDF_LinkList
 {
 public:
 
@@ -540,7 +495,7 @@
 
     void				LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList);
 };
-class CPDF_Link 
+class CPDF_Link
 {
 public:
     CPDF_Link() : m_pDict(nullptr) { }
@@ -555,73 +510,65 @@
 protected:
     CPDF_Dictionary*	m_pDict;
 };
-#define ANNOTFLAG_INVISIBLE			1
-#define ANNOTFLAG_HIDDEN			2
-#define ANNOTFLAG_PRINT				4
-#define ANNOTFLAG_NOZOOM			8
-#define ANNOTFLAG_NOROTATE			0x10
-#define ANNOTFLAG_NOVIEW			0x20
-#define ANNOTFLAG_READONLY			0x40
-#define ANNOTFLAG_LOCKED			0x80
-#define ANNOTFLAG_TOGGLENOVIEW		0x100
+
+#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 CFX_PrivateData
 {
-public:
-
-    CPDF_Annot(CPDF_Dictionary* pDict);
-
-    ~CPDF_Annot();
-
-    CPDF_Dictionary*	m_pAnnotDict;
-
-    CFX_ByteString		GetSubType() const;
-
-    FX_DWORD			GetFlags() const
-    {
-        return m_pAnnotDict->GetInteger("F");
-    }
-
-    void				GetRect(CFX_FloatRect& rect) const;
-
-    enum AppearanceMode	{
+  public:
+    enum AppearanceMode {
         Normal,
         Rollover,
         Down
     };
 
-    FX_BOOL				DrawAppearance(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,
-                                       AppearanceMode mode, const CPDF_RenderOptions* pOptions);
+    CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList);
+    ~CPDF_Annot();
 
-    FX_BOOL				DrawInContext(const CPDF_Page* pPage, const CPDF_RenderContext* pContext,
-                                      const CFX_AffineMatrix* pUser2Device, AppearanceMode mode);
+    CFX_ByteString GetSubType() const;
 
-    void				ClearCachedAP();
+    FX_DWORD GetFlags() const;
 
+    void GetRect(CFX_FloatRect& rect) const;
 
-    void				DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,
-                                   const CPDF_RenderOptions* pOptions);
+    CPDF_Dictionary* GetAnnotDict();
 
-    CPDF_PageObject*	GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions);
+    FX_BOOL DrawAppearance(const CPDF_Page* pPage,
+                           CFX_RenderDevice* pDevice,
+                           const CFX_AffineMatrix* pUser2Device,
+                           AppearanceMode mode,
+                           const CPDF_RenderOptions* pOptions);
 
+    FX_BOOL DrawInContext(const CPDF_Page* pPage,
+                          const CPDF_RenderContext* pContext,
+                          const CFX_AffineMatrix* pUser2Device,
+                          AppearanceMode mode);
 
+    void ClearCachedAP();
 
-    int					CountIRTNotes();
+    void DrawBorder(CFX_RenderDevice* pDevice,
+                    const CFX_AffineMatrix* pUser2Device,
+                    const CPDF_RenderOptions* pOptions);
 
-    CPDF_Annot*			GetIRTNote(int index);
+    CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);
 
+  private:
+    CPDF_Dictionary* const m_pAnnotDict;
 
-    CPDF_Form*			GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);
-private:
+    CPDF_AnnotList* const m_pList;
 
-    CFX_MapPtrToPtr		m_APMap;
-protected:
-    friend class		CPDF_AnnotList;
-
-    CPDF_AnnotList*		m_pList;
-
-    CPDF_Reference*		NewAnnotRef();
+    CFX_MapPtrToPtr m_APMap;
 };
-class CPDF_AnnotList 
+
+class CPDF_AnnotList
 {
 public:
 
@@ -693,7 +640,7 @@
 #define COLORTYPE_GRAY			1
 #define COLORTYPE_RGB			2
 #define COLORTYPE_CMYK			3
-class CPDF_DefaultAppearance 
+class CPDF_DefaultAppearance
 {
 public:
 
@@ -1023,7 +970,7 @@
 #define FORMTEXT_COMB			0x800
 #define FORMCOMBO_EDIT			0x100
 #define FORMLIST_MULTISELECT	0x100
-class CPDF_FormField 
+class CPDF_FormField
 {
 public:
 
@@ -1245,7 +1192,7 @@
     CPDF_Font*				m_pFont;
 };
 CPDF_Object*	FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel = 0);
-class CPDF_IconFit 
+class CPDF_IconFit
 {
 public:
 
@@ -1297,7 +1244,7 @@
 #define TEXTPOS_RIGHT		4
 #define TEXTPOS_LEFT		5
 #define TEXTPOS_OVERLAID	6
-class CPDF_FormControl 
+class CPDF_FormControl
 {
 public:
 
@@ -1505,7 +1452,7 @@
     friend class			CPDF_InterForm;
     friend class			CPDF_FormField;
 };
-class CPDF_FormNotify 
+class CPDF_FormNotify
 {
 public:
 
@@ -1557,7 +1504,7 @@
     }
 };
 FX_BOOL		FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
-class CPDF_PageLabel 
+class CPDF_PageLabel
 {
 public:
 
@@ -1621,7 +1568,7 @@
 protected:
     CPDF_Document*	m_pDoc;
 };
-class CPDF_ApSettings 
+class CPDF_ApSettings
 {
 public:
 
diff --git a/core/src/fpdfdoc/doc_annot.cpp b/core/src/fpdfdoc/doc_annot.cpp
index 0ddcb23..db1e8c4 100644
--- a/core/src/fpdfdoc/doc_annot.cpp
+++ b/core/src/fpdfdoc/doc_annot.cpp
@@ -23,7 +23,7 @@
     CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
     CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
     FX_BOOL bRegenerateAP = pAcroForm && pAcroForm->GetBoolean("NeedAppearances");
-    for (FX_DWORD i = 0; i < pAnnots->GetCount(); i ++) {
+    for (FX_DWORD i = 0; i < pAnnots->GetCount(); ++i) {
         CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);
         if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) {
             continue;
@@ -39,8 +39,7 @@
             pAnnots->RemoveAt(i + 1);
             pDict = pAnnots->GetDict(i);
         }
-        CPDF_Annot* pAnnot = new CPDF_Annot(pDict);
-        pAnnot->m_pList = this;
+        CPDF_Annot* pAnnot = new CPDF_Annot(pDict, this);
         m_AnnotList.Add(pAnnot);
         if (bRegenerateAP && pDict->GetConstString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget"))
             if (CPDF_InterForm::UpdatingAPEnabled()) {
@@ -51,7 +50,7 @@
 CPDF_AnnotList::~CPDF_AnnotList()
 {
     int i = 0;
-    for (i = 0; i < m_AnnotList.GetSize(); i ++) {
+    for (i = 0; i < m_AnnotList.GetSize(); ++i) {
         delete (CPDF_Annot*)m_AnnotList[i];
     }
     for (i = 0; i < m_Borders.GetSize(); ++i) {
@@ -62,7 +61,7 @@
                                  CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix,
                                  FX_BOOL bWidgetPass, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect)
 {
-    for (int i = 0; i < m_AnnotList.GetSize(); i ++) {
+    for (int i = 0; i < m_AnnotList.GetSize(); ++i) {
         CPDF_Annot* pAnnot = (CPDF_Annot*)m_AnnotList[i];
         FX_BOOL bWidget = pAnnot->GetSubType() == "Widget";
         if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget)) {
@@ -80,7 +79,7 @@
         }
         if (pOptions != NULL) {
             IPDF_OCContext* pOCContext = pOptions->m_pOCContext;
-            CPDF_Dictionary* pAnnotDict = pAnnot->m_pAnnotDict;
+            CPDF_Dictionary* pAnnotDict = pAnnot->GetAnnotDict();
             if (pOCContext != NULL && pAnnotDict != NULL &&
                     !pOCContext->CheckOCGVisible(pAnnotDict->GetDict(FX_BSTRC("OC")))) {
                 continue;
@@ -129,28 +128,21 @@
 }
 int CPDF_AnnotList::GetIndex(CPDF_Annot* pAnnot)
 {
-    for (int i = 0; i < m_AnnotList.GetSize(); i ++)
+    for (int i = 0; i < m_AnnotList.GetSize(); ++i)
         if (m_AnnotList[i] == (FX_LPVOID)pAnnot) {
             return i;
         }
     return -1;
 }
-CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict)
+CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList)
+  : m_pAnnotDict(pDict),
+    m_pList(pList)
 {
-    m_pList = NULL;
-    m_pAnnotDict = pDict;
 }
 CPDF_Annot::~CPDF_Annot()
 {
     ClearCachedAP();
 }
-CPDF_Reference* CPDF_Annot::NewAnnotRef()
-{
-    if (m_pAnnotDict->GetObjNum() == 0) {
-        m_pList->m_pDocument->AddIndirectObject(m_pAnnotDict);
-    }
-    return CPDF_Reference::Create(m_pList->m_pDocument, m_pAnnotDict->GetObjNum());
-}
 void CPDF_Annot::ClearCachedAP()
 {
     FX_POSITION pos = m_APMap.GetStartPosition();
@@ -166,6 +158,7 @@
 {
     return m_pAnnotDict ? m_pAnnotDict->GetConstString(FX_BSTRC("Subtype")) : CFX_ByteStringC();
 }
+
 void CPDF_Annot::GetRect(CPDF_Rect& rect) const
 {
     if (m_pAnnotDict == NULL) {
@@ -174,6 +167,17 @@
     rect = m_pAnnotDict->GetRect("Rect");
     rect.Normalize();
 }
+
+FX_DWORD CPDF_Annot::GetFlags() const
+{
+    return m_pAnnotDict->GetInteger("F");
+}
+
+CPDF_Dictionary* CPDF_Annot::GetAnnotDict()
+{
+    return m_pAnnotDict;
+}
+
 CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode)
 {
     CPDF_Dictionary* pAP = pAnnotDict->GetDict("AP");
@@ -267,102 +271,6 @@
     ((CPDF_RenderContext*)pContext)->AppendObjectList(pForm, &matrix);
     return TRUE;
 }
-CPDF_PageObject* CPDF_Annot::GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions)
-{
-    if (GetSubType() == "Popup") {
-        return NULL;
-    }
-    FX_DWORD annot_flags = GetFlags();
-    if (annot_flags & ANNOTFLAG_HIDDEN) {
-        return NULL;
-    }
-    FX_BOOL bPrinting = bPrint || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));
-    if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
-        return NULL;
-    }
-    if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {
-        return NULL;
-    }
-    CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS");
-    char style_char;
-    FX_FLOAT width;
-    CPDF_Array* pDashArray = NULL;
-    if (pBS == NULL) {
-        CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border");
-        style_char = 'S';
-        if (pBorderArray) {
-            width = pBorderArray->GetNumber(2);
-            if (pBorderArray->GetCount() == 4) {
-                pDashArray = pBorderArray->GetArray(3);
-                if (pDashArray == NULL) {
-                    return NULL;
-                }
-                style_char = 'D';
-            }
-        } else {
-            width = 1;
-        }
-    } else {
-        CFX_ByteString style = pBS->GetString("S");
-        pDashArray = pBS->GetArray("D");
-        style_char = style[1];
-        width = pBS->GetNumber("W");
-    }
-    if (width <= 0) {
-        return NULL;
-    }
-    CPDF_Array* pColor = m_pAnnotDict->GetArray("C");
-    FX_DWORD argb = 0xff000000;
-    if (pColor != NULL) {
-        int R = (FX_INT32)(pColor->GetNumber(0) * 255);
-        int G = (FX_INT32)(pColor->GetNumber(1) * 255);
-        int B = (FX_INT32)(pColor->GetNumber(2) * 255);
-        argb = ArgbEncode(0xff, R, G, B);
-    }
-    nonstd::unique_ptr<CPDF_PathObject> pPathObject(new CPDF_PathObject());
-    CPDF_GraphStateData *pGraphState = pPathObject->m_GraphState.GetModify();
-    if (!pGraphState) {
-        return NULL;
-    }
-    pGraphState->m_LineWidth = width;
-    CPDF_ColorStateData *pColorData = pPathObject->m_ColorState.GetModify();
-    if (!pColorData) {
-        return NULL;
-    }
-    pColorData->m_StrokeRGB = argb;
-    pPathObject->m_bStroke = TRUE;
-    pPathObject->m_FillType = 0;
-    if (style_char == 'D') {
-        if (pDashArray) {
-            FX_DWORD dash_count = pDashArray->GetCount();
-            if (dash_count % 2) {
-                dash_count ++;
-            }
-            pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, dash_count);
-            pGraphState->m_DashCount = dash_count;
-            FX_DWORD i;
-            for (i = 0; i < pDashArray->GetCount(); i ++) {
-                pGraphState->m_DashArray[i] = pDashArray->GetNumber(i);
-            }
-            if (i < dash_count) {
-                pGraphState->m_DashArray[i] = pGraphState->m_DashArray[i - 1];
-            }
-        } else {
-            pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, 2);
-            pGraphState->m_DashCount = 2;
-            pGraphState->m_DashArray[0] = pGraphState->m_DashArray[1] = 3 * 1.0f;
-        }
-    }
-    CFX_FloatRect rect;
-    GetRect(rect);
-    width /= 2;
-    CPDF_PathData *pPathData = pPathObject->m_Path.GetModify();
-    if (pPathData) {
-        pPathData->AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);
-    }
-    pPathObject->CalcBoundingBox();
-    return pPathObject.release();
-}
 void CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device, const CPDF_RenderOptions* pOptions)
 {
     if (GetSubType() == "Popup") {
@@ -432,12 +340,12 @@
         if (pDashArray) {
             FX_DWORD dash_count = pDashArray->GetCount();
             if (dash_count % 2) {
-                dash_count ++;
+                dash_count++;
             }
             graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count);
             graph_state.m_DashCount = dash_count;
             FX_DWORD i;
-            for (i = 0; i < pDashArray->GetCount(); i ++) {
+            for (i = 0; i < pDashArray->GetCount(); ++i) {
                 graph_state.m_DashArray[i] = pDashArray->GetNumber(i);
             }
             if (i < dash_count) {
@@ -460,38 +368,3 @@
     }
     pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type);
 }
-int CPDF_Annot::CountIRTNotes()
-{
-    int count = 0;
-    for (int i = 0; i < m_pList->Count(); i ++) {
-        CPDF_Annot* pAnnot = m_pList->GetAt(i);
-        if (pAnnot == NULL) {
-            continue;
-        }
-        CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT");
-        if (pIRT != m_pAnnotDict) {
-            continue;
-        }
-        count ++;
-    }
-    return count;
-}
-CPDF_Annot* CPDF_Annot::GetIRTNote(int index)
-{
-    int count = 0;
-    for (int i = 0; i < m_pList->Count(); i ++) {
-        CPDF_Annot* pAnnot = m_pList->GetAt(i);
-        if (pAnnot == NULL) {
-            continue;
-        }
-        CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT");
-        if (pIRT != m_pAnnotDict) {
-            continue;
-        }
-        if (count == index) {
-            return pAnnot;
-        }
-        count ++;
-    }
-    return NULL;
-}
diff --git a/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp b/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp
index ad5a167..4111260 100644
--- a/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp
+++ b/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp
@@ -19,7 +19,7 @@
 	CPDF_Page* pPage = pAnnot->GetPDFPage();
 
 	m_pDocument = pPage->m_pDocument;
-	m_pAnnotDict = pAnnot->GetPDFAnnot()->m_pAnnotDict;
+	m_pAnnotDict = pAnnot->GetPDFAnnot()->GetAnnotDict();
 }
 
 CBA_FontMap::CBA_FontMap(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict, 
diff --git a/fpdfsdk/src/fpdf_ext.cpp b/fpdfsdk/src/fpdf_ext.cpp
index 2dc8d78..2a2f3ae 100644
--- a/fpdfsdk/src/fpdf_ext.cpp
+++ b/fpdfsdk/src/fpdf_ext.cpp
@@ -64,7 +64,7 @@
 	}
 	else if(cbSubType.Compare("Screen") ==0)
 	{
-		CPDF_Dictionary* pAnnotDict = pPDFAnnot->m_pAnnotDict;
+		CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict();
 		CFX_ByteString cbString;
 		if(pAnnotDict->KeyExist("IT"))
 			cbString = pAnnotDict->GetString("IT");
@@ -89,7 +89,7 @@
 	}
 	else if(cbSubType.Compare("Widget") ==0)
 	{
-		CPDF_Dictionary* pAnnotDict = pPDFAnnot->m_pAnnotDict;
+		CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict();
 		CFX_ByteString cbString;
 		if(pAnnotDict->KeyExist("FT"))
 		{
diff --git a/fpdfsdk/src/fpdfeditpage.cpp b/fpdfsdk/src/fpdfeditpage.cpp
index e13c480..375062b 100644
--- a/fpdfsdk/src/fpdfeditpage.cpp
+++ b/fpdfsdk/src/fpdfeditpage.cpp
@@ -292,13 +292,13 @@
 		CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);
 		rect.Transform(&matrix);
 		CPDF_Array *pRectArray = NULL;
-		pRectArray = pAnnot->m_pAnnotDict->GetArray("Rect");
+		pRectArray = pAnnot->GetAnnotDict()->GetArray("Rect");
 		if (!pRectArray) pRectArray=CPDF_Array::Create();
 		pRectArray->SetAt(0, new CPDF_Number(rect.left));
 		pRectArray->SetAt(1, new CPDF_Number(rect.bottom));
 		pRectArray->SetAt(2, new CPDF_Number(rect.right));
 		pRectArray->SetAt(3, new CPDF_Number(rect.top));
-		pAnnot->m_pAnnotDict->SetAt("Rect",pRectArray);
+		pAnnot->GetAnnotDict()->SetAt("Rect",pRectArray);
 
 		//Transform AP's rectangle
 		//To Do
diff --git a/fpdfsdk/src/fsdk_annothandler.cpp b/fpdfsdk/src/fsdk_annothandler.cpp
index bc0f047..2027817 100644
--- a/fpdfsdk/src/fsdk_annothandler.cpp
+++ b/fpdfsdk/src/fsdk_annothandler.cpp
@@ -91,12 +91,10 @@
 	ASSERT(pAnnot != NULL);
 	
 	CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
-	ASSERT(pPDFAnnot != NULL);
-	ASSERT(pPDFAnnot->m_pAnnotDict != NULL);
 	
 	CPDFSDK_DateTime curTime;
-	pPDFAnnot->m_pAnnotDict->SetAtString("M", curTime.ToPDFDateTimeString());
-	pPDFAnnot->m_pAnnotDict->SetAtNumber("F", (int)0);	
+	pPDFAnnot->GetAnnotDict()->SetAtString("M", curTime.ToPDFDateTimeString());
+	pPDFAnnot->GetAnnotDict()->SetAtNumber("F", 0);
 	
 	if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
 	{
@@ -402,7 +400,7 @@
 	ASSERT(pInterForm != NULL);
 	
 	CPDFSDK_Widget* pWidget = NULL;
-	if (CPDF_FormControl* pCtrl = CPDFSDK_Widget::GetFormControl(pInterForm->GetInterForm(), pAnnot->m_pAnnotDict))
+	if (CPDF_FormControl* pCtrl = CPDFSDK_Widget::GetFormControl(pInterForm->GetInterForm(), pAnnot->GetAnnotDict()))
 	{
 		pWidget = new CPDFSDK_Widget(pAnnot, pPage, pInterForm);
 		pInterForm->AddMap(pCtrl, pWidget);
diff --git a/fpdfsdk/src/fsdk_baseannot.cpp b/fpdfsdk/src/fsdk_baseannot.cpp
index 2ac6d0d..6febe6e 100644
--- a/fpdfsdk/src/fsdk_baseannot.cpp
+++ b/fpdfsdk/src/fsdk_baseannot.cpp
@@ -564,17 +564,15 @@
 {
 	ASSERT(m_pAnnot != NULL);
 	
-	return m_pAnnot->m_pAnnotDict;
+	return m_pAnnot->GetAnnotDict();
 }
 
 void CPDFSDK_Annot::SetRect(const CPDF_Rect& rect)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
 	ASSERT(rect.right - rect.left >= GetMinWidth());
 	ASSERT(rect.top - rect.bottom >= GetMinHeight());
 	
-	m_pAnnot->m_pAnnotDict->SetAtRect("Rect", rect);
+	m_pAnnot->GetAnnotDict()->SetAtRect("Rect", rect);
 }
 
 CPDF_Rect CPDFSDK_Annot::GetRect() const
@@ -610,18 +608,12 @@
 
 FX_BOOL	CPDFSDK_Annot::IsAppearanceValid()
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	return m_pAnnot->m_pAnnotDict->GetDict("AP") != NULL;
+	return m_pAnnot->GetAnnotDict()->GetDict("AP") != NULL;
 }
 
 FX_BOOL	CPDFSDK_Annot::IsAppearanceValid(CPDF_Annot::AppearanceMode mode)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	CPDF_Dictionary* pAP = m_pAnnot->m_pAnnotDict->GetDict("AP");
+	CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDict("AP");
 	if (pAP == NULL) return FALSE;
 	
 	// Choose the right sub-ap
@@ -655,63 +647,45 @@
 
 void CPDFSDK_Annot::SetContents(const CFX_WideString& sContents)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
 	if (sContents.IsEmpty())
-		m_pAnnot->m_pAnnotDict->RemoveAt("Contents");
+		m_pAnnot->GetAnnotDict()->RemoveAt("Contents");
 	else
-		m_pAnnot->m_pAnnotDict->SetAtString("Contents", PDF_EncodeText(sContents));
+		m_pAnnot->GetAnnotDict()->SetAtString("Contents", PDF_EncodeText(sContents));
 }
 
 CFX_WideString CPDFSDK_Annot::GetContents() const
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	return m_pAnnot->m_pAnnotDict->GetUnicodeText("Contents");
+	return m_pAnnot->GetAnnotDict()->GetUnicodeText("Contents");
 }
 
 void CPDFSDK_Annot::SetAnnotName(const CFX_WideString& sName)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
 	if (sName.IsEmpty())
-		m_pAnnot->m_pAnnotDict->RemoveAt("NM");
+		m_pAnnot->GetAnnotDict()->RemoveAt("NM");
 	else
-		m_pAnnot->m_pAnnotDict->SetAtString("NM", PDF_EncodeText(sName));
+		m_pAnnot->GetAnnotDict()->SetAtString("NM", PDF_EncodeText(sName));
 }
 
 CFX_WideString CPDFSDK_Annot::GetAnnotName() const
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	return m_pAnnot->m_pAnnotDict->GetUnicodeText("NM");
+	return m_pAnnot->GetAnnotDict()->GetUnicodeText("NM");
 }
 
 void CPDFSDK_Annot::SetModifiedDate(const FX_SYSTEMTIME& st)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
 	CPDFSDK_DateTime dt(st);
 	CFX_ByteString str = dt.ToPDFDateTimeString();
 	
 	if (str.IsEmpty())
-		m_pAnnot->m_pAnnotDict->RemoveAt("M");
+		m_pAnnot->GetAnnotDict()->RemoveAt("M");
 	else
-		m_pAnnot->m_pAnnotDict->SetAtString("M", str);
+		m_pAnnot->GetAnnotDict()->SetAtString("M", str);
 }
 
 FX_SYSTEMTIME CPDFSDK_Annot::GetModifiedDate() const
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
 	FX_SYSTEMTIME systime;	
-	CFX_ByteString str = m_pAnnot->m_pAnnotDict->GetString("M");
+	CFX_ByteString str = m_pAnnot->GetAnnotDict()->GetString("M");
 	
  	CPDFSDK_DateTime dt(str);
  	dt.ToSystemTime(systime);
@@ -721,62 +695,41 @@
 
 void CPDFSDK_Annot::SetFlags(int nFlags)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	m_pAnnot->m_pAnnotDict->SetAtInteger("F", nFlags);
+	m_pAnnot->GetAnnotDict()->SetAtInteger("F", nFlags);
 }
 
 int CPDFSDK_Annot::GetFlags() const
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	return m_pAnnot->m_pAnnotDict->GetInteger("F");
+	return m_pAnnot->GetAnnotDict()->GetInteger("F");
 }
 
 void CPDFSDK_Annot::SetAppState(const CFX_ByteString& str)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
 	if (str.IsEmpty())
-		m_pAnnot->m_pAnnotDict->RemoveAt("AS");
+		m_pAnnot->GetAnnotDict()->RemoveAt("AS");
 	else
-		m_pAnnot->m_pAnnotDict->SetAtString("AS", str);
+		m_pAnnot->GetAnnotDict()->SetAtString("AS", str);
 }
 
 CFX_ByteString CPDFSDK_Annot::GetAppState() const
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
-	return m_pAnnot->m_pAnnotDict->GetString("AS");
+	return m_pAnnot->GetAnnotDict()->GetString("AS");
 }
 
 void CPDFSDK_Annot::SetStructParent(int key)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	m_pAnnot->m_pAnnotDict->SetAtInteger("StructParent", key);
+	m_pAnnot->GetAnnotDict()->SetAtInteger("StructParent", key);
 }
 
 int	CPDFSDK_Annot::GetStructParent() const
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	return m_pAnnot->m_pAnnotDict->GetInteger("StructParent");
+	return m_pAnnot->GetAnnotDict()->GetInteger("StructParent");
 }
 
 //border
 void CPDFSDK_Annot::SetBorderWidth(int nWidth)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
-	CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+	CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
 
 	if (pBorder)
 	{
@@ -784,12 +737,12 @@
 	}
 	else
 	{
-		CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+		CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
 
 		if (!pBSDict)
 		{
 			pBSDict = new CPDF_Dictionary;
-			m_pAnnot->m_pAnnotDict->SetAt("BS", pBSDict);
+			m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict);
 		}
 
 		pBSDict->SetAtInteger("W", nWidth);
@@ -798,10 +751,7 @@
 
 int	CPDFSDK_Annot::GetBorderWidth() const
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
-	CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+	CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
 
 	if (pBorder)
 	{
@@ -809,7 +759,7 @@
 	}
 	else
 	{
-		CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+		CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
 
 		if (pBSDict)
 		{
@@ -821,14 +771,11 @@
 
 void CPDFSDK_Annot::SetBorderStyle(int nStyle)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
-	CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+	CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
 	if (!pBSDict)
 	{
 		pBSDict = new CPDF_Dictionary;
-		m_pAnnot->m_pAnnotDict->SetAt("BS", pBSDict);
+		m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict);
 	}
 
 	switch (nStyle)
@@ -853,10 +800,7 @@
 
 int	CPDFSDK_Annot::GetBorderStyle() const
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
-	CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+	CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
 	if (pBSDict)
 	{
 		CFX_ByteString sBorderStyle = pBSDict->GetString("S", "S");
@@ -867,7 +811,7 @@
 		if (sBorderStyle == "U") return BBS_UNDERLINE;
 	}
 
-	CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+	CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
 	if (pBorder)
 	{
 		if (pBorder->GetCount() >= 4) 
@@ -883,14 +827,11 @@
 
 void CPDFSDK_Annot::SetBorderDash(const CFX_IntArray& array)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
-	CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+	CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
 	if (!pBSDict)
 	{
 		pBSDict = new CPDF_Dictionary;
-		m_pAnnot->m_pAnnotDict->SetAt("BS", pBSDict);
+		m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict);
 	}
 
 	CPDF_Array* pArray = new CPDF_Array;
@@ -904,19 +845,16 @@
 
 void CPDFSDK_Annot::GetBorderDash(CFX_IntArray& array) const
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
 	CPDF_Array* pDash = NULL;
 
-	CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+	CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
 	if (pBorder)
 	{
 		pDash = pBorder->GetArray(3);
 	}
 	else
 	{
-		CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+		CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
 		if (pBSDict)
 		{
 			pDash = pBSDict->GetArray("D");
@@ -934,30 +872,21 @@
 
 void CPDFSDK_Annot::SetColor(FX_COLORREF color)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
 	CPDF_Array* pArray = new CPDF_Array;
 	pArray->AddNumber((FX_FLOAT)FXSYS_GetRValue(color) / 255.0f);
 	pArray->AddNumber((FX_FLOAT)FXSYS_GetGValue(color) / 255.0f);
 	pArray->AddNumber((FX_FLOAT)FXSYS_GetBValue(color) / 255.0f);
-	m_pAnnot->m_pAnnotDict->SetAt("C", pArray);
+	m_pAnnot->GetAnnotDict()->SetAt("C", pArray);
 }
 
 void CPDFSDK_Annot::RemoveColor()
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
-	m_pAnnot->m_pAnnotDict->RemoveAt("C") ; 
+	m_pAnnot->GetAnnotDict()->RemoveAt("C");
 }
 
 FX_BOOL CPDFSDK_Annot::GetColor(FX_COLORREF& color) const
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
-	if (CPDF_Array* pEntry = m_pAnnot->m_pAnnotDict->GetArray("C"))		
+	if (CPDF_Array* pEntry = m_pAnnot->GetAnnotDict()->GetArray("C"))
 	{
 		int nCount = pEntry->GetCount();
 		if (nCount == 1)
@@ -1003,15 +932,12 @@
 								const CPDF_Matrix& matrix, const CFX_ByteString& sContents,
 								const CFX_ByteString& sAPState)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	CPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict("AP");
+	CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP");
 	
 	if (!pAPDict) 
 	{
 		pAPDict = new CPDF_Dictionary;
-		m_pAnnot->m_pAnnotDict->SetAt("AP", pAPDict);
+		m_pAnnot->GetAnnotDict()->SetAt("AP", pAPDict);
 	}
 	
 	CPDF_Stream* pStream = NULL;
@@ -1087,49 +1013,44 @@
 
 CPDF_Action CPDFSDK_Annot::GetAction() const
 {
-	return CPDF_Action(m_pAnnot->m_pAnnotDict->GetDict("A"));
+	return CPDF_Action(m_pAnnot->GetAnnotDict()->GetDict("A"));
 }
 
 void CPDFSDK_Annot::SetAction(const CPDF_Action& action)
 {
 	ASSERT(action);
-	if ((CPDF_Action&)action != CPDF_Action(m_pAnnot->m_pAnnotDict->GetDict("A")))
+	if ((CPDF_Action&)action != CPDF_Action(m_pAnnot->GetAnnotDict()->GetDict("A")))
 	{
 		CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
 		CPDF_Dictionary* pDict = action.GetDict();
 		if (pDict && pDict->GetObjNum() == 0) {
 			pDoc->AddIndirectObject(pDict);
 		}
-		m_pAnnot->m_pAnnotDict->SetAtReference("A", pDoc, pDict->GetObjNum());
+		m_pAnnot->GetAnnotDict()->SetAtReference("A", pDoc, pDict->GetObjNum());
 	}
 }
 
 void CPDFSDK_Annot::RemoveAction()
 {
-	m_pAnnot->m_pAnnotDict->RemoveAt("A");
+	m_pAnnot->GetAnnotDict()->RemoveAt("A");
 }
 
 CPDF_AAction CPDFSDK_Annot::GetAAction() const
 {
-	return m_pAnnot->m_pAnnotDict->GetDict("AA");
+	return m_pAnnot->GetAnnotDict()->GetDict("AA");
 }
 
 void CPDFSDK_Annot::SetAAction(const CPDF_AAction& aa)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
 	ASSERT(aa != NULL);
 	
-	if ((CPDF_AAction&)aa != m_pAnnot->m_pAnnotDict->GetDict("AA"))
-		m_pAnnot->m_pAnnotDict->SetAt("AA", (CPDF_AAction&)aa);
+	if ((CPDF_AAction&)aa != m_pAnnot->GetAnnotDict()->GetDict("AA"))
+		m_pAnnot->GetAnnotDict()->SetAt("AA", (CPDF_AAction&)aa);
 }
 
 void CPDFSDK_Annot::RemoveAAction()
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	m_pAnnot->m_pAnnotDict->RemoveAt("AA");
+	m_pAnnot->GetAnnotDict()->RemoveAt("AA");
 }
 
 CPDF_Action	CPDFSDK_Annot::GetAAction(CPDF_AAction::AActionType eAAT)
diff --git a/fpdfsdk/src/fsdk_baseform.cpp b/fpdfsdk/src/fsdk_baseform.cpp
index 0cbc4ba..8b0738a 100644
--- a/fpdfsdk/src/fsdk_baseform.cpp
+++ b/fpdfsdk/src/fsdk_baseform.cpp
@@ -39,10 +39,7 @@
 
 FX_BOOL		CPDFSDK_Widget::IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-	
-	CPDF_Dictionary* pAP = m_pAnnot->m_pAnnotDict->GetDict("AP");
+	CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDict("AP");
 	if (pAP == NULL) return FALSE;
 	
 	// Choose the right sub-ap
@@ -96,7 +93,7 @@
 	CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
 	ASSERT(pPDFInterForm != NULL);
 
-	CPDF_FormControl* pFormControl = pPDFInterForm->GetControlByDict(m_pAnnot->m_pAnnotDict);
+	CPDF_FormControl* pFormControl = pPDFInterForm->GetControlByDict(m_pAnnot->GetAnnotDict());
 	CPDF_FormField* pFormField = pFormControl->GetField();
 	return pFormField->GetFieldFlags();
 }
@@ -1538,13 +1535,10 @@
 {
 	ASSERT(pImage != NULL);
 
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
 	CPDF_Document* pDoc = m_pPageView->GetPDFDocument();//pDocument->GetDocument();
 	ASSERT(pDoc != NULL);
 
-	CPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict("AP");
+	CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP");
 	ASSERT(pAPDict != NULL);
 
 	CPDF_Stream* pStream = pAPDict->GetStream(sAPType);
@@ -1579,10 +1573,7 @@
 
 void CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType)
 {
-	ASSERT(m_pAnnot != NULL);
-	ASSERT(m_pAnnot->m_pAnnotDict != NULL);
-
-	if (CPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict("AP"))
+	if (CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP"))
 	{
 		pAPDict->RemoveAt(sAPType);
 	}
diff --git a/fpdfsdk/src/fsdk_mgr.cpp b/fpdfsdk/src/fsdk_mgr.cpp
index e6be9bd..7ac370e 100644
--- a/fpdfsdk/src/fsdk_mgr.cpp
+++ b/fpdfsdk/src/fsdk_mgr.cpp
@@ -751,7 +751,7 @@
 
 FX_BOOL CPDFSDK_PageView::Annot_HasAppearance(CPDF_Annot* pAnnot)
 {
-	CPDF_Dictionary* pAnnotDic = pAnnot->m_pAnnotDict;
+	CPDF_Dictionary* pAnnotDic = pAnnot->GetAnnotDict();
 	if(pAnnotDic)
 		return	pAnnotDic->KeyExist("AS");
 	return FALSE;
@@ -831,7 +831,7 @@
  	for(int i=0; i<nCount; i++)
  	{
 		CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
- 		if(pDict==pAnnot->GetPDFAnnot()->m_pAnnotDict) 
+ 		if (pDict == pAnnot->GetPDFAnnot()->GetAnnotDict())
  			return pAnnot;
  	}
 	return NULL;
