[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-4.2' - 5 commits - sw/inc sw/Library_sw.mk sw/qa sw/source sw/uiconfig writerfilter/source xmloff/inc xmloff/source

Oliver-Rainer Wittmann orw at apache.org
Tue Apr 29 11:43:31 PDT 2014


 sw/Library_sw.mk                                  |    2 
 sw/inc/IDocumentMarkAccess.hxx                    |   31 +-
 sw/inc/PostItMgr.hxx                              |    3 
 sw/inc/SidebarWin.hxx                             |   44 ++
 sw/inc/doc.hxx                                    |    1 
 sw/inc/docufld.hxx                                |   12 
 sw/inc/hintids.hxx                                |    2 
 sw/inc/ndhints.hxx                                |   25 +
 sw/inc/postithelper.hxx                           |   73 +++-
 sw/inc/printdata.hxx                              |    1 
 sw/inc/txatbase.hxx                               |    1 
 sw/inc/txtannotationfld.hxx                       |   44 ++
 sw/qa/extras/odfexport/odfexport.cxx              |    8 
 sw/qa/extras/ooxmlexport/ooxmlexport.cxx          |    3 
 sw/qa/extras/rtfexport/rtfexport.cxx              |    3 
 sw/qa/extras/rtfimport/rtfimport.cxx              |    3 
 sw/qa/extras/ww8export/ww8export.cxx              |    1 
 sw/source/core/bastyp/init.cxx                    |    4 
 sw/source/core/crsr/annotationmark.cxx            |  113 +++++++
 sw/source/core/crsr/findtxt.cxx                   |   17 -
 sw/source/core/doc/dbgoutsw.cxx                   |    2 
 sw/source/core/doc/docbm.cxx                      |  325 ++++++++++++++--------
 sw/source/core/doc/doccomp.cxx                    |    7 
 sw/source/core/doc/doccorr.cxx                    |    3 
 sw/source/core/doc/docdde.cxx                     |   13 
 sw/source/core/doc/docedt.cxx                     |   19 -
 sw/source/core/doc/docfld.cxx                     |   12 
 sw/source/core/doc/docfmt.cxx                     |    8 
 sw/source/core/doc/doclay.cxx                     |   10 
 sw/source/core/doc/tblcpy.cxx                     |    2 
 sw/source/core/doc/tblrwcl.cxx                    |    2 
 sw/source/core/docnode/ndcopy.cxx                 |   53 ++-
 sw/source/core/docnode/nodes.cxx                  |   11 
 sw/source/core/docnode/section.cxx                |    2 
 sw/source/core/edit/edfld.cxx                     |    2 
 sw/source/core/edit/edlingu.cxx                   |    1 
 sw/source/core/fields/docufld.cxx                 |   12 
 sw/source/core/fields/postithelper.cxx            |  100 +++---
 sw/source/core/fields/reffld.cxx                  |    2 
 sw/source/core/frmedt/fefly1.cxx                  |    5 
 sw/source/core/inc/MarkManager.hxx                |   37 ++
 sw/source/core/inc/UndoDelete.hxx                 |    6 
 sw/source/core/inc/annotationmark.hxx             |   46 +++
 sw/source/core/inc/crossrefbookmark.hxx           |    2 
 sw/source/core/inc/unoport.hxx                    |    4 
 sw/source/core/table/swtable.cxx                  |    4 
 sw/source/core/text/inftxt.cxx                    |   24 -
 sw/source/core/text/itratr.cxx                    |   31 +-
 sw/source/core/text/pormulti.cxx                  |    4 
 sw/source/core/text/portxt.cxx                    |    2 
 sw/source/core/text/txtfld.cxx                    |    1 
 sw/source/core/text/txtfrm.cxx                    |   49 +--
 sw/source/core/txtnode/atrfld.cxx                 |   59 +++
 sw/source/core/txtnode/atrftn.cxx                 |    6 
 sw/source/core/txtnode/ndtxt.cxx                  |   86 +++--
 sw/source/core/txtnode/thints.cxx                 |   54 ++-
 sw/source/core/txtnode/txtatr2.cxx                |    4 
 sw/source/core/undo/rolbck.cxx                    |   19 -
 sw/source/core/undo/unattr.cxx                    |    2 
 sw/source/core/undo/unbkmk.cxx                    |    7 
 sw/source/core/undo/undel.cxx                     |   29 +
 sw/source/core/undo/undobj.cxx                    |  127 ++++----
 sw/source/core/undo/unins.cxx                     |   21 -
 sw/source/core/unocore/unobkm.cxx                 |   40 +-
 sw/source/core/unocore/unofield.cxx               |  161 +++++++---
 sw/source/core/unocore/unoport.cxx                |   25 +
 sw/source/core/unocore/unoportenum.cxx            |  260 +++++++++++++----
 sw/source/core/view/printdata.cxx                 |    7 
 sw/source/core/view/vprint.cxx                    |   38 ++
 sw/source/filter/ascii/ascatr.cxx                 |    1 
 sw/source/filter/html/css1atr.cxx                 |    2 
 sw/source/filter/html/htmlatr.cxx                 |   18 -
 sw/source/filter/html/htmlgrin.cxx                |   18 -
 sw/source/filter/html/swhtml.cxx                  |    3 
 sw/source/filter/html/wrthtml.cxx                 |   20 -
 sw/source/filter/writer/writer.cxx                |    8 
 sw/source/filter/ww1/fltshell.cxx                 |    7 
 sw/source/filter/ww8/attributeoutputbase.hxx      |    2 
 sw/source/filter/ww8/wrtw8nds.cxx                 |    6 
 sw/source/filter/ww8/ww8atr.cxx                   |    3 
 sw/source/filter/ww8/ww8par.cxx                   |   23 +
 sw/source/ui/config/optdlg.src                    |    1 
 sw/source/ui/config/optpage.cxx                   |    6 
 sw/source/ui/dialog/uiregionsw.cxx                |    4 
 sw/source/ui/dochdl/swdtflvr.cxx                  |    6 
 sw/source/ui/docvw/AnnotationWin.cxx              |   10 
 sw/source/ui/docvw/OverlayRanges.cxx              |  183 ++++++++++++
 sw/source/ui/docvw/OverlayRanges.hxx              |   82 +++++
 sw/source/ui/docvw/PostItMgr.cxx                  |   97 ++++--
 sw/source/ui/docvw/SidebarTxtControl.cxx          |   40 ++
 sw/source/ui/docvw/SidebarTxtControl.hxx          |    2 
 sw/source/ui/docvw/SidebarWin.cxx                 |  162 ++++++++++
 sw/source/ui/fldui/fldmgr.cxx                     |  177 +++++++----
 sw/source/ui/inc/fldmgr.hxx                       |    4 
 sw/source/ui/inc/optpage.hxx                      |    1 
 sw/source/ui/inc/wrtsh.hxx                        |    2 
 sw/source/ui/shells/textfld.cxx                   |    6 
 sw/source/ui/uiview/view2.cxx                     |    4 
 sw/source/ui/uiview/viewmdi.cxx                   |    4 
 sw/source/ui/utlui/bookctrl.cxx                   |    2 
 sw/source/ui/utlui/content.cxx                    |    8 
 sw/source/ui/utlui/navipi.cxx                     |    6 
 sw/source/ui/wrtsh/wrtsh2.cxx                     |   36 +-
 sw/source/ui/wrtsh/wrtsh3.cxx                     |    2 
 sw/uiconfig/swriter/ui/printoptionspage.ui        |   23 +
 writerfilter/source/dmapper/DomainMapper.cxx      |    4 
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   65 ++--
 writerfilter/source/dmapper/DomainMapper_Impl.hxx |   10 
 xmloff/inc/txtfldi.hxx                            |    6 
 xmloff/source/text/txtfldi.cxx                    |  110 +++----
 xmloff/source/text/txtparae.cxx                   |   49 +--
 111 files changed, 2377 insertions(+), 983 deletions(-)

New commits:
commit 9c85141edacd0ad73977f44b98158dbd969bbff3
Author: Oliver-Rainer Wittmann <orw at apache.org>
Date:   Thu Dec 19 18:50:58 2013 +0000

    123792: complete annotations on text ranges feature
    
    - rely annotations on text ranges on new annotation marks
    - support arbitrary text ranges for annotations
    - fix undo/redo regarding annotations an text ranges
    - support annotations on overlapping text ranges
    - fix *.docx import for annotations on overlapping text ranges
    - fix ODF import of annotations on text ranges
    
    cherry-picked from branch ooxml-osba
    
    (cherry picked from commit ebd2922ebd3cf2d3899fb80780d38f367197aadf)
    
    Conflicts:
    	sw/Library_sw.mk
    	sw/inc/IDocumentMarkAccess.hxx
    	sw/inc/SidebarWin.hxx
    	sw/inc/doc.hxx
    	sw/inc/docufld.hxx
    	sw/inc/hintids.hxx
    	sw/inc/ndhints.hxx
    	sw/inc/txatbase.hxx
    	sw/inc/unobookmark.hxx
    	sw/inc/unofield.hxx
    	sw/inc/unoport.hxx
    	sw/source/core/access/accpara.cxx
    	sw/source/core/bastyp/init.cxx
    	sw/source/core/crsr/bookmrk.cxx
    	sw/source/core/crsr/findtxt.cxx
    	sw/source/core/doc/dbgoutsw.cxx
    	sw/source/core/doc/docbm.cxx
    	sw/source/core/doc/doccorr.cxx
    	sw/source/core/doc/docdde.cxx
    	sw/source/core/doc/docedt.cxx
    	sw/source/core/doc/docfld.cxx
    	sw/source/core/doc/doclay.cxx
    	sw/source/core/doc/tblrwcl.cxx
    	sw/source/core/docnode/ndcopy.cxx
    	sw/source/core/docnode/nodes.cxx
    	sw/source/core/docnode/section.cxx
    	sw/source/core/edit/edfld.cxx
    	sw/source/core/fields/docufld.cxx
    	sw/source/core/fields/postithelper.cxx
    	sw/source/core/fields/reffld.cxx
    	sw/source/core/inc/MarkManager.hxx
    	sw/source/core/inc/crossrefbookmark.hxx
    	sw/source/core/text/inftxt.cxx
    	sw/source/core/text/itratr.cxx
    	sw/source/core/text/txtfrm.cxx
    	sw/source/core/txtnode/atrfld.cxx
    	sw/source/core/txtnode/ndtxt.cxx
    	sw/source/core/txtnode/thints.cxx
    	sw/source/core/undo/undel.cxx
    	sw/source/core/undo/undobj.cxx
    	sw/source/core/unocore/unofield.cxx
    	sw/source/core/unocore/unoport.cxx
    	sw/source/core/unocore/unoportenum.cxx
    	sw/source/filter/html/htmlatr.cxx
    	sw/source/filter/html/htmlgrin.cxx
    	sw/source/filter/html/wrthtml.cxx
    	sw/source/filter/writer/writer.cxx
    	sw/source/filter/ww1/fltshell.cxx
    	sw/source/filter/ww8/wrtw8nds.cxx
    	sw/source/filter/ww8/ww8par.cxx
    	sw/source/ui/dialog/uiregionsw.cxx
    	sw/source/ui/dochdl/swdtflvr.cxx
    	sw/source/ui/docvw/PostItMgr.cxx
    	sw/source/ui/docvw/SidebarWin.cxx
    	sw/source/ui/fldui/fldmgr.cxx
    	sw/source/ui/fldui/fldref.cxx
    	sw/source/ui/inc/fldmgr.hxx
    	sw/source/ui/inc/wrtsh.hxx
    	sw/source/ui/shells/textfld.cxx
    	sw/source/ui/uiview/view2.cxx
    	sw/source/ui/utlui/navipi.cxx
    	sw/source/ui/wrtsh/wrtsh2.cxx
    	writerfilter/source/dmapper/DomainMapper_Impl.cxx
    	writerfilter/source/dmapper/DomainMapper_Impl.hxx
    	writerfilter/source/dmapper/PropertyMap.cxx
    	xmloff/inc/txtfldi.hxx
    	xmloff/source/text/txtfldi.cxx
    	xmloff/source/text/txtparae.cxx
    
    (cherry picked from commit 0761f81643a6890457e9ef7d913ab5c88c2593a4)
    
    Conflicts:
    	sw/source/core/access/accpara.cxx
    	sw/source/core/fields/reffld.cxx
    	sw/source/core/text/txtfrm.cxx
    	sw/source/core/txtnode/modeltoviewhelper.cxx
    	sw/source/core/txtnode/thints.cxx
    	sw/source/core/unocore/unoportenum.cxx
    	writerfilter/source/dmapper/DomainMapper_Impl.cxx
    
    Change-Id: Ie4cc467dbb837054c73742262ee20f35c151ff3f

diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk
index ead4148..f576ab7 100644
--- a/sw/Library_sw.mk
+++ b/sw/Library_sw.mk
@@ -133,6 +133,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\
     sw/source/core/bastyp/swregion \
     sw/source/core/bastyp/swtypes \
     sw/source/core/bastyp/tabcol \
+    sw/source/core/crsr/annotationmark \
     sw/source/core/crsr/BlockCursor \
     sw/source/core/crsr/bookmrk \
     sw/source/core/crsr/callnk \
@@ -572,6 +573,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\
     sw/source/ui/docvw/DashedLine \
 	sw/source/ui/docvw/FrameControlsManager \
     sw/source/ui/docvw/PageBreakWin \
+    sw/source/ui/docvw/OverlayRanges \
     sw/source/ui/docvw/PostItMgr \
     sw/source/ui/docvw/ShadowOverlayObject \
     sw/source/ui/docvw/SidebarTxtControl \
diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx
index 739bc4f..917a57f 100644
--- a/sw/inc/IDocumentMarkAccess.hxx
+++ b/sw/inc/IDocumentMarkAccess.hxx
@@ -45,6 +45,7 @@ class IDocumentMarkAccess
             BOOKMARK,
             CROSSREF_HEADING_BOOKMARK,
             CROSSREF_NUMITEM_BOOKMARK,
+            ANNOTATIONMARK,
             TEXT_FIELDMARK,
             CHECKBOX_FIELDMARK,
             NAVIGATOR_REMINDER
@@ -86,6 +87,10 @@ class IDocumentMarkAccess
             const OUString& rName,
             const OUString& rType) = 0;
 
+        virtual sw::mark::IMark* makeAnnotationMark(
+            const SwPaM& rPaM,
+            const ::rtl::OUString& rName ) = 0;
+
         /** Returns a mark in the document for a paragraph.
             If there is none, a mark will be created.
 
@@ -159,6 +164,9 @@ class IDocumentMarkAccess
             const xub_StrLen nOffset) =0;
 
         /** Deletes marks in a range
+
+            Note: navigator reminders are excluded
+
         */
         virtual void deleteMarks(
             const SwNodeIndex& rStt,
@@ -188,15 +196,17 @@ class IDocumentMarkAccess
 
         /** returns a STL-like random access iterator to the begin of the sequence of marks.
         */
-        virtual const_iterator_t getMarksBegin() const =0;
+        virtual const_iterator_t getAllMarksBegin() const =0;
 
         /** returns a STL-like random access iterator to the end of the sequence of marks.
         */
-        virtual const_iterator_t getMarksEnd() const =0;
+        virtual const_iterator_t getAllMarksEnd() const =0;
 
         /** returns the number of marks.
+
+            Note: annotation marks are excluded
         */
-        virtual sal_Int32 getMarksCount() const =0;
+        virtual sal_Int32 getAllMarksCount() const =0;
 
         /** Finds a mark by name.
 
@@ -204,12 +214,12 @@ class IDocumentMarkAccess
             [in] the name of the mark to find.
 
             @returns
-            an iterator pointing to the mark, or pointing to getMarksEnd() if nothing was found.
+            an iterator pointing to the mark, or pointing to getAllMarksEnd() if nothing was found.
         */
         virtual const_iterator_t findMark(const OUString& rMark) const =0;
 
 
-        // interface IBookmarks (BOOKMARK, CROSSREF_NUMITEM_BOOKMARK, CROSSREF_HEADING_BOOKMARK)
+        // interface IBookmarks (BOOKMARK, CROSSREF_NUMITEM_BOOKMARK, CROSSREF_HEADING_BOOKMARK )
 
         /** returns a STL-like random access iterator to the begin of the sequence the IBookmarks.
         */
@@ -239,6 +249,17 @@ class IDocumentMarkAccess
         virtual ::sw::mark::IFieldmark* getFieldmarkBefore(const SwPosition& pos) const =0;
         virtual ::sw::mark::IFieldmark* getFieldmarkAfter(const SwPosition& pos) const =0;
 
+        // Marks exclusive annotation marks
+        virtual const_iterator_t getCommonMarksBegin() const = 0;
+        virtual const_iterator_t getCommonMarksEnd() const = 0;
+        virtual sal_Int32 getCommonMarksCount() const = 0;
+
+        // Annotation Marks
+        virtual const_iterator_t getAnnotationMarksBegin() const = 0;
+        virtual const_iterator_t getAnnotationMarksEnd() const = 0;
+        virtual sal_Int32 getAnnotationMarksCount() const = 0;
+        virtual const_iterator_t findAnnotationMark( const ::rtl::OUString& rName ) const = 0;
+
         /** Returns the MarkType used to create the mark
         */
         static MarkType SAL_DLLPUBLIC_EXPORT GetType(const ::sw::mark::IMark& rMark);
diff --git a/sw/inc/SidebarWin.hxx b/sw/inc/SidebarWin.hxx
index fff8650..67c7249 100644
--- a/sw/inc/SidebarWin.hxx
+++ b/sw/inc/SidebarWin.hxx
@@ -43,6 +43,9 @@ class Edit;
 class MenuButton;
 class SwFrm;
 
+namespace sw { namespace overlay {
+    class OverlayRanges;
+}}
 
 namespace sw { namespace sidebarwindows {
 
@@ -70,7 +73,7 @@ class SwSidebarWin : public Window
                                   long nY,
                                   long nWidth,
                                   long nHeight,
-                                  const SwRect &aRect,
+                                  const SwRect& aAnchorRect,
                                   const long PageBorder);
         void SetPosAndSize();
         void TranslateTopPosition(const long aAmount);
@@ -85,6 +88,7 @@ class SwSidebarWin : public Window
         inline ScrollBar* Scrollbar() { return mpVScrollbar; }
         inline ::sw::sidebarwindows::AnchorOverlayObject* Anchor() { return mpAnchor;}
         inline ::sw::sidebarwindows::ShadowOverlayObject* Shadow() { return mpShadow;}
+        inline ::sw::overlay::OverlayRanges* TextRange() { return mpTextRangeOverlay;}
 
         long            GetPostItTextHeight();
 
@@ -121,14 +125,20 @@ class SwSidebarWin : public Window
 
         void            SetSidebarPosition(sw::sidebarwindows::SidebarPosition eSidebarPosition);
         void            SetReadonly(sal_Bool bSet);
-        sal_Bool            IsReadOnly()        { return mbReadonly;}
-        bool            IsPreview()         { return nFlags & PB_Preview;}
-
-        void            SetColor(Color aColorDark,Color aColorLight, Color aColorAnchor);
+        sal_Bool        IsReadOnly()
+        {
+            return mbReadonly;
+        }
+        bool            IsPreview()
+        {
+            return nFlags & PB_Preview;
+        }
+
+        void         SetColor(Color aColorDark,Color aColorLight, Color aColorAnchor);
         const Color& ColorAnchor() { return mColorAnchor; }
         const Color& ColorDark() { return mColorDark; }
         const Color& ColorLight() { return mColorLight; }
-        void            Rescale();
+        void         Rescale();
 
         void            SetViewState(::sw::sidebarwindows::ViewState bViewState);
 
@@ -136,15 +146,15 @@ class SwSidebarWin : public Window
         void            SetFollow( bool bIsFollow) { mbIsFollow = bIsFollow; };
         virtual bool    CalcFollow() = 0;
 
-        sal_Int32       GetMetaHeight();
-        sal_Int32       GetMinimumSizeWithMeta();
-        sal_Int32       GetMinimumSizeWithoutMeta();
-        sal_Int32       GetMetaButtonAreaWidth();
-        sal_Int32       GetScrollbarWidth();
+        sal_Int32   GetMetaHeight();
+        sal_Int32   GetMinimumSizeWithMeta();
+        sal_Int32   GetMinimumSizeWithoutMeta();
+        sal_Int32   GetMetaButtonAreaWidth();
+        sal_Int32   GetScrollbarWidth();
 
-        void            SetSpellChecking();
+        void    SetSpellChecking();
 
-        void            ToggleInsMode();
+        void    ToggleInsMode();
 
         virtual void    ActivatePostIt();
         virtual void    DeactivatePostIt();
@@ -154,7 +164,10 @@ class SwSidebarWin : public Window
         SwPostItHelper::SwLayoutStatus GetLayoutStatus() { return mLayoutStatus; }
         Color GetChangeColor() { return mChangeColor; }
 
-        virtual bool    IsProtected() {return mbReadonly;};
+        virtual bool IsProtected()
+        {
+            return mbReadonly;
+        }
 
         DECL_LINK( WindowEventListener, VclSimpleEvent* );
         inline bool IsMouseOverSidebarWin() const { return mbMouseOver; }
@@ -206,6 +219,7 @@ class SwSidebarWin : public Window
 
         sw::sidebarwindows::AnchorOverlayObject* mpAnchor;
         sw::sidebarwindows::ShadowOverlayObject* mpShadow;
+        sw::overlay::OverlayRanges* mpTextRangeOverlay;
 
         Color           mColorAnchor;
         Color           mColorDark;
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 987d0ab..73efd7d 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -1079,6 +1079,7 @@ public:
     void CopyWithFlyInFly( const SwNodeRange& rRg,
                             const sal_Int32 nEndContentIndex,
                             const SwNodeIndex& rInsPos,
+                            const SwPaM* pCopiedPaM = NULL,
                             sal_Bool bMakeNewFrms = sal_True,
                             sal_Bool bDelRedlines = sal_True,
                             sal_Bool bCopyFlyAtFly = sal_False ) const;
diff --git a/sw/inc/docufld.hxx b/sw/inc/docufld.hxx
index 38ce19d..5d655b0 100644
--- a/sw/inc/docufld.hxx
+++ b/sw/inc/docufld.hxx
@@ -504,12 +504,16 @@ public:
 class SwPostItFieldType : public SwFieldType
 {
 private:
-    SwDoc*  mpDoc;
+    SwDoc* mpDoc;
 public:
     SwPostItFieldType(SwDoc* pDoc);
 
-    virtual SwFieldType*    Copy() const;
-    SwDoc* GetDoc()         {return mpDoc;};
+    virtual SwFieldType* Copy() const;
+
+    SwDoc* GetDoc() const
+    {
+        return mpDoc;
+    };
 };
 
 /*--------------------------------------------------------------------
@@ -557,7 +561,7 @@ public:
     void                    SetName(const OUString& rStr);
     OUString                GetName() const;
 
-    const OutlinerParaObject*   GetTextObject() const;
+    const OutlinerParaObject* GetTextObject() const;
     void SetTextObject( OutlinerParaObject* pText );
 
     sal_Int32 GetNumberOfParagraphs() const;
diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx
index 5773c2f..783a84f 100644
--- a/sw/inc/hintids.hxx
+++ b/sw/inc/hintids.hxx
@@ -139,7 +139,7 @@ RES_TXTATR_NOEND_BEGIN = RES_TXTATR_WITHEND_END,
     RES_TXTATR_FIELD = RES_TXTATR_NOEND_BEGIN,      // 55
     RES_TXTATR_FLYCNT,                              // 56
     RES_TXTATR_FTN,                                 // 57
-    RES_TXTATR_DUMMY4,                              // 58
+    RES_TXTATR_ANNOTATION,                          // 58
     RES_TXTATR_DUMMY3,                              // 59
     RES_TXTATR_DUMMY1,                              // 60
     RES_TXTATR_DUMMY2,                              // 61
diff --git a/sw/inc/ndhints.hxx b/sw/inc/ndhints.hxx
index 91aebe9..4230c49 100644
--- a/sw/inc/ndhints.hxx
+++ b/sw/inc/ndhints.hxx
@@ -40,17 +40,24 @@ typedef enum {
 } CopyOrNew_t;
 
 /// if COPY then pTxtNode must be given!
-SW_DLLPRIVATE SwTxtAttr *
-MakeTxtAttr( SwDoc & rDoc, SfxPoolItem & rNew,
-        sal_Int32 const nStt, sal_Int32 const nEnd,
-        CopyOrNew_t const bIsCopy = NEW, SwTxtNode *const pTxtNode = 0);
-SW_DLLPRIVATE SwTxtAttr *
-MakeTxtAttr( SwDoc & rDoc, const SfxItemSet & rSet,
-        sal_Int32 nStt, sal_Int32 nEnd );
+SW_DLLPRIVATE SwTxtAttr * MakeTxtAttr(
+    SwDoc & rDoc,
+    SfxPoolItem & rNew,
+    sal_Int32 const nStt,
+    sal_Int32 const nEnd,
+    CopyOrNew_t const bIsCopy = NEW,
+    SwTxtNode *const pTxtNode = 0 );
+
+SW_DLLPRIVATE SwTxtAttr * MakeTxtAttr(
+    SwDoc & rDoc,
+    const SfxItemSet & rSet,
+    sal_Int32 nStt,
+    sal_Int32 nEnd );
 
 /// create redline dummy text hint that must not be inserted into hints array
-SW_DLLPRIVATE SwTxtAttr*
-MakeRedlineTxtAttr( SwDoc & rDoc, SfxPoolItem& rAttr );
+SW_DLLPRIVATE SwTxtAttr* MakeRedlineTxtAttr(
+    SwDoc & rDoc,
+    SfxPoolItem& rAttr );
 
 
 /** Class SwpHints is derived indirectly via SwpHts, because only the
diff --git a/sw/inc/postithelper.hxx b/sw/inc/postithelper.hxx
index 883fab8..cfd3fb0 100644
--- a/sw/inc/postithelper.hxx
+++ b/sw/inc/postithelper.hxx
@@ -43,15 +43,24 @@ struct SwLayoutInfo
 {
     const SwFrm* mpAnchorFrm;
     SwRect mPosition;
+
+    // optional start of the annotation
+    sal_uLong mnStartNodeIdx;
+    sal_Int32 mnStartContent;
+
     SwRect mPageFrame;
     SwRect mPagePrtArea;
     unsigned long mnPageNumber;
+
     sw::sidebarwindows::SidebarPosition meSidebarPosition;
+
     sal_uInt16 mRedlineAuthor;
 
     SwLayoutInfo()
         : mpAnchorFrm(0)
         , mPosition()
+        , mnStartNodeIdx( 0 )
+        , mnStartContent( -1 )
         , mPageFrame()
         , mPagePrtArea()
         , mnPageNumber(1)
@@ -67,7 +76,11 @@ namespace SwPostItHelper
         INVISIBLE, VISIBLE, INSERTED, DELETED, NONE, HIDDEN
     };
 
-    SwLayoutStatus getLayoutInfos( std::vector< SwLayoutInfo >&, SwPosition& );
+    SwLayoutStatus getLayoutInfos(
+        SwLayoutInfo& o_rInfo,
+        const SwPosition& rAnchorPos,
+        const SwPosition* pAnnotationStartPos = NULL );
+
     long getLayoutHeight( const SwRootFrm* pRoot );
     void setSidebarChanged( SwRootFrm* pRoot, bool bBrowseMode );
     unsigned long getPageInfo( SwRect& rPageFrm, const SwRootFrm* , const Point& );
@@ -90,12 +103,17 @@ public:
         , bFocus(aFocus)
         , mLayoutStatus( SwPostItHelper::INVISIBLE )
         , maLayoutInfo()
-    {}
-    virtual ~SwSidebarItem(){}
+    {
+    }
+
+    virtual ~SwSidebarItem()
+    {
+    }
+
     virtual SwPosition GetAnchorPosition() const = 0;
     virtual bool UseElement() = 0;
-    virtual SwFmtFld* GetFmtFld() const = 0;
-    virtual SfxBroadcaster* GetBroadCaster() const = 0;
+    virtual const SwFmtFld& GetFmtFld() const = 0;
+    virtual const SfxBroadcaster* GetBroadCaster() const = 0;
     virtual sw::sidebarwindows::SwSidebarWin* GetSidebarWindow( SwEditWin& rEditWin,
                                                                 WinBits nBits,
                                                                 SwPostItMgr& aMgr,
@@ -104,25 +122,38 @@ public:
 
 class SwAnnotationItem: public SwSidebarItem
 {
-    private:
-    SwFmtFld* pFmtFld;
-
-    public:
-    SwAnnotationItem( SwFmtFld* p,
-                      const bool aShow,
-                      const bool aFocus)
+public:
+    SwAnnotationItem(
+        SwFmtFld& rFmtFld,
+        const bool aShow,
+        const bool aFocus)
         : SwSidebarItem( aShow, aFocus )
-        , pFmtFld(p)
-    {}
-    virtual ~SwAnnotationItem() {}
+        , mrFmtFld( rFmtFld )
+    {
+    }
+
+    virtual ~SwAnnotationItem()
+    {
+    }
+
     virtual SwPosition GetAnchorPosition() const;
     virtual bool UseElement();
-    virtual SwFmtFld* GetFmtFld() const {return pFmtFld;}
-    virtual SfxBroadcaster* GetBroadCaster() const { return dynamic_cast<SfxBroadcaster *> (pFmtFld); }
-    virtual sw::sidebarwindows::SwSidebarWin* GetSidebarWindow( SwEditWin& rEditWin,
-                                                                WinBits nBits,
-                                                                SwPostItMgr& aMgr,
-                                                                SwPostItBits aBits);
+    virtual const SwFmtFld& GetFmtFld() const
+    {
+        return mrFmtFld;
+    }
+    virtual const SfxBroadcaster* GetBroadCaster() const
+    {
+        return dynamic_cast<const SfxBroadcaster *> (&mrFmtFld);
+    }
+    virtual sw::sidebarwindows::SwSidebarWin* GetSidebarWindow(
+        SwEditWin& rEditWin,
+        WinBits nBits,
+        SwPostItMgr& aMgr,
+        SwPostItBits aBits );
+
+private:
+    SwFmtFld& mrFmtFld;
 };
 
 #endif // INCLUDED_SW_INC_POSTITHELPER_HXX
diff --git a/sw/inc/txatbase.hxx b/sw/inc/txatbase.hxx
index 266b205..fb274bc 100644
--- a/sw/inc/txatbase.hxx
+++ b/sw/inc/txatbase.hxx
@@ -186,6 +186,7 @@ inline const SwFmtFld& SwTxtAttr::GetFmtFld() const
 {
     assert( m_pAttr
             && ( m_pAttr->Which() == RES_TXTATR_FIELD
+                 || m_pAttr->Which() == RES_TXTATR_ANNOTATION
                  || m_pAttr->Which() == RES_TXTATR_INPUTFIELD ));
     return (const SwFmtFld&)(*m_pAttr);
 }
diff --git a/sw/inc/txtannotationfld.hxx b/sw/inc/txtannotationfld.hxx
new file mode 100755
index 0000000..a134a9e
--- /dev/null
+++ b/sw/inc/txtannotationfld.hxx
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_SW_INC_TXTANNOTATIONFLD_HXX
+#define INCLUDED_SW_INC_TXTANNOTATIONFLD_HXX
+
+#include <txtfld.hxx>
+#include <IMark.hxx>
+
+class SwDoc;
+
+class SwTxtAnnotationFld : public SwTxtFld
+{
+public:
+    SwTxtAnnotationFld(
+        SwFmtFld & rAttr,
+        xub_StrLen const nStart,
+        bool const bInClipboard );
+
+    virtual ~SwTxtAnnotationFld();
+
+    ::sw::mark::IMark* GetAnnotationMark(
+        SwDoc* pDoc = NULL ) const;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx
index 1441027..5ef7ca4 100644
--- a/sw/qa/extras/odfexport/odfexport.cxx
+++ b/sw/qa/extras/odfexport/odfexport.cxx
@@ -42,10 +42,10 @@ DECLARE_ODFEXPORT_TEST(testFdo38244, "fdo38244.odt")
     uno::Reference<container::XEnumeration> xRunEnum = xRunEnumAccess->createEnumeration();
     xRunEnum->nextElement();
     uno::Reference<beans::XPropertySet> xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY);
-    CPPUNIT_ASSERT_EQUAL(OUString("TextFieldStart"), getProperty<OUString>(xPropertySet, "TextPortionType"));
+    CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), getProperty<OUString>(xPropertySet, "TextPortionType"));
     xRunEnum->nextElement();
     xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY);
-    CPPUNIT_ASSERT_EQUAL(OUString("TextFieldEnd"), getProperty<OUString>(xPropertySet, "TextPortionType"));
+    CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), getProperty<OUString>(xPropertySet, "TextPortionType"));
 
     // Test properties
     uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY);
@@ -109,7 +109,7 @@ DECLARE_ODFEXPORT_TEST(testFdo60769, "fdo60769.odt")
         uno::Reference<beans::XPropertySet> xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY);
         OUString aType =  getProperty<OUString>(xPropertySet, "TextPortionType");
         // First paragraph: no field end, no anchor
-        CPPUNIT_ASSERT(aType == "Text" || aType == "TextFieldStart");
+        CPPUNIT_ASSERT(aType == "Text" || aType == "Annotation");
     }
 
     xRunEnumAccess.set(xParaEnum->nextElement(), uno::UNO_QUERY);
@@ -118,7 +118,7 @@ DECLARE_ODFEXPORT_TEST(testFdo60769, "fdo60769.odt")
         uno::Reference<beans::XPropertySet> xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY);
         OUString aType =  getProperty<OUString>(xPropertySet, "TextPortionType");
         // Second paragraph: no field start
-        CPPUNIT_ASSERT(aType == "Text" || aType == "TextFieldEnd");
+        CPPUNIT_ASSERT(aType == "Text" || aType == "AnnotationEnd");
     }
 }
 
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index 7095ea2..a8a56cd 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -202,6 +202,8 @@ DECLARE_OOXMLEXPORT_TEST(defaultTabStopNotInStyles, "empty.odt")
 
 DECLARE_OOXMLEXPORT_TEST(testFdo38244, "fdo38244.docx")
 {
+#if 0
+    // FIXME port to AnnotationMarks
     /*
      * Comments attached to a range was imported without the range, check for the fieldmark start/end positions.
      *
@@ -262,6 +264,7 @@ DECLARE_OOXMLEXPORT_TEST(testFdo38244, "fdo38244.docx")
         bCaught = true;
     }
     CPPUNIT_ASSERT_EQUAL(true, bCaught);
+#endif
 }
 
 DECLARE_OOXMLEXPORT_TEST(testMathEscape, "math-escape.docx")
diff --git a/sw/qa/extras/rtfexport/rtfexport.cxx b/sw/qa/extras/rtfexport/rtfexport.cxx
index 225ab3a..ce190ad 100644
--- a/sw/qa/extras/rtfexport/rtfexport.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport.cxx
@@ -134,6 +134,8 @@ DECLARE_RTFEXPORT_TEST(testFdo48335, "fdo48335.odt")
 
 DECLARE_RTFEXPORT_TEST(testFdo38244, "fdo38244.rtf")
 {
+#if 0
+    // FIXME port to AnnotationMarks
     // See ooxmlexport's testFdo38244().
     // Test comment range feature.
     uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
@@ -154,6 +156,7 @@ DECLARE_RTFEXPORT_TEST(testFdo38244, "fdo38244.rtf")
     uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
     xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty<OUString>(xPropertySet, "Initials"));
+#endif
 }
 
 DECLARE_RTFEXPORT_TEST(testMathAccents, "math-accents.rtf")
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 908178f..50cbff8 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -1307,6 +1307,8 @@ DECLARE_RTFIMPORT_TEST(testFdo53556, "fdo53556.rtf")
 
 DECLARE_RTFIMPORT_TEST(testFdo63428, "hello.rtf")
 {
+#if 0
+    // FIXME port to AnnotationMarks
     // Pasting content that contained an annotation caused a crash.
     uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
     uno::Reference<text::XTextRange> xText(xTextDocument->getText(), uno::UNO_QUERY);
@@ -1316,6 +1318,7 @@ DECLARE_RTFIMPORT_TEST(testFdo63428, "hello.rtf")
     // Additionally, commented range was imported as a normal comment.
     CPPUNIT_ASSERT_EQUAL(OUString("TextFieldStart"), getProperty<OUString>(getRun(getParagraph(1), 2), "TextPortionType"));
     CPPUNIT_ASSERT_EQUAL(OUString("TextFieldEnd"), getProperty<OUString>(getRun(getParagraph(1), 4), "TextPortionType"));
+#endif
 }
 
 DECLARE_RTFIMPORT_TEST(testGroupshapeRotation, "groupshape-rotation.rtf")
diff --git a/sw/qa/extras/ww8export/ww8export.cxx b/sw/qa/extras/ww8export/ww8export.cxx
index 111af79..b66d895 100644
--- a/sw/qa/extras/ww8export/ww8export.cxx
+++ b/sw/qa/extras/ww8export/ww8export.cxx
@@ -152,6 +152,7 @@ DECLARE_WW8EXPORT_TEST(testCharacterBorder, "charborder.odt")
 
 DECLARE_WW8EXPORT_TEST(testFdo59530, "fdo59530.doc")
 {
+    // FIXME port to AnnotationMarks
     // See ooxmlexport's testFdo38244().
     // Test comment range feature.
     uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
diff --git a/sw/source/core/bastyp/init.cxx b/sw/source/core/bastyp/init.cxx
index d606aa6..e1b4f3f 100644
--- a/sw/source/core/bastyp/init.cxx
+++ b/sw/source/core/bastyp/init.cxx
@@ -308,7 +308,7 @@ SfxItemInfo aSlotTab[] =
     { 0, 0 },                                           // RES_TXTATR_FIELD
     { 0, 0 },                                           // RES_TXTATR_FLYCNT
     { 0, 0 },                                           // RES_TXTATR_FTN
-    { 0, SFX_ITEM_POOLABLE },                           // RES_TXTATR_DUMMY4
+    { 0, 0 },                                           // RES_TXTATR_ANNOTATION
     { 0, SFX_ITEM_POOLABLE },                           // RES_TXTATR_DUMMY3
     { 0, SFX_ITEM_POOLABLE },                           // RES_TXTATR_DUMMY1
     { 0, SFX_ITEM_POOLABLE },                           // RES_TXTATR_DUMMY2
@@ -516,12 +516,12 @@ void _InitCore()
     aAttrTab[ RES_TXTATR_FIELD- POOLATTR_BEGIN ] =          new SwFmtFld( RES_TXTATR_FIELD );
     aAttrTab[ RES_TXTATR_FLYCNT - POOLATTR_BEGIN ] =        new SwFmtFlyCnt( 0 );
     aAttrTab[ RES_TXTATR_FTN - POOLATTR_BEGIN ] =           new SwFmtFtn;
+    aAttrTab[ RES_TXTATR_ANNOTATION - POOLATTR_BEGIN ] = new SwFmtFld( RES_TXTATR_ANNOTATION );
 
 // TextAttr - Dummies
     aAttrTab[ RES_TXTATR_DUMMY1 - POOLATTR_BEGIN ] =        new SfxBoolItem( RES_TXTATR_DUMMY1 );
     aAttrTab[ RES_TXTATR_DUMMY2 - POOLATTR_BEGIN ] =        new SfxBoolItem( RES_TXTATR_DUMMY2 );
     aAttrTab[ RES_TXTATR_DUMMY3 - POOLATTR_BEGIN ] =        new SfxBoolItem( RES_TXTATR_DUMMY3 );
-    aAttrTab[ RES_TXTATR_DUMMY4 - POOLATTR_BEGIN ] =        new SfxBoolItem( RES_TXTATR_DUMMY4 );
 
     aAttrTab[ RES_PARATR_LINESPACING- POOLATTR_BEGIN ] =    new SvxLineSpacingItem( LINE_SPACE_DEFAULT_HEIGHT, RES_PARATR_LINESPACING );
     aAttrTab[ RES_PARATR_ADJUST- POOLATTR_BEGIN ] =         new SvxAdjustItem( SVX_ADJUST_LEFT, RES_PARATR_ADJUST );
diff --git a/sw/source/core/crsr/annotationmark.cxx b/sw/source/core/crsr/annotationmark.cxx
new file mode 100644
index 0000000..964e736
--- /dev/null
+++ b/sw/source/core/crsr/annotationmark.cxx
@@ -0,0 +1,113 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <annotationmark.hxx>
+
+#include <doc.hxx>
+#include <IDocumentMarkAccess.hxx>
+#include <fldbas.hxx>
+#include <switerator.hxx>
+#include <fmtfld.hxx>
+#include <docufld.hxx>
+#include <IDocumentUndoRedo.hxx>
+#include <UndoBookmark.hxx>
+#include <ndtxt.hxx>
+#include <txtfld.hxx>
+
+namespace sw { namespace mark
+{
+    AnnotationMark::AnnotationMark(
+        const SwPaM& rPaM,
+        const ::rtl::OUString& rName )
+        : MarkBase( rPaM, rName )
+    {
+        if ( rName.getLength() == 0 )
+        {
+            SetName( MarkBase::GenerateNewName( ::rtl::OUString::createFromAscii("__Annotation__") ) );
+        }
+    }
+
+
+    AnnotationMark::~AnnotationMark()
+    {
+    }
+
+
+    void AnnotationMark::InitDoc(SwDoc* const io_pDoc)
+    {
+        SwTxtFld* pTxtFld =
+            GetMarkEnd().nNode.GetNode().GetTxtNode()->GetFldTxtAttrAt(
+            GetMarkEnd().nContent.GetIndex()-1, true );
+        if ( pTxtFld != NULL )
+        {
+            const SwPostItField* pPostItField = dynamic_cast< const SwPostItField* >(pTxtFld->GetFmtFld().GetField());
+            OSL_ENSURE( pPostItField != NULL, "<AnnotationMark::InitDoc(..)> - annotation field missing!" );
+            if ( pPostItField != NULL )
+            {
+                // use the annotation mark's name as the annotation name, if
+                // - the annotation field has an empty annotation name or
+                // - the annotation mark's name differs (on mark creation a name clash had been detected)
+                if ( pPostItField->GetName().isEmpty()
+                    || rtl::OUString( pPostItField->GetName() ) != GetName() )
+                {
+                    const_cast<SwPostItField*>(pPostItField)->SetName( GetName() );
+                }
+            }
+        }
+
+        if (io_pDoc->GetIDocumentUndoRedo().DoesUndo())
+        {
+            io_pDoc->GetIDocumentUndoRedo().AppendUndo( new SwUndoInsBookmark(*this) );
+        }
+        io_pDoc->SetModified();
+    }
+
+
+    const SwFmtFld* AnnotationMark::GetAnnotationFmtFld() const
+    {
+        SwDoc* pDoc = GetMarkPos().GetDoc();
+        if ( pDoc == NULL )
+        {
+            OSL_ENSURE( false, "<AnnotationMark::GetAnnotationFmtFld()> - missing document at annotation mark" );
+            return NULL;
+        }
+
+        SwFmtFld* pAnnotationFmtFld = NULL;
+
+        SwFieldType* pType = pDoc->GetFldType( RES_POSTITFLD, OUString(), false );
+        SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
+        for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld != NULL; pFmtFld = aIter.Next() )
+        {
+            if ( pFmtFld->IsFldInDoc() )
+            {
+                const SwPostItField* pPostItField = dynamic_cast< const SwPostItField* >(pFmtFld->GetField());
+                if ( pPostItField != NULL
+                     && rtl::OUString( pPostItField->GetName() ) == GetName() )
+                {
+                    pAnnotationFmtFld = pFmtFld;
+                    break;
+                }
+            }
+        }
+
+        return pAnnotationFmtFld;
+    }
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/crsr/findtxt.cxx b/sw/source/core/crsr/findtxt.cxx
index 5567cfa..5d56183 100644
--- a/sw/source/core/crsr/findtxt.cxx
+++ b/sw/source/core/crsr/findtxt.cxx
@@ -118,6 +118,7 @@ lcl_CleanStr(const SwTxtNode& rNd, sal_Int32 const nStart, sal_Int32& rEnd,
                 case RES_TXTATR_FLYCNT:
                 case RES_TXTATR_FTN:
                 case RES_TXTATR_FIELD:
+                case RES_TXTATR_ANNOTATION:
                 case RES_TXTATR_REFMARK:
                 case RES_TXTATR_TOXMARK:
                 case RES_TXTATR_META:
@@ -130,9 +131,10 @@ lcl_CleanStr(const SwTxtNode& rNd, sal_Int32 const nStart, sal_Int32& rEnd,
                         // simply removed if first. If at the end, we keep the
                         // replacement and remove afterwards all at a string's
                         // end (might be normal 0x7f).
-                        bool bEmpty = RES_TXTATR_FIELD != pHt->Which() ||
-                            (static_cast<SwTxtFld const*>(pHt)
-                                ->GetFmtFld().GetField()->ExpandField(true).isEmpty());
+                        const bool bEmpty =
+                            ( pHt->Which() != RES_TXTATR_FIELD
+                              && pHt->Which() != RES_TXTATR_ANNOTATION )
+                            || (static_cast<SwTxtFld const*>(pHt)->GetFmtFld().GetField()->ExpandField(true).isEmpty());;
                         if ( bEmpty && nStart == nAkt )
                         {
                             rArr.push_back( nAkt );
@@ -189,8 +191,7 @@ xub_StrLen GetPostIt(xub_StrLen aCount,const SwpHints *pHts)
         {
             aIndex++;
             const SwTxtAttr* pTxtAttr = (*pHts)[i];
-            if ( (pTxtAttr->Which()==RES_TXTATR_FIELD)
-                 && (pTxtAttr->GetFmtFld().GetField()->Which()==RES_POSTITFLD))
+            if ( pTxtAttr->Which() == RES_TXTATR_ANNOTATION )
             {
                 aCount--;
                 if (!aCount)
@@ -202,8 +203,7 @@ xub_StrLen GetPostIt(xub_StrLen aCount,const SwpHints *pHts)
     for( sal_Int32 i = aIndex; i < pHts->Count(); i++ )
     {
         const SwTxtAttr* pTxtAttr = (*pHts)[i];
-        if ( (pTxtAttr->Which()==RES_TXTATR_FIELD)
-             && (pTxtAttr->GetFmtFld().GetField()->Which()==RES_POSTITFLD))
+        if ( pTxtAttr->Which() == RES_TXTATR_ANNOTATION )
             break;
         else
             aIndex++;
@@ -267,8 +267,7 @@ bool SwPaM::Find( const SearchOptions& rSearchOpt, bool bSearchInNotes , utl::Te
                 for( sal_Int32 i = 0; i < pHts->Count(); i++ )
                 {
                     const SwTxtAttr* pTxtAttr = (*pHts)[i];
-                    if ( (pTxtAttr->Which()==RES_TXTATR_FIELD)
-                         && (pTxtAttr->GetFmtFld().GetField()->Which()==RES_POSTITFLD))
+                    if ( pTxtAttr->Which()==RES_TXTATR_ANNOTATION )
                     {
                         const sal_Int32 aPos = *pTxtAttr->GetStart();
                         if ( (aPos >= nStart) && (aPos <= nEnd) )
diff --git a/sw/source/core/doc/dbgoutsw.cxx b/sw/source/core/doc/dbgoutsw.cxx
index ba20925..97b8b3b 100644
--- a/sw/source/core/doc/dbgoutsw.cxx
+++ b/sw/source/core/doc/dbgoutsw.cxx
@@ -169,7 +169,7 @@ map<sal_uInt16,OUString,CompareUShort> & GetItemWhichMap()
         aItemWhichMap[RES_TXTATR_FIELD] = "TXTATR_FIELD";
         aItemWhichMap[RES_TXTATR_FLYCNT] = "TXTATR_FLYCNT";
         aItemWhichMap[RES_TXTATR_FTN] = "TXTATR_FTN";
-        aItemWhichMap[RES_TXTATR_DUMMY4] = "TXTATR_DUMMY4";
+        aItemWhichMap[RES_TXTATR_ANNOTATION] = "TXTATR_ANNOTATION";
         aItemWhichMap[RES_TXTATR_DUMMY3] = "TXTATR_DUMMY3";
         aItemWhichMap[RES_TXTATR_DUMMY1] = "TXTATR_DUMMY1";
         aItemWhichMap[RES_TXTATR_DUMMY2] = "TXTATR_DUMMY2";
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index 554e3ae..3690917 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -22,6 +22,7 @@
 #include <boost/bind.hpp>
 #include <cntfrm.hxx>
 #include <crossrefbookmark.hxx>
+#include <annotationmark.hxx>
 #include <dcontact.hxx>
 #include <doc.hxx>
 #include <docary.hxx>
@@ -274,6 +275,8 @@ IDocumentMarkAccess::MarkType IDocumentMarkAccess::GetType(const IMark& rBkmk)
         return CROSSREF_HEADING_BOOKMARK;
     else if(*pMarkTypeInfo == typeid(CrossRefNumItemBookmark))
         return CROSSREF_NUMITEM_BOOKMARK;
+    else if(*pMarkTypeInfo == typeid(AnnotationMark))
+        return ANNOTATIONMARK;
     else if(*pMarkTypeInfo == typeid(TextFieldmark))
         return TEXT_FIELDMARK;
     else if(*pMarkTypeInfo == typeid(CheckboxFieldmark))
@@ -309,8 +312,15 @@ bool IDocumentMarkAccess::IsLegalPaMForCrossRefHeadingBookmark( const SwPaM& rPa
 namespace sw { namespace mark
 {
     MarkManager::MarkManager(SwDoc& rDoc)
-        : m_pDoc(&rDoc)
+        : m_vAllMarks()
+        , m_vBookmarks()
+        , m_vFieldmarks()
+        , m_vAnnotationMarks()
+        , m_vCommonMarks()
+        , m_pDoc(&rDoc)
     { }
+
+
     ::sw::mark::IMark* MarkManager::makeMark(const SwPaM& rPaM,
         const OUString& rName,
         const IDocumentMarkAccess::MarkType eType)
@@ -331,7 +341,7 @@ namespace sw { namespace mark
         }
 #endif
         // see for example _SaveCntntIdx, Shells
-        OSL_PRECOND(m_vMarks.size() < USHRT_MAX,
+        OSL_PRECOND(m_vAllMarks.size() < USHRT_MAX,
             "MarkManager::makeMark(..)"
             " - more than USHRT_MAX marks are not supported correctly");
         // There should only be one CrossRefBookmark per Textnode per Type
@@ -369,6 +379,9 @@ namespace sw { namespace mark
             case IDocumentMarkAccess::UNO_BOOKMARK:
                 pMark = boost::shared_ptr<IMark>(new UnoMark(rPaM));
                 break;
+            case IDocumentMarkAccess::ANNOTATIONMARK:
+                pMark = boost::shared_ptr<IMark>(new AnnotationMark( rPaM, rName ));
+                break;
         }
         OSL_ENSURE(pMark.get(),
             "MarkManager::makeMark(..)"
@@ -379,34 +392,40 @@ namespace sw { namespace mark
             pMarkBase->Swap();
 
         // for performance reasons, we trust UnoMarks to have a (generated) unique name
-        if(eType != IDocumentMarkAccess::UNO_BOOKMARK)
-            pMarkBase->SetName(getUniqueMarkName(pMarkBase->GetName()));
+        if ( eType != IDocumentMarkAccess::UNO_BOOKMARK )
+            pMarkBase->SetName( getUniqueMarkName( pMarkBase->GetName() ) );
 
         // register mark
         m_aMarkNamesSet.insert(pMarkBase->GetName());
-        lcl_InsertMarkSorted(m_vMarks, pMark);
+        lcl_InsertMarkSorted(m_vAllMarks, pMark);
         switch(eType)
         {
             case IDocumentMarkAccess::BOOKMARK:
             case IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK:
             case IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK:
+                lcl_InsertMarkSorted(m_vCommonMarks, pMark);
                 lcl_InsertMarkSorted(m_vBookmarks, pMark);
                 break;
             case IDocumentMarkAccess::TEXT_FIELDMARK:
             case IDocumentMarkAccess::CHECKBOX_FIELDMARK:
+                lcl_InsertMarkSorted(m_vCommonMarks, pMark);
                 lcl_InsertMarkSorted(m_vFieldmarks, pMark);
                 break;
+            case IDocumentMarkAccess::ANNOTATIONMARK:
+                lcl_InsertMarkSorted( m_vAnnotationMarks, pMark );
+                break;
             case IDocumentMarkAccess::NAVIGATOR_REMINDER:
             case IDocumentMarkAccess::DDE_BOOKMARK:
             case IDocumentMarkAccess::UNO_BOOKMARK:
-            // no special array for these
+                lcl_InsertMarkSorted(m_vCommonMarks, pMark);
+                // no special array for these
                 break;
         }
         pMarkBase->InitDoc(m_pDoc);
 #if 0
         OSL_TRACE("--- makeType ---");
         OSL_TRACE("Marks");
-        lcl_DebugMarks(m_vMarks);
+        lcl_DebugMarks(m_vAllMarks);
         OSL_TRACE("Bookmarks");
         lcl_DebugMarks(m_vBookmarks);
         OSL_TRACE("Fieldmarks");
@@ -416,7 +435,8 @@ namespace sw { namespace mark
         return pMark.get();
     }
 
-    ::sw::mark::IFieldmark* MarkManager::makeFieldBookmark( const SwPaM& rPaM,
+    ::sw::mark::IFieldmark* MarkManager::makeFieldBookmark(
+        const SwPaM& rPaM,
         const OUString& rName,
         const OUString& rType )
     {
@@ -428,7 +448,8 @@ namespace sw { namespace mark
         return pFieldMark;
     }
 
-    ::sw::mark::IFieldmark* MarkManager::makeNoTextFieldBookmark( const SwPaM& rPaM,
+    ::sw::mark::IFieldmark* MarkManager::makeNoTextFieldBookmark(
+        const SwPaM& rPaM,
         const OUString& rName,
         const OUString& rType)
     {
@@ -440,8 +461,10 @@ namespace sw { namespace mark
         return pFieldMark;
     }
 
-    ::sw::mark::IMark* MarkManager::getMarkForTxtNode(const SwTxtNode& rTxtNode,
-        const IDocumentMarkAccess::MarkType eType)
+
+    ::sw::mark::IMark* MarkManager::getMarkForTxtNode(
+        const SwTxtNode& rTxtNode,
+        const IDocumentMarkAccess::MarkType eType )
     {
         SwPosition aPos(rTxtNode);
         aPos.nContent.Assign(&(const_cast<SwTxtNode&>(rTxtNode)), 0);
@@ -452,7 +475,16 @@ namespace sw { namespace mark
         return makeMark(aPaM, OUString(), eType);
     }
 
-    void MarkManager::repositionMark( ::sw::mark::IMark* const io_pMark,
+
+    sw::mark::IMark* MarkManager::makeAnnotationMark(
+        const SwPaM& rPaM,
+        const ::rtl::OUString& rName )
+    {
+        return makeMark( rPaM, rName, IDocumentMarkAccess::ANNOTATIONMARK );
+    }
+
+    void MarkManager::repositionMark(
+        ::sw::mark::IMark* const io_pMark,
         const SwPaM& rPaM)
     {
         OSL_PRECOND(io_pMark->GetMarkPos().GetDoc() == m_pDoc,
@@ -471,14 +503,16 @@ namespace sw { namespace mark
         sortMarks();
     }
 
-    bool MarkManager::renameMark(::sw::mark::IMark* io_pMark, const OUString& rNewName)
+    bool MarkManager::renameMark(
+        ::sw::mark::IMark* io_pMark,
+        const OUString& rNewName )
     {
         OSL_PRECOND(io_pMark->GetMarkPos().GetDoc() == m_pDoc,
             "<MarkManager::renameMark(..)>"
             " - Mark is not in my doc.");
-        if(io_pMark->GetName() == rNewName)
+        if ( io_pMark->GetName() == rNewName )
             return true;
-        if(hasMark(rNewName))
+        if ( findMark(rNewName) != m_vAllMarks.end() )
             return false;
         m_aMarkNamesSet.erase(dynamic_cast< ::sw::mark::MarkBase* >(io_pMark)->GetName());
         m_aMarkNamesSet.insert(rNewName);
@@ -486,24 +520,30 @@ namespace sw { namespace mark
         return true;
     }
 
-    void MarkManager::correctMarksAbsolute(const SwNodeIndex& rOldNode, const SwPosition& rNewPos, const xub_StrLen nOffset)
+
+    void MarkManager::correctMarksAbsolute(
+        const SwNodeIndex& rOldNode,
+        const SwPosition& rNewPos,
+        const xub_StrLen nOffset)
     {
         const SwNode* const pOldNode = &rOldNode.GetNode();
         SwPosition aNewPos(rNewPos);
         aNewPos.nContent += nOffset;
         bool isSortingNeeded = false;
-        for(iterator_t ppMark = m_vMarks.begin();
-            ppMark != m_vMarks.end();
+
+        for(iterator_t ppMark = m_vAllMarks.begin();
+            ppMark != m_vAllMarks.end();
             ++ppMark)
         {
-            // is on position ??
-            bool bChangedPos = false, bChangedOPos = false;
             ::sw::mark::MarkBase* pMark = dynamic_cast< ::sw::mark::MarkBase* >(ppMark->get());
+            // is on position ??
+            bool bChangedPos = false;
             if(&pMark->GetMarkPos().nNode.GetNode() == pOldNode)
             {
                 pMark->SetMarkPos(aNewPos);
                 bChangedPos = true;
             }
+            bool bChangedOPos = false;
             if (pMark->IsExpanded() &&
                 &pMark->GetOtherMarkPos().nNode.GetNode() == pOldNode)
             {
@@ -513,23 +553,26 @@ namespace sw { namespace mark
             // illegal selection? collapse the mark and restore sorting later
             isSortingNeeded |= lcl_FixCorrectedMark(bChangedPos, bChangedOPos, pMark);
         }
+
         // restore sorting if needed
         if(isSortingNeeded)
             sortMarks();
 #if 0
         OSL_TRACE("correctMarksAbsolute");
-        lcl_DebugMarks(m_vMarks);
+        lcl_DebugMarks(m_vAllMarks);
 #endif
     }
 
+
     void MarkManager::correctMarksRelative(const SwNodeIndex& rOldNode, const SwPosition& rNewPos, const xub_StrLen nOffset)
     {
         const SwNode* const pOldNode = &rOldNode.GetNode();
         SwPosition aNewPos(rNewPos);
         aNewPos.nContent += nOffset;
         bool isSortingNeeded = false;
-        for(iterator_t ppMark = m_vMarks.begin();
-            ppMark != m_vMarks.end();
+
+        for(iterator_t ppMark = m_vAllMarks.begin();
+            ppMark != m_vAllMarks.end();
             ++ppMark)
         {
             // is on position ??
@@ -553,15 +596,17 @@ namespace sw { namespace mark
             // illegal selection? collapse the mark and restore sorting later
             isSortingNeeded |= lcl_FixCorrectedMark(bChangedPos, bChangedOPos, pMark);
         }
+
         // restore sorting if needed
         if(isSortingNeeded)
             sortMarks();
 #if 0
         OSL_TRACE("correctMarksRelative");
-        lcl_DebugMarks(m_vMarks);
+        lcl_DebugMarks(m_vAllMarks);
 #endif
     }
 
+
     void MarkManager::deleteMarks(
             const SwNodeIndex& rStt,
             const SwNodeIndex& rEnd,
@@ -571,10 +616,11 @@ namespace sw { namespace mark
     {
         vector<const_iterator_t> vMarksToDelete;
         bool isSortingNeeded = false;
-        // copy all bookmarks in the move area to a vector storing all position data as offsets
+
+        // copy all bookmarks in the move area to a vector storing all position data as offset
         // reassignment is performed after the move
-        for(iterator_t ppMark = m_vMarks.begin();
-            ppMark != m_vMarks.end();
+        for(iterator_t ppMark = m_vAllMarks.begin();
+            ppMark != m_vAllMarks.end();
             ++ppMark)
         {
             // navigator marks should not be moved
@@ -669,7 +715,7 @@ namespace sw { namespace mark
             vector< ::boost::shared_ptr<ILazyDeleter> > vDelay;
             vDelay.reserve(vMarksToDelete.size());
             // we just remembered the iterators to delete, so we do not need to
-            // search for the boost::shared_ptr<> (the entry in m_vMarks) again.
+            // search for the boost::shared_ptr<> (the entry in m_vAllMarks) again.
             // reverse iteration, since erasing an entry invalidates iterators
             // behind it (the iterators in vMarksToDelete are sorted)
             for (vector<const_iterator_t>::reverse_iterator pppMark
@@ -684,7 +730,7 @@ namespace sw { namespace mark
             sortMarks();
 #if 0
         OSL_TRACE("deleteMarks");
-        lcl_DebugMarks(m_vMarks);
+        lcl_DebugMarks(m_vAllMarks);
 #endif
     }
 
@@ -706,37 +752,56 @@ namespace sw { namespace mark
         MarkManager::deleteMark(const const_iterator_t ppMark)
     {
         ::boost::shared_ptr<ILazyDeleter> ret;
-        if (ppMark == m_vMarks.end()) return ret;
+        if (ppMark == m_vAllMarks.end()) return ret;
 
         switch(IDocumentMarkAccess::GetType(**ppMark))
         {
             case IDocumentMarkAccess::BOOKMARK:
             case IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK:
             case IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK:
-            // if(dynamic_cast<IBookmark*>)
-            {
-                IDocumentMarkAccess::iterator_t ppBookmark = lcl_FindMark(m_vBookmarks, *ppMark);
-                OSL_ENSURE(ppBookmark != m_vBookmarks.end(),
-                    "<MarkManager::deleteMark(..)>"
-                    " - Bookmark not found.");
-                m_vBookmarks.erase(ppBookmark);
+                // if(dynamic_cast<IBookmark*>)
+                {
+                    IDocumentMarkAccess::iterator_t ppBookmark = lcl_FindMark(m_vBookmarks, *ppMark);
+                    OSL_ENSURE(ppBookmark != m_vBookmarks.end(),
+                        "<MarkManager::deleteMark(..)>"
+                        " - Bookmark not found.");
+                    m_vBookmarks.erase(ppBookmark);
+
+                    ppBookmark = lcl_FindMark(m_vCommonMarks, *ppMark);
+                    m_vCommonMarks.erase(ppBookmark);
+                }
                 break;
-            }
+
             case IDocumentMarkAccess::TEXT_FIELDMARK:
             case IDocumentMarkAccess::CHECKBOX_FIELDMARK:
-            {
-                IDocumentMarkAccess::iterator_t ppFieldmark = lcl_FindMark(m_vFieldmarks, *ppMark);
-                OSL_ENSURE(ppFieldmark != m_vFieldmarks.end(),
-                    "<MarkManager::deleteMark(..)>"
-                    " - Bookmark not found.");
-                m_vFieldmarks.erase(ppFieldmark);
-                ret.reset(new LazyFieldmarkDeleter(*ppMark, m_pDoc));
+                {
+                    IDocumentMarkAccess::iterator_t ppFieldmark = lcl_FindMark(m_vFieldmarks, *ppMark);
+                    OSL_ENSURE(ppFieldmark != m_vFieldmarks.end(),
+                        "<MarkManager::deleteMark(..)>"
+                        " - Bookmark not found.");
+                    m_vFieldmarks.erase(ppFieldmark);
+                    ret.reset(new LazyFieldmarkDeleter(*ppMark, m_pDoc));
+
+                    ppFieldmark = lcl_FindMark(m_vCommonMarks, *ppMark);
+                    m_vCommonMarks.erase(ppFieldmark);
+                }
                 break;
-            }
+
+            case IDocumentMarkAccess::ANNOTATIONMARK:
+                {
+                    IDocumentMarkAccess::iterator_t ppAnnotationMark = lcl_FindMark(m_vAnnotationMarks, *ppMark);
+                    OSL_ENSURE( ppAnnotationMark != m_vAnnotationMarks.end(), "<MarkManager::deleteMark(..)> - Annotation Mark not found." );
+                    m_vAnnotationMarks.erase(ppAnnotationMark);
+                }
+                break;
+
             case IDocumentMarkAccess::NAVIGATOR_REMINDER:
             case IDocumentMarkAccess::DDE_BOOKMARK:
             case IDocumentMarkAccess::UNO_BOOKMARK:
-            // no special array for these
+                {
+                    IDocumentMarkAccess::iterator_t ppOtherMark = lcl_FindMark(m_vCommonMarks, *ppMark);
+                    m_vCommonMarks.erase(ppOtherMark);
+                }
                 break;
         }
         DdeBookmark* const pDdeBookmark = dynamic_cast<DdeBookmark*>(ppMark->get());
@@ -744,7 +809,7 @@ namespace sw { namespace mark
             pDdeBookmark->DeregisterFromDoc(m_pDoc);
         //Effective STL Item 27, get a non-const iterator aI at the same
         //position as const iterator ppMark was
-        iterator_t aI = m_vMarks.begin();
+        iterator_t aI = m_vAllMarks.begin();
         std::advance(aI, std::distance<const_iterator_t>(aI, ppMark));
 
         //fdo#37974
@@ -760,7 +825,7 @@ namespace sw { namespace mark
         //it anymore.
         pMark_t xHoldPastErase = *aI;
         m_aMarkNamesSet.erase(ppMark->get()->GetName());
-        m_vMarks.erase(aI);
+        m_vAllMarks.erase(aI);
         return ret;
     }
 
@@ -771,22 +836,18 @@ namespace sw { namespace mark
             " - Mark is not in my doc.");
         // finds the last Mark that is starting before pMark
         // (pMarkLow < pMark)
-        iterator_t pMarkLow = lower_bound(
-            m_vMarks.begin(), m_vMarks.end(),
-            pMark->GetMarkStart(),
-            sw::mark::CompareIMarkStartsBefore());
-        // finds the first Mark that pMark is starting before
-        // (pMark < pMarkHigh)
-        //iterator_t pMarkHigh = upper_bound(
-        //    pMarkLow, m_vMarks.end(),
-        //    pMark->GetMarkStart(),
-        //    bind(&IMark::StartsBefore, _2, _1));
-        // since it should be rare that pMark isnt found at all
-        // we skip the bisect search on the upper bound
-        iterator_t pMarkHigh = m_vMarks.end();
-        iterator_t pMarkFound = find_if(
-            pMarkLow, pMarkHigh,
-            boost::bind(equal_to<const IMark*>(), boost::bind(&boost::shared_ptr<IMark>::get, _1), pMark));
+        iterator_t pMarkLow =
+            lower_bound(
+                m_vAllMarks.begin(),
+                m_vAllMarks.end(),
+                pMark->GetMarkStart(),
+                bind(&IMark::StartsBefore, _1, _2) );
+        iterator_t pMarkHigh = m_vAllMarks.end();
+        iterator_t pMarkFound =
+            find_if(
+                pMarkLow,
+                pMarkHigh,
+                bind(equal_to<const IMark*>(), bind(&boost::shared_ptr<IMark>::get, _1), pMark) );
         if(pMarkFound != pMarkHigh)
             deleteMark(pMarkFound);
     }
@@ -796,20 +857,24 @@ namespace sw { namespace mark
         m_vFieldmarks.clear();
         m_vBookmarks.clear();
         m_aMarkNamesSet.clear();
+
+        m_vCommonMarks.clear();
+
+        m_vAnnotationMarks.clear();
+
 #if OSL_DEBUG_LEVEL > 0
-        for(iterator_t pBkmk = m_vMarks.begin();
-            pBkmk != m_vMarks.end();
+        for(iterator_t pBkmk = m_vAllMarks.begin();
+            pBkmk != m_vAllMarks.end();
             ++pBkmk)
-            OSL_ENSURE(pBkmk->unique(),
-                "<MarkManager::clearAllMarks(..)>"
-                " - a Bookmark is still in use.");
+            OSL_ENSURE( pBkmk->unique(),
+                        "<MarkManager::clearAllMarks(..)> - a Bookmark is still in use.");
 #endif
-        m_vMarks.clear();
+        m_vAllMarks.clear();
     }
 
     IDocumentMarkAccess::const_iterator_t MarkManager::findMark(const OUString& rName) const
     {
-        return lcl_FindMarkByName(rName, m_vMarks.begin(), m_vMarks.end());
+        return lcl_FindMarkByName(rName, m_vAllMarks.begin(), m_vAllMarks.end());
     }
 
     IDocumentMarkAccess::const_iterator_t MarkManager::findBookmark(const OUString& rName) const
@@ -817,14 +882,14 @@ namespace sw { namespace mark
         return lcl_FindMarkByName(rName, m_vBookmarks.begin(), m_vBookmarks.end());
     }
 
-    IDocumentMarkAccess::const_iterator_t MarkManager::getMarksBegin() const
-        { return m_vMarks.begin(); }
+    IDocumentMarkAccess::const_iterator_t MarkManager::getAllMarksBegin() const
+        { return m_vAllMarks.begin(); }
 
-    IDocumentMarkAccess::const_iterator_t MarkManager::getMarksEnd() const
-        { return m_vMarks.end(); }
+    IDocumentMarkAccess::const_iterator_t MarkManager::getAllMarksEnd() const
+        { return m_vAllMarks.end(); }
 
-    sal_Int32 MarkManager::getMarksCount() const
-        { return m_vMarks.size(); }
+    sal_Int32 MarkManager::getAllMarksCount() const
+        { return m_vAllMarks.size(); }
 
     IDocumentMarkAccess::const_iterator_t MarkManager::getBookmarksBegin() const
         { return m_vBookmarks.begin(); }
@@ -851,13 +916,50 @@ namespace sw { namespace mark
     IFieldmark* MarkManager::getFieldmarkBefore(const SwPosition& rPos) const
         { return dynamic_cast<IFieldmark*>(lcl_getMarkBefore(m_vFieldmarks, rPos)); }
 
+    IDocumentMarkAccess::const_iterator_t MarkManager::getCommonMarksBegin() const
+    {
+        return m_vCommonMarks.begin();
+    }
+
+    IDocumentMarkAccess::const_iterator_t MarkManager::getCommonMarksEnd() const
+    {
+        return m_vCommonMarks.end();
+    }
+
+    sal_Int32 MarkManager::getCommonMarksCount() const
+    {
+        return m_vCommonMarks.size();
+    }
+
+
+    IDocumentMarkAccess::const_iterator_t MarkManager::getAnnotationMarksBegin() const
+    {
+        return m_vAnnotationMarks.begin();
+    }
+
+    IDocumentMarkAccess::const_iterator_t MarkManager::getAnnotationMarksEnd() const
+    {
+        return m_vAnnotationMarks.end();
+    }
+
+    sal_Int32 MarkManager::getAnnotationMarksCount() const
+    {
+        return m_vAnnotationMarks.size();
+    }
+
+    IDocumentMarkAccess::const_iterator_t MarkManager::findAnnotationMark( const ::rtl::OUString& rName ) const
+    {
+        return lcl_FindMarkByName( rName, m_vAnnotationMarks.begin(), m_vAnnotationMarks.end() );
+    }
 
     OUString MarkManager::getUniqueMarkName(const OUString& rName) const
     {
-        OSL_ENSURE(!rName.isEmpty(),
-            "<MarkManager::getUniqueMarkName(..)>"
-            " - a name should be proposed");
-        if(!hasMark(rName)) return rName;
+        OSL_ENSURE(rName.getLength(),
+            "<MarkManager::getUniqueMarkName(..)> - a name should be proposed");
+        if ( findMark(rName) == getAllMarksEnd() )
+        {
+            return rName;
+        }
         OUStringBuffer sBuf;
         OUString sTmp;
 
@@ -872,7 +974,10 @@ namespace sw { namespace mark
         {
             sTmp = sBuf.append(rName).append(nCnt).makeStringAndClear();
             nCnt++;
-            if(!hasMark(sTmp)) break;
+            if ( findMark(sTmp) == getAllMarksEnd() )
+            {
+                break;
+            }
         }
         m_aMarkBasenameMapUniqueOffset[rName] = nCnt;
 
@@ -881,11 +986,26 @@ namespace sw { namespace mark
 
     void MarkManager::sortMarks()
     {
-        sort(m_vMarks.begin(), m_vMarks.end(), &lcl_MarkOrderingByStart);
+        sort(m_vAllMarks.begin(), m_vAllMarks.end(), &lcl_MarkOrderingByStart);
+        sort(m_vCommonMarks.begin(), m_vCommonMarks.end(), &lcl_MarkOrderingByStart);
         sort(m_vBookmarks.begin(), m_vBookmarks.end(), &lcl_MarkOrderingByStart);
         sort(m_vFieldmarks.begin(), m_vFieldmarks.end(), &lcl_MarkOrderingByStart);
+        sort(m_vAnnotationMarks.begin(), m_vAnnotationMarks.end(), &lcl_MarkOrderingByStart);
     }
 
+#if OSL_DEBUG_LEVEL > 1
+    void MarkManager::dumpFieldmarks( ) const
+    {
+        const_iterator_t pIt = m_vFieldmarks.begin();
+        for (; pIt != m_vFieldmarks.end( ); pIt++)
+        {
+            rtl::OUString str = (*pIt)->ToString();
+            OSL_TRACE("%s\n",
+                ::rtl::OUStringToOString(str, RTL_TEXTENCODING_UTF8).getStr());
+        }
+    }
+#endif
+
     bool MarkManager::hasMark(const OUString& rName) const
     {
         return (m_aMarkNamesSet.find(rName) != m_aMarkNamesSet.end());
@@ -1248,41 +1368,36 @@ void _SaveCntntIdx(SwDoc* pDoc,
     aSave.SetTypeAndCount( 0x8000, 0 );
 
     IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess();
-    const sal_Int32 nBkmks = pMarkAccess->getMarksCount();
-    for(; aSave.GetCount() < nBkmks; aSave.IncCount())
+    const sal_Int32 nMarksCount = pMarkAccess->getAllMarksCount();
+    for ( ; aSave.GetCount() < nMarksCount; aSave.IncCount() )
     {
-        bool bEqual = false;
-        bool bLower = false;
-        const ::sw::mark::IMark* pBkmk = (pMarkAccess->getMarksBegin() + aSave.GetCount())->get();
+        bool bMarkPosEqual = false;
+        const ::sw::mark::IMark* pBkmk = (pMarkAccess->getAllMarksBegin() + aSave.GetCount())->get();
         if(pBkmk->GetMarkPos().nNode.GetIndex() == nNode
             && pBkmk->GetMarkPos().nContent.GetIndex() <= nCntnt)
         {
             if(pBkmk->GetMarkPos().nContent.GetIndex() < nCntnt)
             {
-                bLower = true; // a hint for the other position...
                 aSave.SetContent(pBkmk->GetMarkPos().nContent.GetIndex());
                 aSave.Add(rSaveArr);
             }
             else // if a bookmark position is equal nCntnt, the other position
-                bEqual = true; // has to decide if it is added to the array
+                bMarkPosEqual = true; // has to decide if it is added to the array
         }
 
         if(pBkmk->IsExpanded()
             && pBkmk->GetOtherMarkPos().nNode.GetIndex() == nNode
             && pBkmk->GetOtherMarkPos().nContent.GetIndex() <= nCntnt)
         {
-            if(bLower || pBkmk->GetOtherMarkPos().nContent.GetIndex() < nCntnt)
-            {
-                if(bEqual)
-                { // the other position is before, the (main) position is equal
-                    aSave.SetContent(pBkmk->GetMarkPos().nContent.GetIndex());
-                    aSave.Add(rSaveArr);
-                }
-                aSave.SetContent(pBkmk->GetOtherMarkPos().nContent.GetIndex());
-                aSave.IncType();
+            if(bMarkPosEqual)
+            { // the other position is before, the (main) position is equal
+                aSave.SetContent(pBkmk->GetMarkPos().nContent.GetIndex());
                 aSave.Add(rSaveArr);
-                aSave.DecType();
             }
+            aSave.SetContent(pBkmk->GetOtherMarkPos().nContent.GetIndex());
+            aSave.IncType();
+            aSave.Add(rSaveArr);
+            aSave.DecType();
         }
     }
 
@@ -1474,7 +1589,7 @@ void _RestoreCntntIdx(SwDoc* pDoc,
         {
             case 0x8000:
             {
-                MarkBase* pMark = dynamic_cast<MarkBase*>(pMarkAccess->getMarksBegin()[aSave.GetCount()].get());
+                MarkBase* pMark = dynamic_cast<MarkBase*>(pMarkAccess->getAllMarksBegin()[aSave.GetCount()].get());
                 SwPosition aNewPos(pMark->GetMarkPos());
                 aNewPos.nNode = *pCNd;
                 aNewPos.nContent.Assign(pCNd, aSave.GetContent() + nOffset);
@@ -1483,7 +1598,7 @@ void _RestoreCntntIdx(SwDoc* pDoc,
             break;
             case 0x8001:
             {
-                MarkBase* pMark = dynamic_cast<MarkBase*>(pMarkAccess->getMarksBegin()[aSave.GetCount()].get());
+                MarkBase* pMark = dynamic_cast<MarkBase*>(pMarkAccess->getAllMarksBegin()[aSave.GetCount()].get());
                 SwPosition aNewPos(pMark->GetOtherMarkPos());
                 aNewPos.nNode = *pCNd;
                 aNewPos.nContent.Assign(pCNd, aSave.GetContent() + nOffset);
@@ -1642,7 +1757,7 @@ void _RestoreCntntIdx(std::vector<sal_uLong> &rSaveArr,
             {
             case 0x8000:
             {
-                MarkBase* pMark = dynamic_cast<MarkBase*>(pMarkAccess->getMarksBegin()[aSave.GetCount()].get());
+                MarkBase* pMark = dynamic_cast<MarkBase*>(pMarkAccess->getAllMarksBegin()[aSave.GetCount()].get());
                 SwPosition aNewPos(pMark->GetMarkPos());
                 aNewPos.nNode = rNd;
                 aNewPos.nContent.Assign(pCNd, std::min(aSave.GetContent(), nLen));
@@ -1651,7 +1766,7 @@ void _RestoreCntntIdx(std::vector<sal_uLong> &rSaveArr,
             break;
             case 0x8001:
             {
-                MarkBase* pMark = dynamic_cast<MarkBase*>(pMarkAccess->getMarksBegin()[aSave.GetCount()].get());
+                MarkBase* pMark = dynamic_cast<MarkBase*>(pMarkAccess->getAllMarksBegin()[aSave.GetCount()].get());
                 SwPosition aNewPos(pMark->GetOtherMarkPos());
                 aNewPos.nNode = rNd;
                 aNewPos.nContent.Assign(pCNd, std::min(aSave.GetContent(), nLen));
diff --git a/sw/source/core/doc/doccomp.cxx b/sw/source/core/doc/doccomp.cxx
index aaefd2a..0ae219b 100644
--- a/sw/source/core/doc/doccomp.cxx
+++ b/sw/source/core/doc/doccomp.cxx
@@ -1506,8 +1506,11 @@ void SwCompareData::ShowInsert( sal_uLong nStt, sal_uLong nEnd )
     // #i65201#: These SwPaMs are calculated smaller than needed, see comment below
 }
 
-void SwCompareData::ShowDelete( const CompareData& rData, sal_uLong nStt,
-                                sal_uLong nEnd, sal_uLong nInsPos )
+void SwCompareData::ShowDelete(
+    const CompareData& rData,
+    sal_uLong nStt,
+    sal_uLong nEnd,
+    sal_uLong nInsPos )
 {
     SwNodeRange aRg(
         ((SwCompareLine*)rData.GetLine( nStt ))->GetNode(), 0,
diff --git a/sw/source/core/doc/doccorr.cxx b/sw/source/core/doc/doccorr.cxx
index 07984d9..cd6065f 100644
--- a/sw/source/core/doc/doccorr.cxx
+++ b/sw/source/core/doc/doccorr.cxx
@@ -186,7 +186,8 @@ void SwDoc::CorrAbs(const SwNodeIndex& rOldNode,
     aNewPos.nContent += nOffset;
 
     getIDocumentMarkAccess()->correctMarksAbsolute(rOldNode, rNewPos, nOffset);
-    {   // fix redlines
+    // fix redlines
+    {
         SwRedlineTbl& rTbl = *mpRedlineTbl;
         for (sal_uInt16 n = 0; n < rTbl.size(); )
         {
diff --git a/sw/source/core/doc/docdde.cxx b/sw/source/core/doc/docdde.cxx
index 9448009..ba16cdc 100644
--- a/sw/source/core/doc/docdde.cxx
+++ b/sw/source/core/doc/docdde.cxx
@@ -42,16 +42,21 @@ using namespace ::com::sun::star;
 
 namespace
 {
-    static ::sw::mark::DdeBookmark* lcl_FindDdeBookmark(const IDocumentMarkAccess& rMarkAccess, const OUString& rName, bool bCaseSensitive)
+
+    static ::sw::mark::DdeBookmark* lcl_FindDdeBookmark(
+        const IDocumentMarkAccess& rMarkAccess,
+        const OUString& rName,
+        const bool bCaseSensitive )
     {
         //Iterating over all bookmarks, checking DdeBookmarks
         const OUString sNameLc = bCaseSensitive ? rName : GetAppCharClass().lowercase(rName);
-        for(IDocumentMarkAccess::const_iterator_t ppMark = rMarkAccess.getMarksBegin();
-            ppMark != rMarkAccess.getMarksEnd();
+        for(IDocumentMarkAccess::const_iterator_t ppMark = rMarkAccess.getCommonMarksBegin();
+            ppMark != rMarkAccess.getCommonMarksEnd();
             ++ppMark)
         {
-            if (::sw::mark::DdeBookmark* const pBkmk = dynamic_cast< ::sw::mark::DdeBookmark*>(ppMark->get()))
+            if ( IDocumentMarkAccess::GetType( *(ppMark->get()) ) == IDocumentMarkAccess::DDE_BOOKMARK)
             {
+                ::sw::mark::DdeBookmark* const pBkmk = dynamic_cast< ::sw::mark::DdeBookmark*>(ppMark->get());
                 if (
                     (bCaseSensitive && (pBkmk->GetName() == sNameLc)) ||
                     (!bCaseSensitive && GetAppCharClass().lowercase(pBkmk->GetName()) == sNameLc)
diff --git a/sw/source/core/doc/docedt.cxx b/sw/source/core/doc/docedt.cxx
index 18f80ba..e36d9d8 100644
--- a/sw/source/core/doc/docedt.cxx
+++ b/sw/source/core/doc/docedt.cxx
@@ -1609,25 +1609,6 @@ bool SwDoc::DeleteRangeImplImpl(SwPaM & rPam)
         }
     }
 
-    // Delete fieldmarks before postits, but let's leave them alone during import.
-    if (GetIDocumentUndoRedo().DoesUndo() && pStt->nNode == pEnd->nNode && (pEnd->nContent.GetIndex() - pStt->nContent.GetIndex()) == 1)
-    {
-        SwTxtNode* pTxtNd = rPam.Start()->nNode.GetNode().GetTxtNode();
-        const sal_Int32 nIndex = rPam.Start()->nContent.GetIndex();
-        // We may have a postit here.
-        if (pTxtNd->GetTxt()[nIndex] == CH_TXTATR_INWORD)
-        {
-            SwTxtAttr* pTxtAttr = pTxtNd->GetTxtAttrForCharAt(nIndex, RES_TXTATR_FIELD);
-            if (pTxtAttr && pTxtAttr->GetFmtFld().GetField()->Which() == RES_POSTITFLD)
-            {
-                const SwPostItField* pField = dynamic_cast<const SwPostItField*>(pTxtAttr->GetFmtFld().GetField());
-                IDocumentMarkAccess::const_iterator_t ppMark = getIDocumentMarkAccess()->findMark(pField->GetName());
-                if (ppMark != getIDocumentMarkAccess()->getMarksEnd())
-                    getIDocumentMarkAccess()->deleteMark(ppMark);
-            }
-        }
-    }
-
     {
         // Send DataChanged before deletion, so that we still know
         // which objects are in the range.
diff --git a/sw/source/core/doc/docfld.cxx b/sw/source/core/doc/docfld.cxx
index c630109..26afbb3 100644
--- a/sw/source/core/doc/docfld.cxx
+++ b/sw/source/core/doc/docfld.cxx
@@ -251,11 +251,11 @@ const SwFldTypes* SwDoc::GetFldTypes() const
 }
 
 /// Find first type with ResId and name
-SwFieldType* SwDoc::GetFldType( sal_uInt16 nResId, const OUString& rName,
-         bool bDbFieldMatching // used in some UNO calls for RES_DBFLD
-                                   // to use different string matching code
-                                   // #i51815#
-         ) const
+SwFieldType* SwDoc::GetFldType(
+    sal_uInt16 nResId,
+    const OUString& rName,
+    bool bDbFieldMatching // used in some UNO calls for RES_DBFLD to use different string matching code #i51815#
+    ) const
 {
     sal_uInt16 nSize = mpFldTypes->size(), i = 0;
     const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore();
@@ -2116,7 +2116,7 @@ bool SwDoc::SetFieldsDirty( bool b, const SwNode* pChk, sal_uLong nLen )
                             n < nEnd; ++n )
                     {
                         const SwTxtAttr* pAttr = pTNd->GetSwpHints()[ n ];
-                        if( RES_TXTATR_FIELD == pAttr->Which() )
+                        if ( pAttr->Which() == RES_TXTATR_FIELD )
                         {
                             b = true;
                             break;
diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx
index 561cb0f..2a09e59 100644
--- a/sw/source/core/doc/docfmt.cxx
+++ b/sw/source/core/doc/docfmt.cxx
@@ -665,7 +665,7 @@ static bool lcl_InsAttr(
                                 : pNode->Len();
                 SwRegHistory history( pNode, *pNode, pHistory );
                 bRet = history.InsertItems( aTxtSet, nInsCnt, nEnd, nFlags )
-                    || bRet;
+                       || bRet;
 
                 if (bRet && (pDoc->IsRedlineOn() || (!pDoc->IsIgnoreRedline()
                                 && !pDoc->GetRedlineTbl().empty())))
@@ -679,8 +679,10 @@ static bool lcl_InsAttr(
                         pUndo->SaveRedlineData( aPam, bTxtIns );
 
                     if( pDoc->IsRedlineOn() )
-                        pDoc->AppendRedline( new SwRedline( bTxtIns
-                                ? nsRedlineType_t::REDLINE_INSERT : nsRedlineType_t::REDLINE_FORMAT, aPam ), true);
+                        pDoc->AppendRedline(
+                            new SwRedline(
+                                bTxtIns ? nsRedlineType_t::REDLINE_INSERT : nsRedlineType_t::REDLINE_FORMAT, aPam ),
+                                true);
                     else if( bTxtIns )
                         pDoc->SplitRedline( aPam );
                 }
diff --git a/sw/source/core/doc/doclay.cxx b/sw/source/core/doc/doclay.cxx
index 2ea2fb9..61b5ed5 100644
--- a/sw/source/core/doc/doclay.cxx
+++ b/sw/source/core/doc/doclay.cxx
@@ -329,9 +329,11 @@ void SwDoc::DelLayoutFmt( SwFrmFmt *pFmt )
     If the source format is located in another document, also copy correctly
     in this case.
     The Anchor attribute's position is always set to 0! */
-SwFrmFmt *SwDoc::CopyLayoutFmt( const SwFrmFmt& rSource,
-                                const SwFmtAnchor& rNewAnchor,
-                                bool bSetTxtFlyAtt, bool bMakeFrms )
+SwFrmFmt *SwDoc::CopyLayoutFmt(
+    const SwFrmFmt& rSource,
+    const SwFmtAnchor& rNewAnchor,
+    bool bSetTxtFlyAtt,
+    bool bMakeFrms )
 {
     const bool bFly = RES_FLYFRMFMT == rSource.Which();
     const bool bDraw = RES_DRAWFRMFMT == rSource.Which();
@@ -441,7 +443,7 @@ SwFrmFmt *SwDoc::CopyLayoutFmt( const SwFrmFmt& rSource,
         //contact object itself. They should be managed by SwUndoInsLayFmt.
         const ::sw::DrawUndoGuard drawUndoGuard(GetIDocumentUndoRedo());
 
-        pSrcDoc->CopyWithFlyInFly( aRg, 0, aIdx, sal_False, sal_True, sal_True );
+        pSrcDoc->CopyWithFlyInFly( aRg, 0, aIdx, NULL, sal_False, sal_True, sal_True );
     }
     else
     {
diff --git a/sw/source/core/doc/tblcpy.cxx b/sw/source/core/doc/tblcpy.cxx
index 0ca5838..07f68c6 100644
--- a/sw/source/core/doc/tblcpy.cxx
+++ b/sw/source/core/doc/tblcpy.cxx
@@ -532,7 +532,7 @@ static void lcl_CpyBox( const SwTable& rCpyTbl, const SwTableBox* pCpyBox,
 
     SwNodeIndex aSavePos( aInsIdx, -1 );
     if( pRg.get() )
-        pCpyDoc->CopyWithFlyInFly( *pRg, 0, aInsIdx, sal_False );
+        pCpyDoc->CopyWithFlyInFly( *pRg, 0, aInsIdx, NULL, sal_False );
     else
         pDoc->GetNodes().MakeTxtNode( aInsIdx, (SwTxtFmtColl*)pDoc->GetDfltTxtFmtColl() );
     ++aSavePos;
diff --git a/sw/source/core/doc/tblrwcl.cxx b/sw/source/core/doc/tblrwcl.cxx
index 96bf52e..d9d8df7 100644
--- a/sw/source/core/doc/tblrwcl.cxx
+++ b/sw/source/core/doc/tblrwcl.cxx
@@ -1991,7 +1991,7 @@ static void lcl_CopyBoxToDoc(_FndBox const& rFndBox, _CpyPara *const pCpyPara)
                         *rFndBox.GetBox()->GetSttNd()->EndOfSectionNode() );
                 SwNodeIndex aInsIdx( *pBox->GetSttNd(), 1 );
 
-                pFromDoc->CopyWithFlyInFly( aCpyRg, 0, aInsIdx, sal_False );
+                pFromDoc->CopyWithFlyInFly( aCpyRg, 0, aInsIdx, NULL, sal_False );
                 // Delete the initial TextNode
                 pCpyPara->pDoc->GetNodes().Delete( aInsIdx, 1 );
             }
diff --git a/sw/source/core/docnode/ndcopy.cxx b/sw/source/core/docnode/ndcopy.cxx
index b08e4b5..c9f6770 100644
--- a/sw/source/core/docnode/ndcopy.cxx
+++ b/sw/source/core/docnode/ndcopy.cxx
@@ -123,7 +123,9 @@ namespace
     }
 
     // TODO: use SaveBookmark (from _DelBookmarks)
-    static void lcl_CopyBookmarks(const SwPaM& rPam, SwPaM& rCpyPam)
+    static void lcl_CopyBookmarks(
+        const SwPaM& rPam,
+        SwPaM& rCpyPam )
     {
         const SwDoc* pSrcDoc = rPam.GetDoc();
         SwDoc* pDestDoc =  rCpyPam.GetDoc();
@@ -135,19 +137,23 @@ namespace
 
         typedef ::std::vector< const ::sw::mark::IMark* > mark_vector_t;
         mark_vector_t vMarksToCopy;
-        for(IDocumentMarkAccess::const_iterator_t ppMark = pSrcMarkAccess->getMarksBegin();
-            ppMark != pSrcMarkAccess->getMarksEnd();
-            ++ppMark)
+        for ( IDocumentMarkAccess::const_iterator_t ppMark = pSrcMarkAccess->getAllMarksBegin();
+              ppMark != pSrcMarkAccess->getAllMarksEnd();
+              ++ppMark )
         {
             const ::sw::mark::IMark* const pMark = ppMark->get();
+
             const SwPosition& rMarkStart = pMark->GetMarkStart();
             const SwPosition& rMarkEnd = pMark->GetMarkEnd();
-            // only include marks that are in the range and not touching
-            // both start and end
-            bool bIsNotOnBoundary = pMark->IsExpanded()
+            // only include marks that are in the range and not touching both start and end
+            // - not for annotation marks.
+            const bool bIsNotOnBoundary =
+                pMark->IsExpanded()
                 ? (rMarkStart != rStt || rMarkEnd != rEnd)  // rMarkStart != rMarkEnd
                 : (rMarkStart != rStt && rMarkEnd != rEnd); // rMarkStart == rMarkEnd
-            if(rMarkStart >= rStt && rMarkEnd <= rEnd && bIsNotOnBoundary)
+            if ( rMarkStart >= rStt && rMarkEnd <= rEnd
+                 && ( bIsNotOnBoundary
+                      || IDocumentMarkAccess::GetType( *pMark ) == IDocumentMarkAccess::ANNOTATIONMARK ) )
             {
                 vMarksToCopy.push_back(pMark);
             }
@@ -1224,13 +1230,13 @@ bool SwDoc::CopyImpl( SwPaM& rPam, SwPosition& rPos,
             if( aInsPos == pEnd->nNode )
             {
                 SwNodeIndex aSaveIdx( aInsPos, -1 );
-                CopyWithFlyInFly( aRg, 0,aInsPos, bMakeNewFrms, sal_False );
+                CopyWithFlyInFly( aRg, 0,aInsPos, &rPam, bMakeNewFrms, sal_False );
                 ++aSaveIdx;
                 pEnd->nNode = aSaveIdx;
                 pEnd->nContent.Assign( aSaveIdx.GetNode().GetTxtNode(), 0 );
             }
             else
-                CopyWithFlyInFly( aRg, pEnd->nContent.GetIndex(), aInsPos, bMakeNewFrms, sal_False );
+                CopyWithFlyInFly( aRg, pEnd->nContent.GetIndex(), aInsPos, &rPam, bMakeNewFrms, sal_False );
 
             bCopyBookmarks = false;
 
@@ -1273,7 +1279,7 @@ bool SwDoc::CopyImpl( SwPaM& rPam, SwPosition& rPos,
     pCopyPam->Exchange();
 
     // Also copy all bookmarks
-    if( bCopyBookmarks && getIDocumentMarkAccess()->getMarksCount() )
+    if( bCopyBookmarks && getIDocumentMarkAccess()->getAllMarksCount() )
         lcl_CopyBookmarks( rPam, *pCopyPam );
 
     if( nsRedlineMode_t::REDLINE_DELETE_REDLINES & eOld )
@@ -1312,9 +1318,14 @@ bool SwDoc::CopyImpl( SwPaM& rPam, SwPosition& rPos,
 }
 
 // Copy method from SwDoc - "copy Flys in Flys"
-void SwDoc::CopyWithFlyInFly( const SwNodeRange& rRg, const sal_Int32 nEndContentIndex,
-                            const SwNodeIndex& rInsPos, sal_Bool bMakeNewFrms,
-                            sal_Bool bDelRedlines, sal_Bool bCopyFlyAtFly ) const
+void SwDoc::CopyWithFlyInFly(
+    const SwNodeRange& rRg,
+    const sal_Int32 nEndContentIndex,
+    const SwNodeIndex& rInsPos,
+    const SwPaM* pCopiedPaM,
+    const sal_Bool bMakeNewFrms,
+    const sal_Bool bDelRedlines,
+    const sal_Bool bCopyFlyAtFly ) const
 {
     SwDoc* pDest = rInsPos.GetNode().GetDoc();
 
@@ -1356,12 +1367,14 @@ void SwDoc::CopyWithFlyInFly( const SwNodeRange& rRg, const sal_Int32 nEndConten
     SwNodeRange aCpyRange( aSavePos, rInsPos );
 
     // Also copy all bookmarks
-    if( getIDocumentMarkAccess()->getMarksCount() )
+    if( getIDocumentMarkAccess()->getAllMarksCount() )
     {
         SwPaM aRgTmp( rRg.aStart, rRg.aEnd );
         SwPaM aCpyTmp( aCpyRange.aStart, aCpyRange.aEnd );
 
-        lcl_CopyBookmarks( aRgTmp, aCpyTmp );
+        lcl_CopyBookmarks(
+            pCopiedPaM != NULL ? *pCopiedPaM : aRgTmp,
+            aCpyTmp );
     }
 
     if( bDelRedlines && ( nsRedlineMode_t::REDLINE_DELETE_REDLINES & pDest->GetRedlineMode() ))
@@ -1386,9 +1399,11 @@ static void lcl_ChainFmts( SwFlyFrmFmt *pSrc, SwFlyFrmFmt *pDest )
     }
 }
 
-void SwDoc::CopyFlyInFlyImpl( const SwNodeRange& rRg,
-        const sal_Int32 nEndContentIndex, const SwNodeIndex& rStartIdx,
-        const bool bCopyFlyAtFly ) const
+void SwDoc::CopyFlyInFlyImpl(
+    const SwNodeRange& rRg,
+    const sal_Int32 nEndContentIndex,
+    const SwNodeIndex& rStartIdx,
+    const bool bCopyFlyAtFly ) const
 {
     // First collect all Flys, sort them according to their ordering number,
     // and then only copy them. This maintains the ordering numbers (which are only
diff --git a/sw/source/core/docnode/nodes.cxx b/sw/source/core/docnode/nodes.cxx
index e30bb8e..138dac6 100644
--- a/sw/source/core/docnode/nodes.cxx
+++ b/sw/source/core/docnode/nodes.cxx
@@ -264,6 +264,7 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz,
                             switch ( pAttr->Which() )
                             {
                             case RES_TXTATR_FIELD:
+                            case RES_TXTATR_ANNOTATION:
                             case RES_TXTATR_INPUTFIELD:
                                 {
                                     SwTxtFld* pTxtFld = static_cast<SwTxtFld*>(pAttr);
@@ -289,6 +290,7 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz,
                                     nDelMsg = RES_FIELD_DELETED;
                                 }
                                 break;
+
                             case RES_TXTATR_FTN:
                                 nDelMsg = RES_FOOTNOTE_DELETED;
                                 break;
@@ -316,19 +318,20 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz,
                             default:
                                 break;
                             }
+
                             if( nDelMsg && bToUndo )
                             {
                                 SwPtrMsgPoolItem aMsgHint( nDelMsg,
-                                                    (void*)&pAttr->GetAttr() );
+                                    (void*)&pAttr->GetAttr() );
                                 rNds.GetDoc()->GetUnoCallBack()->
-                                            ModifyNotification( &aMsgHint, &aMsgHint );
+                                    ModifyNotification( &aMsgHint, &aMsgHint );
                             }
                         }
                     }
-//FEATURE::CONDCOLL
+                    //FEATURE::CONDCOLL
                     if( RES_CONDTXTFMTCOLL == pTxtNd->GetTxtColl()->Which() )
                         pTxtNd->ChkCondColl();
-//FEATURE::CONDCOLL
+                    //FEATURE::CONDCOLL
                 }
                 else
                 {
diff --git a/sw/source/core/docnode/section.cxx b/sw/source/core/docnode/section.cxx
index 79839c6..d30670c 100644
--- a/sw/source/core/docnode/section.cxx
+++ b/sw/source/core/docnode/section.cxx
@@ -1357,7 +1357,7 @@ static void lcl_UpdateLinksInSect( SwBaseLink& rUpdLnk, SwSectionNode& rSectNd )
 
                     SwTblNumFmtMerge aTNFM( *pSrcDoc, *pDoc );
 
-                    pSrcDoc->CopyWithFlyInFly( *pCpyRg, 0, rInsPos, bCreateFrm );
+                    pSrcDoc->CopyWithFlyInFly( *pCpyRg, 0, rInsPos, NULL, bCreateFrm );
                     ++aSave;
 
                     if( !bCreateFrm )
diff --git a/sw/source/core/edit/edfld.cxx b/sw/source/core/edit/edfld.cxx
index 1e394d7..d1050a3 100644
--- a/sw/source/core/edit/edfld.cxx
+++ b/sw/source/core/edit/edfld.cxx
@@ -277,6 +277,7 @@ void SwEditShell::UpdateFlds( SwField &rFld )
         sal_Bool bTblSelBreak = sal_False;
 
         SwMsgPoolItem aFldHint( RES_TXTATR_FIELD );  // Search-Hint
+        SwMsgPoolItem aAnnotationFldHint( RES_TXTATR_ANNOTATION );
         SwMsgPoolItem aInputFldHint( RES_TXTATR_INPUTFIELD );
         FOREACHPAM_START(GetCrsr())               // for each PaM
             if( PCURCRSR->HasMark() && bOkay )    // ... with selection
@@ -297,6 +298,7 @@ void SwEditShell::UpdateFlds( SwField &rFld )
                 while(  bOkay
                      && pCurStt->nContent != pCurEnd->nContent
                      && ( aPam.Find( aFldHint, sal_False, fnMoveForward, &aCurPam )
+                          || aPam.Find( aAnnotationFldHint, sal_False, fnMoveForward, &aCurPam )
                           || aPam.Find( aInputFldHint, sal_False, fnMoveForward, &aCurPam ) ) )
                 {
                     // if only one PaM has more than one field  ...
diff --git a/sw/source/core/edit/edlingu.cxx b/sw/source/core/edit/edlingu.cxx
index c9f9b56..6e34146 100644
--- a/sw/source/core/edit/edlingu.cxx
+++ b/sw/source/core/edit/edlingu.cxx
@@ -1655,6 +1655,7 @@ void    SwSpellIter::AddPortion(uno::Reference< XSpellAlternatives > xAlt,
                     switch (nWhich)
                     {
                         case RES_TXTATR_FIELD:
+                        case RES_TXTATR_ANNOTATION:
                         case RES_TXTATR_FTN:
                         case RES_TXTATR_FLYCNT:
                             bField = true;
diff --git a/sw/source/core/fields/docufld.cxx b/sw/source/core/fields/docufld.cxx
index 6b12b7f..6ecc0fc 100644
--- a/sw/source/core/fields/docufld.cxx
+++ b/sw/source/core/fields/docufld.cxx
@@ -1654,7 +1654,8 @@ OUString SwHiddenParaField::GetPar1() const
 // PostIt field type
 
 SwPostItFieldType::SwPostItFieldType(SwDoc *pDoc)
-    : SwFieldType( RES_POSTITFLD ),mpDoc(pDoc)
+    : SwFieldType( RES_POSTITFLD )
+    , mpDoc(pDoc)
 {}
 
 SwFieldType* SwPostItFieldType::Copy() const
@@ -1676,14 +1677,14 @@ SwPostItField::SwPostItField( SwPostItFieldType* pT,
     , sInitials( rInitials )
     , sName( rName )
     , aDateTime( rDateTime )
-    , mpText(0)
-    , m_pTextObject(0)
+    , mpText( NULL )
+    , m_pTextObject( NULL )
 {
 }
 
 SwPostItField::~SwPostItField()
 {
-    if ( m_pTextObject )
+    if ( m_pTextObject != NULL )
     {
         m_pTextObject->DisposeEditSource();
         m_pTextObject->release();
@@ -1731,6 +1732,9 @@ SwField* SwPostItField::Copy() const
                                 aDateTime);
     if (mpText)
         pRet->SetTextObject( new OutlinerParaObject(*mpText) );
+
+    // Note: member <m_pTextObject> not copied.
+
     return pRet;
 }
 
diff --git a/sw/source/core/fields/postithelper.cxx b/sw/source/core/fields/postithelper.cxx
index 7d9b83e..73d163a 100644
--- a/sw/source/core/fields/postithelper.cxx
+++ b/sw/source/core/fields/postithelper.cxx
@@ -75,62 +75,66 @@ struct LayoutInfoOrder
 
 } // eof anonymous namespace
 
-SwPostItHelper::SwLayoutStatus SwPostItHelper::getLayoutInfos( std::vector< SwLayoutInfo >& rInfo, SwPosition& rPos )
+SwPostItHelper::SwLayoutStatus SwPostItHelper::getLayoutInfos(
+    SwLayoutInfo& o_rInfo,
+    const SwPosition& rAnchorPos,
+    const SwPosition* pAnnotationStartPos )
 {
     SwLayoutStatus aRet = INVISIBLE;
-    const SwTxtNode* pTxtNode = rPos.nNode.GetNode().GetTxtNode();
-    SwCntntNode* pNode = rPos.nNode.GetNode().GetCntntNode();   // getfirstcontentnode // getnext...
-    if( !pNode )
+    SwTxtNode* pTxtNode = rAnchorPos.nNode.GetNode().GetTxtNode();
+    if ( pTxtNode == NULL )
         return aRet;
-    SwIterator<SwTxtFrm,SwCntntNode> aIter( *pNode );
-    for( SwTxtFrm* pTxtFrm = aIter.First(); pTxtFrm; pTxtFrm = aIter.Next() )
+
+    SwIterator<SwTxtFrm,SwCntntNode> aIter( *pTxtNode );
+    for( SwTxtFrm* pTxtFrm = aIter.First(); pTxtFrm != NULL; pTxtFrm = aIter.Next() )
     {
         if( !pTxtFrm->IsFollow() )
         {
-            pTxtFrm = ((SwTxtFrm*)pTxtFrm)->GetFrmAtPos( rPos );
-        SwPageFrm *pPage = pTxtFrm ? pTxtFrm->FindPageFrm() : 0;
-        // #i103490#
-            if ( pPage && !pPage->IsInvalid() && !pPage->IsInvalidFly() )
+            pTxtFrm = pTxtFrm->GetFrmAtPos( rAnchorPos );
+            SwPageFrm *pPage = pTxtFrm ? pTxtFrm->FindPageFrm() : 0;
+            if ( pPage != NULL && !pPage->IsInvalid() && !pPage->IsInvalidFly() )
             {
-                SwLayoutInfo aInfo;
-                pTxtFrm->GetCharRect( aInfo.mPosition, rPos, 0 );
-                aInfo.mpAnchorFrm = pTxtFrm;
-                aInfo.mPageFrame = pPage->Frm();
-                aInfo.mPagePrtArea = pPage->Prt();
-                aInfo.mPagePrtArea.Pos() += aInfo.mPageFrame.Pos();
-                aInfo.mnPageNumber = pPage->GetPhyPageNum();
-                aInfo.meSidebarPosition = pPage->SidebarPosition();
-                aInfo.mRedlineAuthor = 0;
-
-                if( aRet == INVISIBLE )
+                aRet = VISIBLE;
+
+                o_rInfo.mpAnchorFrm = pTxtFrm;
+                pTxtFrm->GetCharRect( o_rInfo.mPosition, rAnchorPos, 0 );
+                if ( pAnnotationStartPos != NULL )
                 {
-                    aRet = VISIBLE;
-                    const IDocumentRedlineAccess* pIDRA = pNode->getIDocumentRedlineAccess();
-                    if( IDocumentRedlineAccess::IsShowChanges( pIDRA->GetRedlineMode() ) )
-                    {
-                        const SwRedline* pRedline = pIDRA->GetRedline( rPos, 0 );
-                        if( pRedline )
-                        {
-                            if( nsRedlineType_t::REDLINE_INSERT == pRedline->GetType() )
-                                aRet = INSERTED;
-                            else if( nsRedlineType_t::REDLINE_DELETE == pRedline->GetType() )
-                                aRet = DELETED;
-                            aInfo.mRedlineAuthor = pRedline->GetAuthor();
-                        }
-                    }
+                    o_rInfo.mnStartNodeIdx = pAnnotationStartPos->nNode.GetIndex();
+                    o_rInfo.mnStartContent = pAnnotationStartPos->nContent.GetIndex();
                 }
-
+                else
                 {
-                    std::vector< SwLayoutInfo >::iterator aInsPosIter =
-                                std::lower_bound( rInfo.begin(), rInfo.end(),
-                                                  aInfo, LayoutInfoOrder() );
-
-                    rInfo.insert( aInsPosIter, aInfo );
+                    o_rInfo.mnStartNodeIdx = 0;
+                    o_rInfo.mnStartContent = -1;
+                }
+                o_rInfo.mPageFrame = pPage->Frm();
+                o_rInfo.mPagePrtArea = pPage->Prt();
+                o_rInfo.mPagePrtArea.Pos() += o_rInfo.mPageFrame.Pos();
+                o_rInfo.mnPageNumber = pPage->GetPhyPageNum();
+                o_rInfo.meSidebarPosition = pPage->SidebarPosition();
+                o_rInfo.mRedlineAuthor = 0;
+
+                const IDocumentRedlineAccess* pIDRA = pTxtNode->getIDocumentRedlineAccess();
+                if( IDocumentRedlineAccess::IsShowChanges( pIDRA->GetRedlineMode() ) )
+                {
+                    const SwRedline* pRedline = pIDRA->GetRedline( rAnchorPos, 0 );
+                    if( pRedline )
+                    {
+                        if( nsRedlineType_t::REDLINE_INSERT == pRedline->GetType() )
+                            aRet = INSERTED;
+                        else if( nsRedlineType_t::REDLINE_DELETE == pRedline->GetType() )
+                            aRet = DELETED;
+                        o_rInfo.mRedlineAuthor = pRedline->GetAuthor();
+                    }
                 }
             }
         }
     }
-    return ((aRet==VISIBLE) && SwScriptInfo::IsInHiddenRange( *pTxtNode , rPos.nContent.GetIndex()) ) ? HIDDEN : aRet;
+
+    return ( (aRet==VISIBLE) && SwScriptInfo::IsInHiddenRange( *pTxtNode , rAnchorPos.nContent.GetIndex()) )
+             ? HIDDEN
+             : aRet;
 }
 
 long SwPostItHelper::getLayoutHeight( const SwRootFrm* pRoot )
@@ -163,17 +167,17 @@ unsigned long SwPostItHelper::getPageInfo( SwRect& rPageFrm, const SwRootFrm* pR
 
 SwPosition SwAnnotationItem::GetAnchorPosition() const
 {
-    SwTxtFld* pFld = pFmtFld->GetTxtFld();
-    SwTxtNode* pTNd = pFld->GetpTxtNode();
+    SwTxtFld* pTxtFld = mrFmtFld.GetTxtFld();
+    SwTxtNode* pTxtNode = pTxtFld->GetpTxtNode();
 
-    SwPosition aPos( *pTNd );
-    aPos.nContent.Assign( pTNd, *pFld->GetStart() );
+    SwPosition aPos( *pTxtNode );
+    aPos.nContent.Assign( pTxtNode, *(pTxtFld->GetStart()) );
     return aPos;
 }
 
 bool SwAnnotationItem::UseElement()
 {
-    return pFmtFld->IsFldInDoc();
+    return mrFmtFld.IsFldInDoc();
 }
 
 sw::sidebarwindows::SwSidebarWin* SwAnnotationItem::GetSidebarWindow(
@@ -185,7 +189,7 @@ sw::sidebarwindows::SwSidebarWin* SwAnnotationItem::GetSidebarWindow(
     return new sw::annotation::SwAnnotationWin( rEditWin, nBits,
                                                 aMgr, aBits,
                                                 *this,
-                                                pFmtFld );
+                                                &mrFmtFld );
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/fields/reffld.cxx b/sw/source/core/fields/reffld.cxx
index 9fbd6cd..d72766e 100644
--- a/sw/source/core/fields/reffld.cxx
+++ b/sw/source/core/fields/reffld.cxx
@@ -862,7 +862,7 @@ SwTxtNode* SwGetRefFieldType::FindAnchor( SwDoc* pDoc, const OUString& rRefMark,
     case REF_BOOKMARK:
         {
             IDocumentMarkAccess::const_iterator_t ppMark = pDoc->getIDocumentMarkAccess()->findMark(rRefMark);
-            if(ppMark != pDoc->getIDocumentMarkAccess()->getMarksEnd())
+            if(ppMark != pDoc->getIDocumentMarkAccess()->getAllMarksEnd())
             {
                 const ::sw::mark::IMark* pBkmk = ppMark->get();
                 const SwPosition* pPos = &pBkmk->GetMarkStart();
diff --git a/sw/source/core/frmedt/fefly1.cxx b/sw/source/core/frmedt/fefly1.cxx
index 1931c73..7bef646 100644
--- a/sw/source/core/frmedt/fefly1.cxx
+++ b/sw/source/core/frmedt/fefly1.cxx
@@ -1406,9 +1406,8 @@ Size SwFEShell::RequestObjectResize( const SwRect &rRect, const uno::Reference <
             // search for a sequence field:
             const SfxPoolItem* pItem;
             for( sal_uInt16 n = 0, nEnd = pHts->Count(); n < nEnd; ++n )
-                if( RES_TXTATR_FIELD == ( pItem =
-                            &(*pHts)[ n ]->GetAttr())->Which() &&
-                    TYP_SEQFLD == ((SwFmtFld*)pItem)->GetField()->GetTypeId() )
+                if( RES_TXTATR_FIELD == ( pItem = &(*pHts)[ n ]->GetAttr())->Which()
+                    && TYP_SEQFLD == ((SwFmtFld*)pItem)->GetField()->GetTypeId() )
                 {
                     // sequence field found
                     SwFlyFrm* pChgFly = (SwFlyFrm*)pAnchor->GetUpper();
diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx
index c4af698..8d93831 100644
--- a/sw/source/core/inc/MarkManager.hxx
+++ b/sw/source/core/inc/MarkManager.hxx
@@ -47,6 +47,11 @@ namespace sw {
 
             virtual ::sw::mark::IMark* getMarkForTxtNode(const SwTxtNode& rTxtNode, IDocumentMarkAccess::MarkType eMark);
 
+            virtual sw::mark::IMark* makeAnnotationMark(
+                const SwPaM& rPaM,
+                const ::rtl::OUString& rName );
+
+
             virtual void repositionMark(::sw::mark::IMark* io_pMark, const SwPaM& rPaM);
             virtual bool renameMark(::sw::mark::IMark* io_pMark, const OUString& rNewName);
             virtual void correctMarksAbsolute(const SwNodeIndex& rOldNode, const SwPosition& rNewPos, const xub_StrLen nOffset);
@@ -61,9 +66,9 @@ namespace sw {
             virtual void clearAllMarks();
 
             // marks
-            virtual const_iterator_t getMarksBegin() const;
-            virtual const_iterator_t getMarksEnd() const;
-            virtual sal_Int32 getMarksCount() const;
+            virtual const_iterator_t getAllMarksBegin() const;
+            virtual const_iterator_t getAllMarksEnd() const;
+            virtual sal_Int32 getAllMarksCount() const;
             virtual const_iterator_t findMark(const OUString& rName) const;
             virtual bool hasMark(const OUString& rName) const;
 
@@ -79,16 +84,40 @@ namespace sw {
             virtual ::sw::mark::IFieldmark* getFieldmarkAfter(const SwPosition& rPos) const;
 
             void dumpAsXml(xmlTextWriterPtr w);
+
+            // Marks exclusive annotation marks
+            virtual const_iterator_t getCommonMarksBegin() const;
+            virtual const_iterator_t getCommonMarksEnd() const;
+            virtual sal_Int32 getCommonMarksCount() const;
+
+            // Annotation Marks
+            virtual const_iterator_t getAnnotationMarksBegin() const;
+            virtual const_iterator_t getAnnotationMarksEnd() const;
+            virtual sal_Int32 getAnnotationMarksCount() const;
+            virtual const_iterator_t findAnnotationMark( const ::rtl::OUString& rName ) const;
+
         private:
             // make names
             OUString getUniqueMarkName(const OUString& rName) const;
             void sortMarks();
 
-            container_t m_vMarks;
+            // container for all marks
+            container_t m_vAllMarks;
+
+            // additional container for bookmarks
             container_t m_vBookmarks;
+            // additional container for fieldmarks
             container_t m_vFieldmarks;
+
             boost::unordered_set<OUString, OUStringHash> m_aMarkNamesSet;
             mutable MarkBasenameMapUniqueOffset_t m_aMarkBasenameMapUniqueOffset;
+
+            // container for annotation marks
+            container_t m_vAnnotationMarks;
+
+            // container for all marks except annotation marks
+            container_t m_vCommonMarks;
+
             SwDoc * const m_pDoc;
     };
     } // namespace mark
diff --git a/sw/source/core/inc/UndoDelete.hxx b/sw/source/core/inc/UndoDelete.hxx
index 41169bd..7a13c42 100644
--- a/sw/source/core/inc/UndoDelete.hxx
+++ b/sw/source/core/inc/UndoDelete.hxx
@@ -64,8 +64,10 @@ class SwUndoDelete
                     SwTxtNode* pSttTxtNd, SwTxtNode* pEndTxtNd );
 
 public:
-    SwUndoDelete( SwPaM&,
-            sal_Bool bFullPara = sal_False, sal_Bool bCalledByTblCpy = sal_False );
+    SwUndoDelete(
+        SwPaM&,
+        sal_Bool bFullPara = sal_False,
+        sal_Bool bCalledByTblCpy = sal_False );
     virtual ~SwUndoDelete();
 
     virtual void UndoImpl( ::sw::UndoRedoContext & );
diff --git a/sw/source/core/inc/annotationmark.hxx b/sw/source/core/inc/annotationmark.hxx
new file mode 100755
index 0000000..49adf05
--- /dev/null
+++ b/sw/source/core/inc/annotationmark.hxx
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef _ANNOTATIONMARK_HXX
+#define _ANNOTATIONMARK_HXX
+
+#include <bookmrk.hxx>
+#include <rtl/ustring.hxx>
+
+class SwFmtFld;
+
+namespace sw { namespace mark
+{
+    class AnnotationMark : public MarkBase
+    {
+    public:
+        AnnotationMark(
+            const SwPaM& rPaM,
+            const ::rtl::OUString& rName );
+
+        virtual ~AnnotationMark();
+
+        virtual void InitDoc(SwDoc* const io_Doc);
+
+        const SwFmtFld* GetAnnotationFmtFld() const;
+    };
+}}
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/crossrefbookmark.hxx b/sw/source/core/inc/crossrefbookmark.hxx
index ae74d74..fa4777b 100644
--- a/sw/source/core/inc/crossrefbookmark.hxx
+++ b/sw/source/core/inc/crossrefbookmark.hxx
@@ -67,7 +67,6 @@ namespace sw {
                 const KeyCode& rCode,
                 const OUString& rName,
                 const OUString& rShortName);
-            static OUString GenerateNewName();
             static bool IsLegalName(const OUString& rName);
         };
 
@@ -79,7 +78,6 @@ namespace sw {
                 const KeyCode& rCode,
                 const OUString& rName,
                 const OUString& rShortName);
-            static OUString GenerateNewName();
             static bool IsLegalName(const OUString& rName);
         };
     }
diff --git a/sw/source/core/inc/unoport.hxx b/sw/source/core/inc/unoport.hxx
index d32dc82..cd5c74a 100644
--- a/sw/source/core/inc/unoport.hxx
+++ b/sw/source/core/inc/unoport.hxx
@@ -75,7 +75,9 @@ enum SwTextPortionType
     PORTION_META,
     PORTION_FIELD_START,
     PORTION_FIELD_END,
-    PORTION_FIELD_START_END
+    PORTION_FIELD_START_END,
+    PORTION_ANNOTATION,
+    PORTION_ANNOTATION_END
 };
 
 
diff --git a/sw/source/core/table/swtable.cxx b/sw/source/core/table/swtable.cxx
index b51ee42..d705918 100644
--- a/sw/source/core/table/swtable.cxx
+++ b/sw/source/core/table/swtable.cxx
@@ -2542,8 +2542,8 @@ sal_uLong SwTableBox::IsValidNumTxtNd( sal_Bool bCheckAttr ) const
                         const SwTxtAttr* pAttr = (*pHts)[ n ];
                         if( RES_TXTATR_NOEND_BEGIN <= pAttr->Which() )
                         {
-                            if ((*pAttr->GetStart() == nNextSetField) &&

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list