]> git.lyx.org Git - lyx.git/blobdiff - src/text2.C
More fixes to insettabular/text (and some missing features added).
[lyx.git] / src / text2.C
index 3b47d059d7d768363ea3b23457162bcb19bd99cc..16fe687dc3057cc29c3c0af02da180ff8c9a6ce2 100644 (file)
@@ -22,6 +22,8 @@
 #include "insets/inseterror.h"
 #include "insets/insetbib.h"
 #include "insets/insetspecialchar.h"
+#include "insets/insettext.h"
+#include "insets/insetfloat.h"
 #include "layout.h"
 #include "LyXView.h"
 #include "support/textutils.h"
 #include "BufferView.h"
 #include "LyXView.h"
 #include "lyxrow.h"
+#include "CutAndPaste.h"
 #include "Painter.h"
 #include "font.h"
 #include "debug.h"
-
-#define FIX_DOUBLE_SPACE 1
+#include "lyxrc.h"
+#include "FloatList.h"
 
 using std::copy;
 using std::endl;
 using std::pair;
 
-LyXText::LyXText(BufferView * bv, int pw, Buffer * p)
+
+LyXText::LyXText(BufferView * bv)
+{
+       bv_owner = bv;
+       inset_owner = 0;
+       init();
+}
+
+
+LyXText::LyXText(InsetText * inset)
+{
+       inset_owner = inset;
+       bv_owner = 0;
+       init();
+}
+
+
+void LyXText::init()
 {
-       owner_ = bv;
+       the_locking_inset = 0;
        firstrow = 0;
        lastrow = 0;
-       currentrow = 0;
-       currentrow_y = 0;
-       paperwidth = pw;
-       parameters = &p->params;
-       params = p;
        number_of_rows = 0;
        refresh_y = 0;
-       status = LyXText::UNCHANGED;
-       LyXParagraph * par = p->paragraph;
-       current_font = GetFont(par, 0);
-   
        height = 0;
-
-       while (par) {
-               InsertParagraph(par, lastrow);
-               par = par->Next();
-       }
-
+       width = 0;
+       first = 0;
+       status = LyXText::UNCHANGED;
        // set cursor at the very top position
        selection = true;           /* these setting is necessary 
                                       because of the delete-empty-
                                       paragraph mechanism in
                                       SetCursor */
-       SetCursor(firstrow->par, 0);
+       if (bv_owner) {
+               LyXParagraph * par = OwnerParagraph();
+               current_font = GetFont(bv_owner->buffer(), par, 0);
+               while (par) {
+                       InsertParagraph(bv_owner, par, lastrow);
+                       par = par->Next();
+               }
+               SetCursor(bv_owner, firstrow->par(), 0);
+       } else
+               current_font = LyXFont(LyXFont::ALL_SANE);
+
        sel_cursor = cursor;
        selection = false;
        mark_set = false;
@@ -86,27 +104,68 @@ LyXText::LyXText(BufferView * bv, int pw, Buffer * p)
 
        // Default layouttype for copy environment type
        copylayouttype = 0;
+
+#if 0
+       // Dump all rowinformation:
+       Row * tmprow = firstrow;
+       lyxerr << "Baseline Paragraph Pos Height Ascent Fill\n";
+       while (tmprow) {
+               lyxerr << tmprow->baseline() << '\t'
+                      << tmprow->par << '\t'
+                      << tmprow->pos() << '\t'
+                      << tmprow->height << '\t'
+                      << tmprow->ascent_of_text << '\t'
+                      << tmprow->fill << '\n';
+               tmprow = tmprow->next();
+       }
+       lyxerr.flush();
+#endif
 }
 
 
+void LyXText::init(BufferView * bview)
+{
+       if (firstrow)
+               return;
+
+       LyXParagraph * par = OwnerParagraph();
+       current_font = GetFont(bview->buffer(), par, 0);
+       while (par) {
+               InsertParagraph(bview, par, lastrow);
+               par = par->Next();
+       }
+       SetCursorIntern(bview, firstrow->par(), 0);
+       sel_cursor = cursor;
+#if 0
+       // Dump all rowinformation:
+       Row * tmprow = firstrow;
+       lyxerr << "Width = " << width << endl;
+       lyxerr << "Baseline Paragraph Pos Height Ascent Fill\n";
+       while (tmprow) {
+               lyxerr << tmprow->baseline() << '\t'
+                      << tmprow->par() << '\t'
+                      << tmprow->pos() << '\t'
+                      << tmprow->height() << '\t'
+                      << tmprow->ascent_of_text() << '\t'
+                      << tmprow->fill() << '\n';
+               tmprow = tmprow->next();
+       }
+       lyxerr.flush();
+#endif
+}
+
 LyXText::~LyXText()
 {
        // Delete all rows, this does not touch the paragraphs!
        Row * tmprow = firstrow;
        while (firstrow) {
-               tmprow = firstrow->next;
+               tmprow = firstrow->next();
                delete firstrow;
                firstrow = tmprow;
        }
 }
 
 
-void LyXText::owner(BufferView * bv)
-{
-       if (owner_ && bv) lyxerr << "LyXText::owner_ already set!" << endl;
-       owner_ = bv;
-}
-
 // Gets the fully instantiated font at a given position in a paragraph
 // Basically the same routine as LyXParagraph::getFont() in paragraph.C.
 // The difference is that this one is used for displaying, and thus we
@@ -114,25 +173,32 @@ void LyXText::owner(BufferView * bv)
 // smaller. (Asger)
 // If position is -1, we get the layout font of the paragraph.
 // If position is -2, we get the font of the manual label of the paragraph.
-LyXFont LyXText::GetFont(LyXParagraph * par,
+LyXFont const LyXText::GetFont(Buffer const * buf, LyXParagraph * par,
                         LyXParagraph::size_type pos) const
 {
        LyXLayout const & layout = 
-               textclasslist.Style(parameters->textclass, par->GetLayout());
+               textclasslist.Style(buf->params.textclass, par->GetLayout());
 
        char par_depth = par->GetDepth();
        // We specialize the 95% common case:
-       if (par->footnoteflag == LyXParagraph::NO_FOOTNOTE && !par_depth) {
+       if (
+#ifndef NEW_INSETS
+               par->footnoteflag == LyXParagraph::NO_FOOTNOTE &&
+#endif
+               !par_depth) {
                if (pos >= 0){
                        // 95% goes here
                        if (layout.labeltype == LABEL_MANUAL
-                           && pos < BeginningOfMainBody(par)) {
+                           && pos < BeginningOfMainBody(buf, par)) {
                                // 1% goes here
-                               return par->GetFontSettings(pos).
-                                               realize(layout.reslabelfont);
-                       } else
-                               return par->GetFontSettings(pos).
-                                               realize(layout.resfont);
+                               LyXFont f = par->GetFontSettings(buf->params,
+                                                                pos);
+                               return f.realize(layout.reslabelfont);
+                       } else {
+                               LyXFont f = par->GetFontSettings(buf->params, pos);
+                               return f.realize(layout.resfont);
+                       }
+                       
                } else {
                        // 5% goes here.
                        // process layoutfont for pos == -1 and labelfont for pos < -1
@@ -149,14 +215,14 @@ LyXFont LyXText::GetFont(LyXParagraph * par,
 
        if (pos >= 0){
                // 95% goes here
-               if (pos < BeginningOfMainBody(par)) {
+               if (pos < BeginningOfMainBody(buf, par)) {
                        // 1% goes here
                        layoutfont = layout.labelfont;
                } else {
                        // 99% goes here
                        layoutfont = layout.font;
                }
-               tmpfont = par->GetFontSettings(pos);
+               tmpfont = par->GetFontSettings(buf->params, pos);
                tmpfont.realize(layoutfont);
        } else {
                // 5% goes here.
@@ -172,26 +238,27 @@ LyXFont LyXText::GetFont(LyXParagraph * par,
                par = par->DepthHook(par_depth - 1);
                if (par) {
                        tmpfont.realize(textclasslist.
-                                       Style(parameters->textclass,
+                                       Style(buf->params.textclass,
                                              par->GetLayout()).font);
                        par_depth = par->GetDepth();
                }
        }
 
-       tmpfont.realize(textclasslist.TextClass(parameters->textclass).defaultfont());
+       tmpfont.realize(textclasslist.TextClass(buf->params.textclass).defaultfont());
 
+#ifndef NEW_INSETS
        // Cosmetic improvement: If this is an open footnote, make the font 
        // smaller.
        if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
            && par->footnotekind == LyXParagraph::FOOTNOTE) {
                tmpfont.decSize();
        }
-
+#endif
        return tmpfont;
 }
 
 
-void LyXText::SetCharFont(LyXParagraph * par,
+void LyXText::SetCharFont(Buffer const * buf, LyXParagraph * par,
                          LyXParagraph::size_type pos,
                          LyXFont const & fnt)
 {
@@ -202,13 +269,14 @@ void LyXText::SetCharFont(LyXParagraph * par,
                        font = par->GetInset(pos)->ConvertFont(font);
        }
 
-       LyXLayout const & layout = textclasslist.Style(parameters->textclass,
-                                          par->GetLayout());
+       LyXLayout const & layout =
+               textclasslist.Style(buf->params.textclass,
+                                   par->GetLayout());
 
        // Get concrete layout font to reduce against
        LyXFont layoutfont;
 
-       if (pos < BeginningOfMainBody(par))
+       if (pos < BeginningOfMainBody(buf, par))
                layoutfont = layout.labelfont;
        else
                layoutfont = layout.font;
@@ -220,18 +288,19 @@ void LyXText::SetCharFont(LyXParagraph * par,
                        tp = tp->DepthHook(tp->GetDepth()-1);
                        if (tp)
                                layoutfont.realize(textclasslist.
-                                               Style(parameters->textclass,
+                                               Style(buf->params.textclass,
                                                      tp->GetLayout()).font);
                }
        }
 
-       layoutfont.realize(textclasslist.TextClass(parameters->textclass).defaultfont());
+       layoutfont.realize(textclasslist.TextClass(buf->params.textclass).defaultfont());
 
+#ifndef NEW_INSETS
        if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
            && par->footnotekind == LyXParagraph::FOOTNOTE) {
                layoutfont.decSize();
        }
-
+#endif
        // Now, reduce font against full layout font
        font.reduce(layoutfont);
 
@@ -246,24 +315,24 @@ void LyXText::InsertRow(Row * row, LyXParagraph * par,
 {
        Row * tmprow = new Row;
        if (!row) {
-               tmprow->previous = 0;
-               tmprow->next = firstrow;
+               tmprow->previous(0);
+               tmprow->next(firstrow);
                firstrow = tmprow;
        } else {
-               tmprow->previous = row;
-               tmprow->next = row->next;
-               row->next = tmprow;
+               tmprow->previous(row);
+               tmprow->next(row->next());
+               row->next(tmprow);
        }
    
-       if (tmprow->next)
-               tmprow->next->previous = tmprow;
+       if (tmprow->next())
+               tmprow->next()->previous(tmprow);
    
-       if (tmprow->previous)
-               tmprow->previous->next = tmprow;
+       if (tmprow->previous())
+               tmprow->previous()->next(tmprow);
    
    
-       tmprow->par = par;
-       tmprow->pos = pos;
+       tmprow->par(par);
+       tmprow->pos(pos);
 
        if (row == lastrow)
                lastrow = tmprow;
@@ -277,25 +346,20 @@ void LyXText::RemoveRow(Row * row) const
        /* this must not happen before the currentrow for clear reasons.
           so the trick is just to set the current row onto the previous
           row of this row */
-       long unused_y;
-       GetRow(row->par, row->pos, unused_y);
-       currentrow = currentrow->previous;
-       if (currentrow)
-               currentrow_y -= currentrow->height;
-       else
-               currentrow_y = 0;
+       int unused_y;
+       GetRow(row->par(), row->pos(), unused_y);
    
-       if (row->next)
-               row->next->previous = row->previous;
-       if (!row->previous) {
-               firstrow = row->next;
+       if (row->next())
+               row->next()->previous(row->previous());
+       if (!row->previous()) {
+               firstrow = row->next();
        } else  {
-               row->previous->next = row->next;
+               row->previous()->next(row->next());
        }
        if (row == lastrow)
-               lastrow = row->previous;
+               lastrow = row->previous();
    
-       height -= row->height;   // the text becomes smaller
+       height -= row->height(); // the text becomes smaller
    
        delete row;
        --number_of_rows;       // one row less
@@ -305,12 +369,12 @@ void LyXText::RemoveRow(Row * row) const
 // remove all following rows of the paragraph of the specified row.
 void LyXText::RemoveParagraph(Row * row) const
 {
-       LyXParagraph * tmppar = row->par;
-       row = row->next;
+       LyXParagraph * tmppar = row->par();
+       row = row->next();
     
        Row * tmprow;
-       while (row && row->par == tmppar) {
-               tmprow = row->next;
+       while (row && row->par() == tmppar) {
+               tmprow = row->next();
                RemoveRow(row);
                row = tmprow;
        }
@@ -318,244 +382,288 @@ void LyXText::RemoveParagraph(Row * row) const
    
 
 // insert the specified paragraph behind the specified row
-void LyXText::InsertParagraph(LyXParagraph * par, Row * row) const
+void LyXText::InsertParagraph(BufferView * bview, LyXParagraph * par,
+                             Row * row) const
 {
        InsertRow(row, par, 0);        /* insert a new row, starting 
                                        * at postition 0 */
 
-       SetCounter(par);  // set the counters
+       SetCounter(bview->buffer(), par);  // set the counters
    
        // and now append the whole paragraph behind the new row
        if (!row) {
-               firstrow->height = 0;
-               AppendParagraph(firstrow);
+               firstrow->height(0);
+               AppendParagraph(bview, firstrow);
        } else {
-               row->next->height = 0;
-               AppendParagraph(row->next);
+               row->next()->height(0);
+               AppendParagraph(bview, row->next());
        }
 }
-    
 
-void LyXText::ToggleFootnote()
+
+#ifndef NEW_INSETS
+void LyXText::ToggleFootnote(BufferView * bview)
 {
-       LyXParagraph * par = cursor.par->ParFromPos(cursor.pos);
+       LyXParagraph * par = cursor.par()->ParFromPos(cursor.pos());
        if (par->next
            && par->next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
-               OpenFootnote();
-               owner_->owner()->getMiniBuffer()->Set(_("Opened float"));
+               OpenFootnote(bview);
+               bview->owner()->getMiniBuffer()->Set(_("Opened float"));
        } else {
-               owner_->owner()->getMiniBuffer()->Set(_("Closed float"));
-               CloseFootnote();
+               bview->owner()->getMiniBuffer()->Set(_("Closed float"));
+               CloseFootnote(bview);
        }
 }
+#endif
 
 
-void LyXText::OpenStuff()
+#ifndef NEW_INSETS
+void LyXText::OpenStuff(BufferView * bview)
 {
-       if (cursor.pos == 0 && cursor.par->bibkey){
-               cursor.par->bibkey->Edit(owner_, 0, 0, 0);
+       if (cursor.pos() == 0 && cursor.par()->bibkey){
+               cursor.par()->bibkey->Edit(bview, 0, 0, 0);
+       } else if (cursor.pos() < cursor.par()->Last() 
+                && cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET
+                && cursor.par()->GetInset(cursor.pos())->Editable()) {
+               bview->owner()->getMiniBuffer()
+                       ->Set(cursor.par()->GetInset(cursor.pos())->EditMessage());
+               if (cursor.par()->GetInset(cursor.pos())->Editable() != Inset::HIGHLY_EDITABLE)
+                       SetCursorParUndo(bview->buffer());
+               cursor.par()->GetInset(cursor.pos())->Edit(bview, 0, 0, 0);
        }
-       else if (cursor.pos < cursor.par->Last() 
-                && cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET
-                && cursor.par->GetInset(cursor.pos)->Editable()) {
-               owner_->owner()->getMiniBuffer()
-                       ->Set(cursor.par->GetInset(cursor.pos)->EditMessage());
-               if (cursor.par->GetInset(cursor.pos)->Editable() != Inset::HIGHLY_EDITABLE)
-                       SetCursorParUndo();
-               cursor.par->GetInset(cursor.pos)->Edit(owner_, 0, 0, 0);
-       } else {
-               ToggleFootnote();
+#ifndef NEW_INSETS
+       else {
+               ToggleFootnote(bview);
        }
+#endif
 }
+#endif
 
 
-void LyXText::CloseFootnote()
+#ifndef NEW_INSETS
+void LyXText::CloseFootnote(BufferView * bview)
 {
        LyXParagraph * tmppar;
-       LyXParagraph * par = cursor.par->ParFromPos(cursor.pos);
+       LyXParagraph * par = cursor.par()->ParFromPos(cursor.pos());
    
        // if the cursor is not in an open footnote, or 
        // there is no open footnote in this paragraph, just return.
-       if (cursor.par->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
+       if (cursor.par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
       
                if (!par->next ||
                    par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
-                       owner_->owner()->getMiniBuffer()
+                       bview->owner()->getMiniBuffer()
                                ->Set(_("Nothing to do"));
                        return;
                }
    
                // ok, move the cursor right before the footnote
                // just a little faster than using CursorRight()
-               for (cursor.pos = 0;
-                    cursor.par->ParFromPos(cursor.pos) != par;
-                    cursor.pos++)
-                       {}
+               for (cursor.pos(0);
+                    cursor.par()->ParFromPos(cursor.pos()) != par;) {
+                               cursor.pos(cursor.pos() + 1);
+                       }
                
                // now the cursor is at the beginning of the physical par
-               SetCursor(cursor.par,
-                         cursor.pos +
-                         cursor.par->ParFromPos(cursor.pos)->size());
+               SetCursor(bview, cursor.par(),
+                         cursor.pos() +
+                         cursor.par()->ParFromPos(cursor.pos())->size());
        } else  {
                /* we are in a footnote, so let us move at the beginning */ 
                /* this is just faster than using just CursorLeft() */ 
        
-               tmppar = cursor.par;
+               tmppar = cursor.par();
                while (tmppar->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
                        // just a little bit faster than movin the cursor
                        tmppar = tmppar->Previous();
                }
-               SetCursor(tmppar, tmppar->Last());
+               SetCursor(bview, tmppar, tmppar->Last());
        }
    
        // the cursor must be exactly before the footnote
-       par = cursor.par->ParFromPos(cursor.pos);
+       par = cursor.par()->ParFromPos(cursor.pos());
    
        status = LyXText::NEED_MORE_REFRESH;
-       refresh_row = cursor.row;
-       refresh_y = cursor.y - cursor.row->baseline;
+       refresh_row = cursor.row();
+       refresh_y = cursor.y() - cursor.row()->baseline();
    
-       tmppar = cursor.par;
+       tmppar = cursor.par();
        LyXParagraph * endpar = par->NextAfterFootnote()->Next();
-       Row * row = cursor.row;
+       Row * row = cursor.row();
    
-       tmppar->CloseFootnote(cursor.pos);
+       tmppar->CloseFootnote(cursor.pos());
 
        while (tmppar != endpar) {
-               RemoveRow(row->next);
-               if (row->next)
-                       tmppar = row->next->par;
+               RemoveRow(row->next());
+               if (row->next())
+                       tmppar = row->next()->par();
                else
                        tmppar = 0;
        }
    
-       AppendParagraph(cursor.row);
+       AppendParagraph(bview, cursor.row());
    
-       SetCursor(cursor.par, cursor.pos);
+       SetCursor(bview, cursor.par(), cursor.pos());
        sel_cursor = cursor;
    
        // just necessary
-       if (cursor.row->next)
-               SetHeightOfRow(cursor.row->next);
+       if (cursor.row()->next())
+               SetHeightOfRow(bview, cursor.row()->next());
 }
+#endif
 
 
 /* used in setlayout */
 // Asger is not sure we want to do this...
-void LyXText::MakeFontEntriesLayoutSpecific(LyXParagraph * par)
+void LyXText::MakeFontEntriesLayoutSpecific(Buffer const * buf,
+                                           LyXParagraph * par)
 {
    
        LyXLayout const & layout =
-               textclasslist.Style(parameters->textclass, par->GetLayout());
+               textclasslist.Style(buf->params.textclass, par->GetLayout());
 
        LyXFont layoutfont, tmpfont;
        for (LyXParagraph::size_type pos = 0;
             pos < par->Last(); ++pos) {
-               if (pos < BeginningOfMainBody(par))
+               if (pos < BeginningOfMainBody(buf, par))
                        layoutfont = layout.labelfont;
                else
                        layoutfont = layout.font;
       
-               tmpfont = par->GetFontSettings(pos);
+               tmpfont = par->GetFontSettings(buf->params, pos);
                tmpfont.reduce(layoutfont);
                par->SetFont(pos, tmpfont);
        }
 }
 
 
-// set layout over selection and make a total rebreak of those paragraphs
-void LyXText::SetLayout(LyXTextClass::size_type layout)
+LyXParagraph * LyXText::SetLayout(BufferView * bview,
+                                 LyXCursor & cur, LyXCursor & sstart_cur,
+                                 LyXCursor & send_cur,
+                                 LyXTextClass::size_type layout)
 {
-       LyXCursor tmpcursor;
-
-       // if there is no selection just set the layout
-       // of the current paragraph  */
-       if (!selection) {
-               sel_start_cursor = cursor;  // dummy selection
-               sel_end_cursor = cursor;
-       }
-
-       LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+#ifndef NEW_INSETS
+       LyXParagraph * endpar = send_cur.par()->LastPhysicalPar()->Next();
+#else
+       LyXParagraph * endpar = send_cur.par()->Next();
+#endif
        LyXParagraph * undoendpar = endpar;
 
        if (endpar && endpar->GetDepth()) {
                while (endpar && endpar->GetDepth()) {
+#ifndef NEW_INSETS
                        endpar = endpar->LastPhysicalPar()->Next();
+#else
+                       endpar = endpar->Next();
+#endif
                        undoendpar = endpar;
                }
-       }
-       else if (endpar) {
+       } else if (endpar) {
                endpar = endpar->Next(); // because of parindents etc.
        }
    
-       SetUndo(Undo::EDIT, 
-               sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous, 
+       SetUndo(bview->buffer(), Undo::EDIT,
+#ifndef NEW_INSETS
+               sstart_cur.par()->ParFromPos(sstart_cur.pos())->previous,
+#else
+               sstart_cur.par()->previous,
+#endif
                undoendpar);
 
-       tmpcursor = cursor;                    /* store the current cursor  */
-
-       /* ok we have a selection. This is always between sel_start_cursor
+       /* ok we have a selection. This is always between sstart_cur
         * and sel_end cursor */ 
-       cursor = sel_start_cursor;
+       cur = sstart_cur;
    
        LyXLayout const & lyxlayout =
-               textclasslist.Style(parameters->textclass, layout);
-   
-       while (cursor.par != sel_end_cursor.par) {
-               if (cursor.par->footnoteflag ==
-                   sel_start_cursor.par->footnoteflag) {
-                       cursor.par->SetLayout(layout);
-                       MakeFontEntriesLayoutSpecific(cursor.par);
-                       LyXParagraph* fppar = cursor.par->FirstPhysicalPar();
+               textclasslist.Style(bview->buffer()->params.textclass, layout);
+   
+       while (cur.par() != send_cur.par()) {
+#ifndef NEW_INSETS
+               if (cur.par()->footnoteflag == sstart_cur.par()->footnoteflag) {
+#endif
+                       cur.par()->SetLayout(bview->buffer()->params, layout);
+                       MakeFontEntriesLayoutSpecific(bview->buffer(), cur.par());
+#ifndef NEW_INSETS
+                       LyXParagraph * fppar = cur.par()->FirstPhysicalPar();
+#else
+                       LyXParagraph * fppar = cur.par();
+#endif
                        fppar->added_space_top = lyxlayout.fill_top ?
                                VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
                        fppar->added_space_bottom = lyxlayout.fill_bottom ? 
                                VSpace(VSpace::VFILL) : VSpace(VSpace::NONE); 
                        if (lyxlayout.margintype == MARGIN_MANUAL)
-                               cursor.par->SetLabelWidthString(lyxlayout.labelstring());
+                               cur.par()->SetLabelWidthString(lyxlayout.labelstring());
                        if (lyxlayout.labeltype != LABEL_BIBLIO
                            && fppar->bibkey) {
                                delete fppar->bibkey;
                                fppar->bibkey = 0;
                        }
+#ifndef NEW_INSETS
                }
-               cursor.par = cursor.par->Next();
+#endif
+               cur.par(cur.par()->Next());
        }
-       if (cursor.par->footnoteflag ==
-           sel_start_cursor.par->footnoteflag) {
-               cursor.par->SetLayout(layout);
-               MakeFontEntriesLayoutSpecific(cursor.par);
-               LyXParagraph* fppar = cursor.par->FirstPhysicalPar();
+#ifndef NEW_INSETS
+       if (cur.par()->footnoteflag == sstart_cur.par()->footnoteflag) {
+#endif
+               cur.par()->SetLayout(bview->buffer()->params, layout);
+               MakeFontEntriesLayoutSpecific(bview->buffer(), cur.par());
+#ifndef NEW_INSETS
+               LyXParagraph * fppar = cur.par()->FirstPhysicalPar();
+#else
+               LyXParagraph * fppar = cur.par();
+#endif
                fppar->added_space_top = lyxlayout.fill_top ?
                        VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
                fppar->added_space_bottom = lyxlayout.fill_bottom ? 
                        VSpace(VSpace::VFILL) : VSpace(VSpace::NONE); 
                if (lyxlayout.margintype == MARGIN_MANUAL)
-                       cursor.par->SetLabelWidthString(lyxlayout.labelstring());
+                       cur.par()->SetLabelWidthString(lyxlayout.labelstring());
                if (lyxlayout.labeltype != LABEL_BIBLIO
                    && fppar->bibkey) {
                        delete fppar->bibkey;
                        fppar->bibkey = 0;
                }
+#ifndef NEW_INSETS
        }
-   
-       RedoParagraphs(sel_start_cursor, endpar);
+#endif
+       return endpar;
+}
+
+// set layout over selection and make a total rebreak of those paragraphs
+void LyXText::SetLayout(BufferView * bview, LyXTextClass::size_type layout)
+{
+       LyXCursor tmpcursor = cursor;  /* store the current cursor  */
+
+       // if there is no selection just set the layout
+       // of the current paragraph  */
+       if (!selection) {
+               sel_start_cursor = cursor;  // dummy selection
+               sel_end_cursor = cursor;
+       }
+       LyXParagraph *
+               endpar = SetLayout(bview, cursor, sel_start_cursor,
+                                  sel_end_cursor, layout);
+       RedoParagraphs(bview, sel_start_cursor, endpar);
    
        // we have to reset the selection, because the
-       // geometry could have changed */ 
-       SetCursor(sel_start_cursor.par, sel_start_cursor.pos, false);
+       // geometry could have changed
+       SetCursor(bview, sel_start_cursor.par(),
+                 sel_start_cursor.pos(), false);
        sel_cursor = cursor;
-       SetCursor(sel_end_cursor.par, sel_end_cursor.pos, false);
-       UpdateCounters(cursor.row);
+       SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos(),
+                 false);
+       UpdateCounters(bview, cursor.row());
        ClearSelection();
        SetSelection();
-       SetCursor(tmpcursor.par, tmpcursor.pos, true);
+       SetCursor(bview, tmpcursor.par(), tmpcursor.pos(), true);
 }
 
 
 // increment depth over selection and
 // make a total rebreak of those paragraphs
-void  LyXText::IncDepth()
+void  LyXText::IncDepth(BufferView * bview)
 {
        // If there is no selection, just use the current paragraph
        if (!selection) {
@@ -564,12 +672,21 @@ void  LyXText::IncDepth()
        }
 
        // We end at the next paragraph with depth 0
-       LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+       LyXParagraph * endpar =
+#ifndef NEW_INSETS
+               sel_end_cursor.par()->LastPhysicalPar()->Next();
+#else
+               sel_end_cursor.par()->Next();
+#endif
        LyXParagraph * undoendpar = endpar;
 
        if (endpar && endpar->GetDepth()) {
                while (endpar && endpar->GetDepth()) {
+#ifndef NEW_INSETS
                        endpar = endpar->LastPhysicalPar()->Next();
+#else
+                       endpar = endpar->Next();
+#endif
                        undoendpar = endpar;
                }
        }
@@ -577,9 +694,13 @@ void  LyXText::IncDepth()
                endpar = endpar->Next(); // because of parindents etc.
        }
        
-       SetUndo(Undo::EDIT, 
+       SetUndo(bview->buffer(), Undo::EDIT,
+#ifndef NEW_INSETS
                sel_start_cursor
-               .par->ParFromPos(sel_start_cursor.pos)->previous, 
+               .par()->ParFromPos(sel_start_cursor.pos())->previous,
+#else
+               sel_start_cursor.par()->previous,
+#endif
                undoendpar);
 
        LyXCursor tmpcursor = cursor; // store the current cursor
@@ -592,55 +713,75 @@ void  LyXText::IncDepth()
    
        while (true) {
                // NOTE: you can't change the depth of a bibliography entry
-               if (cursor.par->footnoteflag ==
-                   sel_start_cursor.par->footnoteflag
-                   && textclasslist.Style(parameters->textclass,
-                                     cursor.par->GetLayout()
+               if (
+#ifndef NEW_INSETS
+                       cursor.par()->footnoteflag ==
+                   sel_start_cursor.par()->footnoteflag &&
+#endif
+                   textclasslist.Style(bview->buffer()->params.textclass,
+                                     cursor.par()->GetLayout()
                                     ).labeltype != LABEL_BIBLIO) {
                        LyXParagraph * prev =
-                               cursor.par->FirstPhysicalPar()->Previous();
+#ifndef NEW_INSETS
+                               cursor.par()->FirstPhysicalPar()->Previous();
+#else
+                               cursor.par()->Previous();
+#endif
                        if (prev 
-                           && (prev->GetDepth() - cursor.par->GetDepth() > 0
-                               || (prev->GetDepth() == cursor.par->GetDepth()
-                                   && textclasslist.Style(parameters->textclass,
+                           && (prev->GetDepth() - cursor.par()->GetDepth() > 0
+                               || (prev->GetDepth() == cursor.par()->GetDepth()
+                                   && textclasslist.Style(bview->buffer()->params.textclass,
                                                      prev->GetLayout()).isEnvironment()))) {
-                               cursor.par->FirstPhysicalPar()->depth++;
+#ifndef NEW_INSETS
+                               cursor.par()->FirstPhysicalPar()->depth++;
+#else
+                               cursor.par()->depth++;
+#endif
                                anything_changed = true;
                                }
                }
-               if (cursor.par == sel_end_cursor.par)
+               if (cursor.par() == sel_end_cursor.par())
                        break;
-               cursor.par = cursor.par->Next();
+               cursor.par(cursor.par()->Next());
        }
    
        // if nothing changed set all depth to 0
        if (!anything_changed) {
                cursor = sel_start_cursor;
-               while (cursor.par != sel_end_cursor.par) {
-                       cursor.par->FirstPhysicalPar()->depth = 0;
-                       cursor.par = cursor.par->Next();
+               while (cursor.par() != sel_end_cursor.par()) {
+#ifndef NEW_INSETS
+                       cursor.par()->FirstPhysicalPar()->depth = 0;
+#else
+                       cursor.par()->depth = 0;
+#endif
+                       cursor.par(cursor.par()->Next());
                }
-               if (cursor.par->footnoteflag == sel_start_cursor.par->footnoteflag)
-                       cursor.par->FirstPhysicalPar()->depth = 0;
+#ifndef NEW_INSETS
+               if (cursor.par()->footnoteflag == sel_start_cursor.par()->footnoteflag)
+                       cursor.par()->FirstPhysicalPar()->depth = 0;
+#else
+                       cursor.par()->depth = 0;
+#endif
        }
    
-       RedoParagraphs(sel_start_cursor, endpar);
+       RedoParagraphs(bview, sel_start_cursor, endpar);
    
        // we have to reset the selection, because the
        // geometry could have changed
-       SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+       SetCursor(bview, sel_start_cursor.par(),
+                 sel_start_cursor.pos());
        sel_cursor = cursor;
-       SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
-       UpdateCounters(cursor.row);
+       SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos());
+       UpdateCounters(bview, cursor.row());
        ClearSelection();
        SetSelection();
-       SetCursor(tmpcursor.par, tmpcursor.pos);
+       SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
 }
 
 
 // decrement depth over selection and
 // make a total rebreak of those paragraphs
-void  LyXText::DecDepth()
+void  LyXText::DecDepth(BufferView * bview)
 {
        // if there is no selection just set the layout
        // of the current paragraph
@@ -648,13 +789,20 @@ void  LyXText::DecDepth()
                sel_start_cursor = cursor; // dummy selection
                sel_end_cursor = cursor;
        }
-   
-       LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+#ifndef NEW_INSETS
+       LyXParagraph * endpar = sel_end_cursor.par()->LastPhysicalPar()->Next();
+#else
+       LyXParagraph * endpar = sel_end_cursor.par()->Next();
+#endif
        LyXParagraph * undoendpar = endpar;
 
        if (endpar && endpar->GetDepth()) {
                while (endpar && endpar->GetDepth()) {
+#ifndef NEW_INSETS
                        endpar = endpar->LastPhysicalPar()->Next();
+#else
+                       endpar = endpar->Next();
+#endif
                        undoendpar = endpar;
                }
        }
@@ -662,9 +810,13 @@ void  LyXText::DecDepth()
                endpar = endpar->Next(); // because of parindents etc.
        }
    
-       SetUndo(Undo::EDIT, 
+       SetUndo(bview->buffer(), Undo::EDIT,
+#ifndef NEW_INSETS
                sel_start_cursor
-               .par->ParFromPos(sel_start_cursor.pos)->previous, 
+               .par()->ParFromPos(sel_start_cursor.pos())->previous,
+#else
+               sel_start_cursor.par()->previous,
+#endif
                undoendpar);
 
        LyXCursor tmpcursor = cursor; // store the current cursor
@@ -674,43 +826,52 @@ void  LyXText::DecDepth()
        cursor = sel_start_cursor;
 
        while (true) {
-               if (cursor.par->footnoteflag ==
-                   sel_start_cursor.par->footnoteflag) {
-                       if (cursor.par->FirstPhysicalPar()->depth)
-                               cursor.par->FirstPhysicalPar()->depth--;
+#ifndef NEW_INSETS
+               if (cursor.par()->footnoteflag ==
+                   sel_start_cursor.par()->footnoteflag) {
+                       if (cursor.par()->FirstPhysicalPar()->depth)
+                               cursor.par()->FirstPhysicalPar()->depth--;
                }
-               if (cursor.par == sel_end_cursor.par)
+#else
+                       if (cursor.par()->depth)
+                               cursor.par()->depth--;
+#endif
+               if (cursor.par() == sel_end_cursor.par())
                        break;
-               cursor.par = cursor.par->Next();
+               cursor.par(cursor.par()->Next());
        }
 
-       RedoParagraphs(sel_start_cursor, endpar);
+       RedoParagraphs(bview, sel_start_cursor, endpar);
    
        // we have to reset the selection, because the
        // geometry could have changed
-       SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+       SetCursor(bview, sel_start_cursor.par(),
+                 sel_start_cursor.pos());
        sel_cursor = cursor;
-       SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
-       UpdateCounters(cursor.row);
+       SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos());
+       UpdateCounters(bview, cursor.row());
        ClearSelection();
        SetSelection();
-       SetCursor(tmpcursor.par, tmpcursor.pos);
+       SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
 }
 
 
 // set font over selection and make a total rebreak of those paragraphs
-void LyXText::SetFont(LyXFont const & font, bool toggleall)
+void LyXText::SetFont(BufferView * bview, LyXFont const & font, bool toggleall)
 {
        // if there is no selection just set the current_font
        if (!selection) {
                // Determine basis font
                LyXFont layoutfont;
-               if (cursor.pos < BeginningOfMainBody(cursor.par))
-                       layoutfont = GetFont(cursor.par, -2);
+               if (cursor.pos() < BeginningOfMainBody(bview->buffer(),
+                                                      cursor.par()))
+                       layoutfont = GetFont(bview->buffer(), cursor.par(),-2);
                else
-                       layoutfont = GetFont(cursor.par, -1);
+                       layoutfont = GetFont(bview->buffer(), cursor.par(),-1);
                // Update current font
-               real_current_font.update(font, parameters->language_info, toggleall);
+               real_current_font.update(font,
+                                        bview->buffer()->params.language,
+                                        toggleall);
 
                // Reduce to implicit settings
                current_font = real_current_font;
@@ -725,87 +886,112 @@ void LyXText::SetFont(LyXFont const & font, bool toggleall)
        // ok we have a selection. This is always between sel_start_cursor
        // and sel_end cursor
    
-       SetUndo(Undo::EDIT, 
-               sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous, 
-               sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)->next); 
+       SetUndo(bview->buffer(), Undo::EDIT,
+#ifndef NEW_INSETS
+               sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos())->previous, 
+               sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos())->next
+#else
+               sel_start_cursor.par()->previous, 
+               sel_end_cursor.par()->next
+#endif
+               ); 
        cursor = sel_start_cursor;
-       while (cursor.par != sel_end_cursor.par ||
-              (cursor.par->footnoteflag == sel_start_cursor.par->footnoteflag
-               && cursor.pos < sel_end_cursor.pos)) 
+       while (cursor.par() != sel_end_cursor.par() ||
+              (
+#ifndef NEW_INSETS
+                      cursor.par()->footnoteflag == sel_start_cursor.par()->footnoteflag &&
+#endif
+               cursor.pos() < sel_end_cursor.pos())) 
        {
-               if (cursor.pos < cursor.par->Last()
-                   && cursor.par->footnoteflag
-                   == sel_start_cursor.par->footnoteflag) {
+               if (cursor.pos() < cursor.par()->Last()
+#ifndef NEW_INSETS
+                   && cursor.par()->footnoteflag
+                   == sel_start_cursor.par()->footnoteflag
+#endif
+                       ) {
                        // an open footnote should behave
                        // like a closed one
-                       LyXFont newfont = GetFont(cursor.par, cursor.pos);
-                       newfont.update(font, parameters->language_info, toggleall);
-                       SetCharFont(cursor.par, cursor.pos, newfont);
-                       cursor.pos++;
+                       LyXFont newfont = GetFont(bview->buffer(), 
+                                                 cursor.par(), cursor.pos());
+                       newfont.update(font,
+                                      bview->buffer()->params.language,
+                                      toggleall);
+                       SetCharFont(bview->buffer(),
+                                   cursor.par(), cursor.pos(), newfont);
+                       cursor.pos(cursor.pos() + 1);
                } else {
-                       cursor.pos = 0;
-                       cursor.par = cursor.par->Next();
+                       cursor.pos(0);
+                       cursor.par(cursor.par()->Next());
                }
        }
    
-       RedoParagraphs(sel_start_cursor, sel_end_cursor.par->Next());
+       RedoParagraphs(bview, sel_start_cursor, sel_end_cursor.par()->Next());
    
        // we have to reset the selection, because the
        // geometry could have changed
-       SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+       SetCursor(bview, sel_start_cursor.par(), sel_start_cursor.pos());
        sel_cursor = cursor;
-       SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
+       SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos());
        ClearSelection();
        SetSelection();
-       SetCursor(tmpcursor.par, tmpcursor.pos);
+       SetCursor(bview, tmpcursor.par(), tmpcursor.pos(), true,
+                 tmpcursor.boundary());
 }
 
 
-void LyXText::RedoHeightOfParagraph(LyXCursor const & cur)
+void LyXText::RedoHeightOfParagraph(BufferView * bview, LyXCursor const & cur)
 {
-       Row * tmprow = cur.row;
-       long y = cur.y - tmprow->baseline;
+       Row * tmprow = cur.row();
+       int y = cur.y() - tmprow->baseline();
 
-       SetHeightOfRow(tmprow);
-       LyXParagraph * first_phys_par = tmprow->par->FirstPhysicalPar();
+       SetHeightOfRow(bview, tmprow);
+#ifndef NEW_INSETS
+       LyXParagraph * first_phys_par = tmprow->par()->FirstPhysicalPar();
+#else
+       LyXParagraph * first_phys_par = tmprow->par();
+#endif
        // find the first row of the paragraph
-       if (first_phys_par != tmprow->par)
-               while (tmprow->previous
-                      && tmprow->previous->par != first_phys_par) {
-                       tmprow = tmprow->previous;
-                       y -= tmprow->height;
-                       SetHeightOfRow(tmprow);
-               }
-       while (tmprow->previous && tmprow->previous->par == first_phys_par) {
-               tmprow = tmprow->previous;
-               y -= tmprow->height;
-               SetHeightOfRow(tmprow);
+       if (first_phys_par != tmprow->par())
+               while (tmprow->previous()
+                      && tmprow->previous()->par() != first_phys_par) {
+                       tmprow = tmprow->previous();
+                       y -= tmprow->height();
+                       SetHeightOfRow(bview, tmprow);
+               }
+       while (tmprow->previous() && tmprow->previous()->par() == first_phys_par) {
+               tmprow = tmprow->previous();
+               y -= tmprow->height();
+               SetHeightOfRow(bview, tmprow);
        }
        
        // we can set the refreshing parameters now
        status = LyXText::NEED_MORE_REFRESH;
        refresh_y = y;
        refresh_row = tmprow;
-       SetCursor(cur.par, cur.pos);
+       SetCursor(bview, cur.par(), cur.pos(), false, cursor.boundary());
 }
 
 
-void LyXText::RedoDrawingOfParagraph(LyXCursor const & cur)
+void LyXText::RedoDrawingOfParagraph(BufferView * bview, LyXCursor const & cur)
 {
-       Row * tmprow = cur.row;
+       Row * tmprow = cur.row();
    
-       long y = cur.y - tmprow->baseline;
-       SetHeightOfRow(tmprow);
-       LyXParagraph * first_phys_par = tmprow->par->FirstPhysicalPar();
+       int y = cur.y() - tmprow->baseline();
+       SetHeightOfRow(bview, tmprow);
+#ifndef NEW_INSETS
+       LyXParagraph * first_phys_par = tmprow->par()->FirstPhysicalPar();
+#else
+       LyXParagraph * first_phys_par = tmprow->par();
+#endif
        // find the first row of the paragraph
-       if (first_phys_par != tmprow->par)
-               while (tmprow->previous && tmprow->previous->par != first_phys_par)  {
-                       tmprow = tmprow->previous;
-                       y -= tmprow->height;
+       if (first_phys_par != tmprow->par())
+               while (tmprow->previous() && tmprow->previous()->par() != first_phys_par)  {
+                       tmprow = tmprow->previous();
+                       y -= tmprow->height();
                }
-       while (tmprow->previous && tmprow->previous->par == first_phys_par)  {
-               tmprow = tmprow->previous;
-               y -= tmprow->height;
+       while (tmprow->previous() && tmprow->previous()->par() == first_phys_par)  {
+               tmprow = tmprow->previous();
+               y -= tmprow->height();
        }
    
        // we can set the refreshing parameters now
@@ -814,102 +1000,110 @@ void LyXText::RedoDrawingOfParagraph(LyXCursor const & cur)
                refresh_row = tmprow;
        }
        status = LyXText::NEED_MORE_REFRESH;
-       SetCursor(cur.par, cur.pos);
+       SetCursor(bview, cur.par(), cur.pos());
 }
 
 
 /* deletes and inserts again all paragaphs between the cursor
 * and the specified par 
 * This function is needed after SetLayout and SetFont etc. */
-void LyXText::RedoParagraphs(LyXCursor const & cur,
+void LyXText::RedoParagraphs(BufferView * bview, LyXCursor const & cur,
                             LyXParagraph const * endpar) const
 {
        Row * tmprow2;
-       LyXParagraph * tmppar, * first_phys_par;
+       LyXParagraph * tmppar = 0, * first_phys_par = 0;
    
-       Row * tmprow = cur.row;
+       Row * tmprow = cur.row();
    
-       long y = cur.y - tmprow->baseline;
+       int y = cur.y() - tmprow->baseline();
    
-       if (!tmprow->previous){
+       if (!tmprow->previous()){
                first_phys_par = FirstParagraph();   // a trick/hack for UNDO
        } else {
-               first_phys_par = tmprow->par->FirstPhysicalPar();
+#ifndef NEW_INSETS
+               first_phys_par = tmprow->par()->FirstPhysicalPar();
+#else
+               first_phys_par = tmprow->par();
+#endif
                // find the first row of the paragraph
-               if (first_phys_par != tmprow->par)
-                       while (tmprow->previous &&
-                              (tmprow->previous->par != first_phys_par)) {
-                               tmprow = tmprow->previous;
-                               y -= tmprow->height;
+               if (first_phys_par != tmprow->par())
+                       while (tmprow->previous() &&
+                              (tmprow->previous()->par() != first_phys_par)) {
+                               tmprow = tmprow->previous();
+                               y -= tmprow->height();
                        }
-               while (tmprow->previous
-                      && tmprow->previous->par == first_phys_par) {
-                       tmprow = tmprow->previous;
-                       y -= tmprow->height;
+               while (tmprow->previous()
+                      && tmprow->previous()->par() == first_phys_par) {
+                       tmprow = tmprow->previous();
+                       y -= tmprow->height();
                }
        }
    
        // we can set the refreshing parameters now
        status = LyXText::NEED_MORE_REFRESH;
        refresh_y = y;
-       refresh_row = tmprow->previous;  /* the real refresh row will
+       refresh_row = tmprow->previous();        /* the real refresh row will
                                            be deleted, so I store
                                            the previous here */ 
        // remove it
-       if (tmprow->next)
-               tmppar = tmprow->next->par;
+       if (tmprow->next())
+               tmppar = tmprow->next()->par();
        else
                tmppar = 0;
        while (tmppar != endpar) {
-               RemoveRow(tmprow->next);
-               if (tmprow->next)
-                       tmppar = tmprow->next->par;
+               RemoveRow(tmprow->next());
+               if (tmprow->next())
+                       tmppar = tmprow->next()->par();
                else
                        tmppar = 0;
        }  
    
        // remove the first one
-       tmprow2 = tmprow;     /* this is because tmprow->previous
+       tmprow2 = tmprow;     /* this is because tmprow->previous()
                                 can be 0 */
-       tmprow = tmprow->previous;
+       tmprow = tmprow->previous();
        RemoveRow(tmprow2);
    
        tmppar = first_phys_par;
 
        do {
                if (tmppar) {
-                       InsertParagraph(tmppar, tmprow);
+                       InsertParagraph(bview, tmppar, tmprow);
                        if (!tmprow)
                                tmprow = firstrow;
-                       while (tmprow->next && tmprow->next->par == tmppar)
-                               tmprow = tmprow->next;
+                       while (tmprow->next() && tmprow->next()->par() == tmppar)
+                               tmprow = tmprow->next();
                        tmppar = tmppar->Next();
                }
        } while (tmppar != endpar);
    
        // this is because of layout changes
        if (refresh_row) {
-               refresh_y -= refresh_row->height;
-               SetHeightOfRow(refresh_row);   
+               refresh_y -= refresh_row->height();
+               SetHeightOfRow(bview, refresh_row);   
        } else {
                refresh_row = firstrow;
                refresh_y = 0;
-               SetHeightOfRow(refresh_row);   
+               SetHeightOfRow(bview, refresh_row);   
        }
    
-       if (tmprow && tmprow->next)
-               SetHeightOfRow(tmprow->next);
+       if (tmprow && tmprow->next())
+               SetHeightOfRow(bview, tmprow->next());
 }
 
 
-int LyXText::FullRebreak()
+bool LyXText::FullRebreak(BufferView * bview)
 {
+       if (!firstrow) {
+               init(bview);
+               return true;
+       }
        if (need_break_row) {
-               BreakAgain(need_break_row);
+               BreakAgain(bview, need_break_row);
                need_break_row = 0;
-               return 1;
+               return true;
        }
-       return 0;
+       return false;
 }
 
 
@@ -917,8 +1111,8 @@ int LyXText::FullRebreak()
 
 
 /* the cursor set functions have a special mechanism. When they
-* realize, that you left an empty paragraph, they will delete it.
-* They also delet the corresponding row */
+ * realize, that you left an empty paragraph, they will delete it.
+ * They also delete the corresponding row */
    
 // need the selection cursor:
 void LyXText::SetSelection()
@@ -932,12 +1126,12 @@ void LyXText::SetSelection()
        selection = true;
    
        // first the toggling area
-       if (cursor.y < last_sel_cursor.y ||
-           (cursor.y == last_sel_cursor.y && cursor.x < last_sel_cursor.x)) {
+       if (cursor.y() < last_sel_cursor.y()
+           || (cursor.y() == last_sel_cursor.y()
+            && cursor.x() < last_sel_cursor.x())) {
                toggle_end_cursor = last_sel_cursor;
                toggle_cursor = cursor;
-       }
-       else {
+       } else {
                toggle_end_cursor = cursor;
                toggle_cursor = last_sel_cursor;
        }
@@ -946,16 +1140,16 @@ void LyXText::SetSelection()
    
        // and now the whole selection
 
-       if (sel_cursor.par == cursor.par)
-          if (sel_cursor.pos < cursor.pos) {
+       if (sel_cursor.par() == cursor.par())
+          if (sel_cursor.pos() < cursor.pos()) {
                sel_end_cursor = cursor;
                sel_start_cursor = sel_cursor;
        } else {
                sel_end_cursor = sel_cursor; 
                sel_start_cursor = cursor;
        }
-       else if (sel_cursor.y < cursor.y ||
-           (sel_cursor.y == cursor.y && sel_cursor.x < cursor.x)) {
+       else if (sel_cursor.y() < cursor.y() ||
+           (sel_cursor.y() == cursor.y() && sel_cursor.x() < cursor.x())) {
                sel_end_cursor = cursor;
                sel_start_cursor = sel_cursor;
        }
@@ -965,139 +1159,151 @@ void LyXText::SetSelection()
        }
    
        // a selection with no contents is not a selection
-       if (sel_start_cursor.x == sel_end_cursor.x && 
-           sel_start_cursor.y == sel_end_cursor.y)
+       if (sel_start_cursor.par() == sel_end_cursor.par() && 
+           sel_start_cursor.pos() == sel_end_cursor.pos())
                selection = false;
 }
 
 
+string const LyXText::selectionAsString(Buffer const * buffer) const
+{
+       if (!selection) return string();
+       string result;
+       
+       // Special handling if the whole selection is within one paragraph
+       if (sel_start_cursor.par() == sel_end_cursor.par()) {
+               result += sel_start_cursor.par()->String(buffer,
+                                                        sel_start_cursor.pos(),
+                                                        sel_end_cursor.pos());
+               return result;
+       }
+       
+       // The selection spans more than one paragraph
+
+       // First paragraph in selection
+       result += sel_start_cursor.par()->String(buffer,
+                                                sel_start_cursor.pos(),
+                                                sel_start_cursor.par()->Last())
+               + "\n\n";
+       
+       // The paragraphs in between (if any)
+       LyXCursor tmpcur(sel_start_cursor);
+       tmpcur.par(tmpcur.par()->Next());
+       while (tmpcur.par() != sel_end_cursor.par()) {
+               result += tmpcur.par()->String(buffer, 0, tmpcur.par()->Last()) + "\n\n";
+               tmpcur.par(tmpcur.par()->Next()); // Or NextAfterFootnote??
+       }
+
+       // Last paragraph in selection
+       result += sel_end_cursor.par()->String(buffer, 0, sel_end_cursor.pos());
+       
+       return result;
+}
+
+
 void LyXText::ClearSelection() const
 {
+       if (selection)
+               status = LyXText::NEED_MORE_REFRESH;
        selection = false;
        mark_set = false;
 }
 
 
-void LyXText::CursorHome() const
+void LyXText::CursorHome(BufferView * bview) const
 {
-       SetCursor(cursor.par, cursor.row->pos);
+       SetCursor(bview, cursor.par(), cursor.row()->pos());
 }
 
 
-void  LyXText::CursorEnd() const
+void LyXText::CursorEnd(BufferView * bview) const
 {
-       if (!cursor.row->next || cursor.row->next->par != cursor.row->par)
-               SetCursor(cursor.par, RowLast(cursor.row) + 1);
+       if (!cursor.row()->next() || cursor.row()->next()->par() != cursor.row()->par())
+               SetCursor(bview, cursor.par(), RowLast(cursor.row()) + 1);
        else {
-               if (cursor.par->Last() && 
-                   (cursor.par->GetChar(RowLast(cursor.row)) == ' '
-                    || cursor.par->IsNewline(RowLast(cursor.row))))
-                       SetCursor(cursor.par, RowLast(cursor.row));
+               if (cursor.par()->Last() && 
+                   (cursor.par()->GetChar(RowLast(cursor.row())) == ' '
+                    || cursor.par()->IsNewline(RowLast(cursor.row()))))
+                       SetCursor(bview, cursor.par(), RowLast(cursor.row()));
                else
-                       SetCursor(cursor.par, RowLast(cursor.row) + 1);
-       }
-        if (cursor.par->table) {
-                int cell = NumberOfCell(cursor.par, cursor.pos);
-                if (cursor.par->table->RowHasContRow(cell) &&
-                    cursor.par->table->CellHasContRow(cell)<0) {
-                        if (!cursor.row->next || cursor.row->next->par != cursor.row->par)
-                                SetCursor(cursor.par, RowLast(cursor.row) + 1);
-                        else {
-                                if (cursor.par->Last() && 
-                                    (cursor.par->GetChar(RowLast(cursor.row)) == ' '
-                                     || cursor.par->IsNewline(RowLast(cursor.row))))
-                                        SetCursor(cursor.par, RowLast(cursor.row));
-                                else
-                                        SetCursor(cursor.par, RowLast(cursor.row) + 1);
-                        }
-                }
-        }
+                       SetCursor(bview,cursor.par(), RowLast(cursor.row()) + 1);
+       }
 }
 
 
-void  LyXText::CursorTop() const
+void  LyXText::CursorTop(BufferView * bview) const
 {
-       while (cursor.par->Previous())
-               cursor.par = cursor.par->Previous();
-       SetCursor(cursor.par, 0);
+       while (cursor.par()->Previous())
+               cursor.par(cursor.par()->Previous());
+       SetCursor(bview, cursor.par(), 0);
 }
 
 
-void  LyXText::CursorBottom() const
+void  LyXText::CursorBottom(BufferView * bview) const
 {
-       while (cursor.par->Next())
-               cursor.par = cursor.par->Next();
-       SetCursor(cursor.par, cursor.par->Last());
+       while (cursor.par()->Next())
+               cursor.par(cursor.par()->Next());
+       SetCursor(bview, cursor.par(), cursor.par()->Last());
 }
    
    
 /* returns a pointer to the row near the specified y-coordinate
 * (relative to the whole text). y is set to the real beginning
-* of this row */ 
-Row * LyXText::GetRowNearY(long & y) const
+* of this row */
+Row * LyXText::GetRowNearY(int & y) const
 {
-       Row * tmprow;
-       long tmpy;
-   
-       if (currentrow) {
-               tmprow = currentrow;
-               tmpy = currentrow_y;
-       } else {
-               tmprow = firstrow;
-               tmpy = 0;
-       }
-
-       if (tmpy <= y)
-               while (tmprow->next && tmpy + tmprow->height <= y) {
-                       tmpy += tmprow->height;
-                       tmprow = tmprow->next;
-               }
-       else
-               while (tmprow->previous && tmpy > y) {
-                       tmprow = tmprow->previous;
-                       tmpy -= tmprow->height;
-               }
+       Row * tmprow = firstrow;
+       int tmpy = 0;
 
-       currentrow = tmprow;
-       currentrow_y = tmpy;
+       while (tmprow->next() && tmpy + tmprow->height() <= y) {
+               tmpy += tmprow->height();
+               tmprow = tmprow->next();
+       }
 
        y = tmpy;   // return the real y
        return tmprow;
 }
-   
 
-void LyXText::ToggleFree(LyXFont const & font, bool toggleall)
+
+void LyXText::ToggleFree(BufferView * bview,
+                        LyXFont const & font, bool toggleall)
 {
        // If the mask is completely neutral, tell user
        if (font == LyXFont(LyXFont::ALL_IGNORE)) {
                // Could only happen with user style
-               owner_->owner()->getMiniBuffer()
+               bview->owner()->getMiniBuffer()
                        ->Set(_("No font change defined. Use Character under"
-                                 " the Layout menu to define font change."));
+                               " the Layout menu to define font change."));
                return;
        }
 
        // Try implicit word selection
+       // If there is a change in the language the implicit word selection 
+       // is disabled.
        LyXCursor resetCursor = cursor;
-       int implicitSelection = SelectWordWhenUnderCursor();
+       bool implicitSelection = (font.language() == ignore_language
+                                 && font.number() == LyXFont::IGNORE)
+               ? SelectWordWhenUnderCursor(bview) : false;
 
        // Set font
-       SetFont(font, toggleall);
+       SetFont(bview, font, toggleall);
 
        /* Implicit selections are cleared afterwards and cursor is set to the
           original position. */
        if (implicitSelection) {
                ClearSelection();
                cursor = resetCursor;
-               SetCursor( cursor.par, cursor.pos );
+               SetCursor(bview, cursor.par(), cursor.pos());
                sel_cursor = cursor;
        }
 }
 
 
-LyXParagraph::size_type LyXText::BeginningOfMainBody(LyXParagraph * par) const
+LyXParagraph::size_type
+LyXText::BeginningOfMainBody(Buffer const * buf,
+                            LyXParagraph const * par) const
 {
-       if (textclasslist.Style(parameters->textclass,
+       if (textclasslist.Style(buf->params.textclass,
                                par->GetLayout()).labeltype != LABEL_MANUAL)
                return 0;
        else
@@ -1105,9 +1311,10 @@ LyXParagraph::size_type LyXText::BeginningOfMainBody(LyXParagraph * par) const
 }
 
 
+#ifndef NEW_INSETS
 /* if there is a selection, reset every environment you can find
 * in the selection, otherwise just the environment you are in */ 
-void LyXText::MeltFootnoteEnvironment()
+void LyXText::MeltFootnoteEnvironment(BufferView * bview)
 {
        LyXParagraph * tmppar, * firsttmppar;
    
@@ -1115,21 +1322,21 @@ void LyXText::MeltFootnoteEnvironment()
    
        /* is is only allowed, if the cursor is IN an open footnote.
         * Otherwise it is too dangerous */ 
-       if (cursor.par->footnoteflag != LyXParagraph::OPEN_FOOTNOTE)
+       if (cursor.par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE)
                return;
    
-       SetUndo(Undo::FINISH, 
-               cursor.par->PreviousBeforeFootnote()->previous,
-               cursor.par->NextAfterFootnote()->next);
+       SetUndo(bview->buffer(), Undo::FINISH, 
+               cursor.par()->PreviousBeforeFootnote()->previous,
+               cursor.par()->NextAfterFootnote()->next);
 
        /* ok, move to the beginning of the footnote. */ 
-       while (cursor.par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
-               cursor.par = cursor.par->Previous();
+       while (cursor.par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
+               cursor.par(cursor.par()->Previous());
    
-       SetCursor(cursor.par, cursor.par->Last());
+       SetCursor(bview, cursor.par(), cursor.par()->Last());
        /* this is just faster than using CursorLeft(); */ 
    
-       firsttmppar = cursor.par->ParFromPos(cursor.pos);
+       firsttmppar = cursor.par()->ParFromPos(cursor.pos());
        tmppar = firsttmppar;
        /* tmppar is now the paragraph right before the footnote */
 
@@ -1144,28 +1351,28 @@ void LyXText::MeltFootnoteEnvironment()
                tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE;
       
                /* remember the captions and empty paragraphs */
-               if ((textclasslist.Style(parameters->textclass,
+               if ((textclasslist.Style(bview->buffer()->params.textclass,
                                         tmppar->GetLayout())
                     .labeltype == LABEL_SENSITIVE)
                    || !tmppar->Last())
-                       tmppar->SetLayout(0);
+                       tmppar->SetLayout(bview->buffer()->params, 0);
        }
    
        // now we will paste the ex-footnote, if the layouts allow it
        // first restore the layout of the paragraph right behind
        // the footnote
        if (tmppar->next) 
-               tmppar->next->MakeSameLayout(cursor.par);
+               tmppar->next->MakeSameLayout(cursor.par());
 
        // first the end
-       if ((!tmppar->GetLayout() && !tmppar->table)
+       if (!tmppar->GetLayout()
            || (tmppar->Next()
                && (!tmppar->Next()->Last()
                    || tmppar->Next()->HasSameLayout(tmppar)))) {
                if (tmppar->Next()->Last()
                    && tmppar->Next()->IsLineSeparator(0))
                        tmppar->Next()->Erase(0);
-               tmppar->PasteParagraph();
+               tmppar->PasteParagraph(bview->buffer()->params);
        }
 
        tmppar = tmppar->Next();  /* make sure tmppar cannot be touched
@@ -1175,30 +1382,31 @@ void LyXText::MeltFootnoteEnvironment()
        /* if there is no space between the text and the footnote, so we insert
         * a blank 
         * (only if the previous par and the footnotepar are not empty!) */
-       if ((!firsttmppar->next->GetLayout() && !firsttmppar->next->table)
+       if (!firsttmppar->next->GetLayout()
            || firsttmppar->HasSameLayout(firsttmppar->next)) {
                if (firsttmppar->size()
                    && !firsttmppar->IsSeparator(firsttmppar->size() - 1)
                    && first_footnote_par_is_not_empty) {
                        firsttmppar->next->InsertChar(0, ' ');
                }
-               firsttmppar->PasteParagraph();
+               firsttmppar->PasteParagraph(bview->buffer()->params);
        }
    
        /* now redo the paragaphs */
-       RedoParagraphs(cursor, tmppar);
+       RedoParagraphs(bview, cursor, tmppar);
    
-       SetCursor(cursor.par, cursor.pos);
+       SetCursor(bview, cursor.par(), cursor.pos());
    
        /* sometimes it can happen, that there is a counter change */ 
-       Row * row = cursor.row;
-       while (row->next && row->par != tmppar && row->next->par != tmppar)
-               row = row->next;
-       UpdateCounters(row);
+       Row * row = cursor.row();
+       while (row->next() && row->par() != tmppar && row->next()->par() != tmppar)
+               row = row->next();
+       UpdateCounters(bview, row);
    
    
        ClearSelection();
 }
+#endif
 
 
 /* the DTP switches for paragraphs. LyX will store them in the 
@@ -1207,7 +1415,8 @@ void LyXText::MeltFootnoteEnvironment()
 * they do not duplicate themself and you cannnot make dirty things with 
 * them!  */ 
 
-void LyXText::SetParagraph(bool line_top, bool line_bottom,
+void LyXText::SetParagraph(BufferView * bview,
+                          bool line_top, bool line_bottom,
                           bool pagebreak_top, bool pagebreak_bottom,
                           VSpace const & space_top,
                           VSpace const & space_bottom,
@@ -1222,12 +1431,20 @@ void LyXText::SetParagraph(bool line_top, bool line_bottom,
        }
 
        // make sure that the depth behind the selection are restored, too
-       LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+#ifndef NEW_INSETS
+       LyXParagraph * endpar = sel_end_cursor.par()->LastPhysicalPar()->Next();
+#else
+       LyXParagraph * endpar = sel_end_cursor.par()->Next();
+#endif
        LyXParagraph * undoendpar = endpar;
 
        if (endpar && endpar->GetDepth()) {
                while (endpar && endpar->GetDepth()) {
+#ifndef NEW_INSETS
                        endpar = endpar->LastPhysicalPar()->Next();
+#else
+                       endpar = endpar->Next();
+#endif
                        undoendpar = endpar;
                }
        }
@@ -1235,62 +1452,79 @@ void LyXText::SetParagraph(bool line_top, bool line_bottom,
                endpar = endpar->Next(); // because of parindents etc.
        }
    
-       SetUndo(Undo::EDIT, 
+       SetUndo(bview->buffer(), Undo::EDIT,
+#ifndef NEW_INSETS
                sel_start_cursor
-               .par->ParFromPos(sel_start_cursor.pos)->previous, 
+               .par()->ParFromPos(sel_start_cursor.pos())->previous,
+#else
+               sel_start_cursor.par()->previous,
+#endif
                undoendpar);
 
        
-       LyXParagraph * tmppar = sel_end_cursor.par;
-       while (tmppar != sel_start_cursor.par->FirstPhysicalPar()->Previous()) {
-               SetCursor(tmppar->FirstPhysicalPar(), 0);
+       LyXParagraph * tmppar = sel_end_cursor.par();
+#ifndef NEW_INSETS
+       while (tmppar != sel_start_cursor.par()->FirstPhysicalPar()->Previous()) {
+               SetCursor(bview, tmppar->FirstPhysicalPar(), 0);
+#else
+       while (tmppar != sel_start_cursor.par()->Previous()) {
+               SetCursor(bview, tmppar, 0);
+#endif
                status = LyXText::NEED_MORE_REFRESH;
-               refresh_row = cursor.row;
-               refresh_y = cursor.y - cursor.row->baseline;
-               if (cursor.par->footnoteflag ==
-                   sel_start_cursor.par->footnoteflag) {
-                       cursor.par->line_top = line_top;
-                       cursor.par->line_bottom = line_bottom;
-                       cursor.par->pagebreak_top = pagebreak_top;
-                       cursor.par->pagebreak_bottom = pagebreak_bottom;
-                       cursor.par->added_space_top = space_top;
-                       cursor.par->added_space_bottom = space_bottom;
+               refresh_row = cursor.row();
+               refresh_y = cursor.y() - cursor.row()->baseline();
+#ifndef NEW_INSETS
+               if (cursor.par()->footnoteflag ==
+                   sel_start_cursor.par()->footnoteflag) {
+#endif
+                       cursor.par()->line_top = line_top;
+                       cursor.par()->line_bottom = line_bottom;
+                       cursor.par()->pagebreak_top = pagebreak_top;
+                       cursor.par()->pagebreak_bottom = pagebreak_bottom;
+                       cursor.par()->added_space_top = space_top;
+                       cursor.par()->added_space_bottom = space_bottom;
                        // does the layout allow the new alignment?
                        if (align == LYX_ALIGN_LAYOUT)
                                align = textclasslist
-                                       .Style(parameters->textclass,
-                                              cursor.par->GetLayout()).align;
+                                       .Style(bview->buffer()->params.textclass,
+                                              cursor.par()->GetLayout()).align;
                        if (align & textclasslist
-                           .Style(parameters->textclass,
-                                  cursor.par->GetLayout()).alignpossible) {
+                           .Style(bview->buffer()->params.textclass,
+                                  cursor.par()->GetLayout()).alignpossible) {
                                if (align == textclasslist
-                                   .Style(parameters->textclass,
-                                          cursor.par->GetLayout()).align)
-                                       cursor.par->align = LYX_ALIGN_LAYOUT;
+                                   .Style(bview->buffer()->params.textclass,
+                                          cursor.par()->GetLayout()).align)
+                                       cursor.par()->align = LYX_ALIGN_LAYOUT;
                                else
-                                       cursor.par->align = align;
+                                       cursor.par()->align = align;
                        }
-                       cursor.par->SetLabelWidthString(labelwidthstring);
-                       cursor.par->noindent = noindent;
+                       cursor.par()->SetLabelWidthString(labelwidthstring);
+                       cursor.par()->noindent = noindent;
+#ifndef NEW_INSETS
                }
                
-               tmppar = cursor.par->FirstPhysicalPar()->Previous();
+               tmppar = cursor.par()->FirstPhysicalPar()->Previous();
+#else
+               tmppar = cursor.par()->Previous();
+#endif
        }
        
-       RedoParagraphs(sel_start_cursor, endpar);
+       RedoParagraphs(bview, sel_start_cursor, endpar);
        
        ClearSelection();
-       SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+       SetCursor(bview, sel_start_cursor.par(), sel_start_cursor.pos());
        sel_cursor = cursor;
-       SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
+       SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos());
        SetSelection();
-       SetCursor(tmpcursor.par, tmpcursor.pos);
+       SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
+       if (inset_owner)
+           bview->updateInset(inset_owner, true);
 }
 
 
-void LyXText::SetParagraphExtraOpt(int type,
-                                   char const * width,
-                                   char const * widthp,
+void LyXText::SetParagraphExtraOpt(BufferView * bview, int type,
+                                   string const & width,
+                                   string const & widthp,
                                    int alignment, bool hfill,
                                    bool start_minipage)
 {
@@ -1302,12 +1536,20 @@ void LyXText::SetParagraphExtraOpt(int type,
        }
 
        // make sure that the depth behind the selection are restored, too
-       LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+#ifndef NEW_INSETS
+       LyXParagraph * endpar = sel_end_cursor.par()->LastPhysicalPar()->Next();
+#else
+       LyXParagraph * endpar = sel_end_cursor.par()->Next();
+#endif
        LyXParagraph * undoendpar = endpar;
 
        if (endpar && endpar->GetDepth()) {
                while (endpar && endpar->GetDepth()) {
+#ifndef NEW_INSETS
                        endpar = endpar->LastPhysicalPar()->Next();
+#else
+                       endpar = endpar->Next();
+#endif
                        undoendpar = endpar;
                }
        }
@@ -1315,40 +1557,56 @@ void LyXText::SetParagraphExtraOpt(int type,
                endpar = endpar->Next(); // because of parindents etc.
        }
    
-       SetUndo(Undo::EDIT, 
+       SetUndo(bview->buffer(), Undo::EDIT,
+#ifndef NEW_INSETS
                sel_start_cursor
-               .par->ParFromPos(sel_start_cursor.pos)->previous, 
+               .par()->ParFromPos(sel_start_cursor.pos())->previous,
+#else
+               sel_start_cursor.par()->previous,
+#endif
                undoendpar);
        
-       tmppar = sel_end_cursor.par;
-       while(tmppar != sel_start_cursor.par->FirstPhysicalPar()->Previous()) {
-                SetCursor(tmppar->FirstPhysicalPar(), 0);
+       tmppar = sel_end_cursor.par();
+#ifndef NEW_INSETS
+       while(tmppar != sel_start_cursor.par()->FirstPhysicalPar()->Previous()) {
+                SetCursor(bview, tmppar->FirstPhysicalPar(), 0);
+#else
+       while(tmppar != sel_start_cursor.par()->Previous()) {
+                SetCursor(bview, tmppar, 0);
+#endif
                 status = LyXText::NEED_MORE_REFRESH;
-                refresh_row = cursor.row;
-                refresh_y = cursor.y - cursor.row->baseline;
-                if (cursor.par->footnoteflag ==
-                    sel_start_cursor.par->footnoteflag) {
+                refresh_row = cursor.row();
+                refresh_y = cursor.y() - cursor.row()->baseline();
+#ifndef NEW_INSETS
+                if (cursor.par()->footnoteflag ==
+                    sel_start_cursor.par()->footnoteflag) {
+#endif
                         if (type == LyXParagraph::PEXTRA_NONE) {
-                                if (cursor.par->pextra_type != LyXParagraph::PEXTRA_NONE) {
-                                        cursor.par->UnsetPExtraType();
-                                        cursor.par->pextra_type = LyXParagraph::PEXTRA_NONE;
+                                if (cursor.par()->pextra_type != LyXParagraph::PEXTRA_NONE) {
+                                        cursor.par()->UnsetPExtraType(bview->buffer()->params);
+                                        cursor.par()->pextra_type = LyXParagraph::PEXTRA_NONE;
                                 }
                         } else {
-                                cursor.par->SetPExtraType(type, width, widthp);
-                                cursor.par->pextra_hfill = hfill;
-                                cursor.par->pextra_start_minipage = start_minipage;
-                                cursor.par->pextra_alignment = alignment;
+                                cursor.par()->SetPExtraType(bview->buffer()->params,
+                                                         type, width, widthp);
+                                cursor.par()->pextra_hfill = hfill;
+                                cursor.par()->pextra_start_minipage = start_minipage;
+                                cursor.par()->pextra_alignment = alignment;
                         }
-                }
-                tmppar = cursor.par->FirstPhysicalPar()->Previous();
+#ifndef NEW_INSETS
+               }
+                tmppar = cursor.par()->FirstPhysicalPar()->Previous();
+#else
+                tmppar = cursor.par()->Previous();
+#endif
         }
-       RedoParagraphs(sel_start_cursor, endpar);
+       RedoParagraphs(bview, sel_start_cursor, endpar);
        ClearSelection();
-       SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+       SetCursor(bview, sel_start_cursor.par(), sel_start_cursor.pos());
        sel_cursor = cursor;
-       SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
+       SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos());
        SetSelection();
-       SetCursor(tmpcursor.par, tmpcursor.pos);
+       SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
 }
 
 
@@ -1360,6 +1618,8 @@ char loweralphaCounter(int n)
                return 'a' + n - 1;
 }
 
+
+static inline
 char alphaCounter(int n)
 {
        if (n < 1 || n > 26)
@@ -1368,6 +1628,8 @@ char alphaCounter(int n)
                return 'A' + n - 1;
 }
 
+
+static inline
 char hebrewCounter(int n)
 {
        static const char hebrew[22] = {
@@ -1381,7 +1643,9 @@ char hebrewCounter(int n)
                return hebrew[n-1];
 }
 
-static char const * romanCounter(int n)
+
+static inline
+string const romanCounter(int n)
 {
        static char const * roman[20] = {
                "i",   "ii",  "iii", "iv", "v",
@@ -1395,42 +1659,55 @@ static char const * romanCounter(int n)
                return roman[n-1];
 }
 
+
 // set the counter of a paragraph. This includes the labels
-void LyXText::SetCounter(LyXParagraph * par) const
+void LyXText::SetCounter(Buffer const * buf, LyXParagraph * par) const
 {
+#ifndef NEW_INSETS
        // this is only relevant for the beginning of paragraph
        par = par->FirstPhysicalPar();
-
-       LyXLayout const & layout = textclasslist.Style(parameters->textclass, 
-                                                      par->GetLayout());
+#endif
+       LyXLayout const & layout =
+               textclasslist.Style(buf->params.textclass, 
+                                   par->GetLayout());
 
        LyXTextClass const & textclass =
-               textclasslist.TextClass(parameters->textclass);
+               textclasslist.TextClass(buf->params.textclass);
 
        /* copy the prev-counters to this one, unless this is the start of a 
           footnote or of a bibliography or the very first paragraph */
        if (par->Previous()
+#ifndef NEW_INSETS
            && !(par->Previous()->footnoteflag == LyXParagraph::NO_FOOTNOTE 
                    && par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
                    && par->footnotekind == LyXParagraph::FOOTNOTE)
-           && !(textclasslist.Style(parameters->textclass,
+#endif
+           && !(textclasslist.Style(buf->params.textclass,
                                par->Previous()->GetLayout()
                                ).labeltype != LABEL_BIBLIO
                 && layout.labeltype == LABEL_BIBLIO)) {
                for (int i = 0; i < 10; ++i) {
                        par->setCounter(i, par->Previous()->GetFirstCounter(i));
                }
+#ifndef NEW_INSETS
                par->appendix = par->Previous()->FirstPhysicalPar()->appendix;
+#else
+               par->appendix = par->Previous()->appendix;
+#endif
                if (!par->appendix && par->start_of_appendix){
                  par->appendix = true;
                  for (int i = 0; i < 10; ++i) {
                    par->setCounter(i, 0);
                  }  
                }
+#ifndef NEW_INSETS
                par->enumdepth = par->Previous()->FirstPhysicalPar()->enumdepth;
                par->itemdepth = par->Previous()->FirstPhysicalPar()->itemdepth;
-       }
-       else {
+#else
+               par->enumdepth = par->Previous()->enumdepth;
+               par->itemdepth = par->Previous()->itemdepth;
+#endif
+       } else {
                for (int i = 0; i < 10; ++i) {
                        par->setCounter(i, 0);
                }  
@@ -1439,16 +1716,17 @@ void LyXText::SetCounter(LyXParagraph * par) const
                par->itemdepth = 0;
        }
 
+#ifndef NEW_INSETS
         // if this is an open marginnote and this is the first
         // entry in the marginnote and the enclosing
         // environment is an enum/item then correct for the
         // LaTeX behaviour (ARRae)
-        if(par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
+        if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
           && par->footnotekind == LyXParagraph::MARGIN
            && par->Previous()
            && par->Previous()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE
            && (par->PreviousBeforeFootnote()
-               && textclasslist.Style(parameters->textclass,
+               && textclasslist.Style(buf->params.textclass,
                                  par->PreviousBeforeFootnote()->GetLayout()
                                 ).labeltype >= LABEL_COUNTER_ENUMI)) {
                 // Any itemize or enumerate environment in a marginnote
@@ -1460,7 +1738,7 @@ void LyXText::SetCounter(LyXParagraph * par) const
                 par->enumdepth++;
                 par->itemdepth++;
         }
-
+#endif
        /* Maybe we have to increment the enumeration depth.
         * BUT, enumeration in a footnote is considered in isolation from its
         *      surrounding paragraph so don't increment if this is the
@@ -1470,13 +1748,15 @@ void LyXText::SetCounter(LyXParagraph * par) const
         */
        if (par->Previous()
            && par->Previous()->GetDepth() < par->GetDepth()
-           && textclasslist.Style(parameters->textclass,
+           && textclasslist.Style(buf->params.textclass,
                              par->Previous()->GetLayout()
                             ).labeltype == LABEL_COUNTER_ENUMI
            && par->enumdepth < 3
+#ifndef NEW_INSETS
            && !(par->Previous()->footnoteflag == LyXParagraph::NO_FOOTNOTE 
                    && par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
                    && par->footnotekind == LyXParagraph::FOOTNOTE)
+#endif
            && layout.labeltype != LABEL_BIBLIO) {
                par->enumdepth++;
        }
@@ -1484,9 +1764,11 @@ void LyXText::SetCounter(LyXParagraph * par) const
        /* Maybe we have to decrement the enumeration depth, see note above */
        if (par->Previous()
            && par->Previous()->GetDepth() > par->GetDepth()
+#ifndef NEW_INSETS
            && !(par->Previous()->footnoteflag == LyXParagraph::NO_FOOTNOTE
                    && par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
                    && par->footnotekind == LyXParagraph::FOOTNOTE)
+#endif
            && layout.labeltype != LABEL_BIBLIO) {
                par->enumdepth = par->DepthHook(par->GetDepth())->enumdepth;
                par->setCounter(6 + par->enumdepth,
@@ -1499,7 +1781,7 @@ void LyXText::SetCounter(LyXParagraph * par) const
        }
    
        if (!par->labelstring.empty()) {
-               par->labelstring.clear();
+               par->labelstring.erase();
        }
    
        if (layout.margintype == MARGIN_MANUAL) {
@@ -1511,10 +1793,10 @@ void LyXText::SetCounter(LyXParagraph * par) const
        }
    
        /* is it a layout that has an automatic label ? */ 
-       if (layout.labeltype >=  LABEL_FIRST_COUNTER) {
+       if (layout.labeltype >=  LABEL_COUNTER_CHAPTER) {
       
-               int i = layout.labeltype - LABEL_FIRST_COUNTER;
-               if (i >= 0 && i<= parameters->secnumdepth) {
+               int i = layout.labeltype - LABEL_COUNTER_CHAPTER;
+               if (i >= 0 && i<= buf->params.secnumdepth) {
                        par->incCounter(i);     // increment the counter  
         
                        // Is there a label? Useful for Chapter layout
@@ -1522,21 +1804,18 @@ void LyXText::SetCounter(LyXParagraph * par) const
                                if (!layout.labelstring().empty())
                                        par->labelstring = layout.labelstring();
                                else
-                                       par->labelstring.clear();
+                                       par->labelstring.erase();
                         } else {
                                if (!layout.labelstring_appendix().empty())
                                        par->labelstring = layout.labelstring_appendix();
                                else
-                                       par->labelstring.clear();
+                                       par->labelstring.erase();
                        }
 
-#ifdef HAVE_SSTREAM
                        std::ostringstream s;
-#else
-                       ostrstream s;
-#endif
+
                        if (!par->appendix) {
-                               switch (2 * LABEL_FIRST_COUNTER -
+                               switch (2 * LABEL_COUNTER_CHAPTER -
                                        textclass.maxcounter() + i) {
                                case LABEL_COUNTER_CHAPTER:
                                        s << par->getCounter(i);
@@ -1574,32 +1853,35 @@ void LyXText::SetCounter(LyXParagraph * par) const
 
                                        break;
                                default:
+                                       // Can this ever be reached? And in the
+                                       // case it is, how can this be correct?
+                                       // (Lgb)
                                        s << par->getCounter(i) << '.';
                                         break;
                                }
                        } else { // appendix
-                               switch (2 * LABEL_FIRST_COUNTER - textclass.maxcounter() + i) {
+                               switch (2 * LABEL_COUNTER_CHAPTER - textclass.maxcounter() + i) {
                                case LABEL_COUNTER_CHAPTER:
-                                       if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                               s << alphaCounter(par->getCounter(i));
-                                       else
+                                       if (par->isRightToLeftPar(buf->params))
                                                s << hebrewCounter(par->getCounter(i));
+                                       else
+                                               s << alphaCounter(par->getCounter(i));
                                        break;
                                case LABEL_COUNTER_SECTION:
-                                       if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                               s << alphaCounter(par->getCounter(i - 1));
-                                       else
+                                       if (par->isRightToLeftPar(buf->params))
                                                s << hebrewCounter(par->getCounter(i - 1));
+                                       else
+                                               s << alphaCounter(par->getCounter(i - 1));
 
                                        s << '.'
                                          << par->getCounter(i);
 
                                        break;
                                case LABEL_COUNTER_SUBSECTION:
-                                       if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                               s << alphaCounter(par->getCounter(i - 2));
-                                       else
+                                       if (par->isRightToLeftPar(buf->params))
                                                s << hebrewCounter(par->getCounter(i - 2));
+                                       else
+                                               s << alphaCounter(par->getCounter(i - 2));
 
                                        s << '.'
                                          << par->getCounter(i-1) << '.'
@@ -1607,10 +1889,10 @@ void LyXText::SetCounter(LyXParagraph * par) const
 
                                        break;
                                case LABEL_COUNTER_SUBSUBSECTION:
-                                       if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                               s << alphaCounter(par->getCounter(i-3));
-                                       else
+                                       if (par->isRightToLeftPar(buf->params))
                                                s << hebrewCounter(par->getCounter(i-3));
+                                       else
+                                               s << alphaCounter(par->getCounter(i-3));
 
                                        s << '.'
                                          << par->getCounter(i-2) << '.'
@@ -1619,10 +1901,10 @@ void LyXText::SetCounter(LyXParagraph * par) const
 
                                        break;
                                case LABEL_COUNTER_PARAGRAPH:
-                                       if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                               s << alphaCounter(par->getCounter(i-4));
-                                       else
+                                       if (par->isRightToLeftPar(buf->params))
                                                s << hebrewCounter(par->getCounter(i-4));
+                                       else
+                                               s << alphaCounter(par->getCounter(i-4));
 
                                        s << '.'
                                          << par->getCounter(i-3) << '.'
@@ -1632,10 +1914,10 @@ void LyXText::SetCounter(LyXParagraph * par) const
 
                                        break;
                                case LABEL_COUNTER_SUBPARAGRAPH:
-                                       if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                               s << alphaCounter(par->getCounter(i-5));
-                                       else
+                                       if (par->isRightToLeftPar(buf->params))
                                                s << hebrewCounter(par->getCounter(i-5));
+                                       else
+                                               s << alphaCounter(par->getCounter(i-5));
 
                                        s << '.'
                                          << par->getCounter(i-4) << '.'
@@ -1649,21 +1931,15 @@ void LyXText::SetCounter(LyXParagraph * par) const
                                        // Can this ever be reached? And in the
                                        // case it is, how can this be correct?
                                        // (Lgb)
-                                       s << static_cast<unsigned char>(par->getCounter(i)) << '.';
+                                       s << par->getCounter(i) << '.';
                                        
                                        break;
                                }
                        }
-#ifdef HAVE_SSTREAM
+
                        par->labelstring += s.str().c_str();
                        // We really want to remove the c_str as soon as
                        // possible...
-#else
-                       s << '\0';
-                       char * tmps = s.str();
-                       par->labelstring += tmps;
-                       delete [] tmps;
-#endif
                        
                        for (i++; i < 10; ++i) {
                                // reset the following counters
@@ -1678,63 +1954,56 @@ void LyXText::SetCounter(LyXParagraph * par) const
                        par->incCounter(i + par->enumdepth);
                        int number = par->getCounter(i + par->enumdepth);
 
-#ifdef HAVE_SSTREAM
                        std::ostringstream s;
-#else
-                       ostrstream s;
-#endif
+
                        switch (par->enumdepth) {
                        case 1:
-                               if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
+                               if (par->isRightToLeftPar(buf->params))
                                        s << '('
-                                         << loweralphaCounter(number)
+                                         << hebrewCounter(number)
                                          << ')';
                                else
                                        s << '('
-                                         << hebrewCounter(number)
+                                         << loweralphaCounter(number)
                                          << ')';
                                break;
                        case 2:
-                               if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                       s << romanCounter(number) << '.';
-                               else
+                               if (par->isRightToLeftPar(buf->params))
                                        s << '.' << romanCounter(number);
+                               else
+                                       s << romanCounter(number) << '.';
                                break;
                        case 3:
-                               if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                       s << alphaCounter(number)
-                                         << '.';
-                               else
+                               if (par->isRightToLeftPar(buf->params))
                                        s << '.'
                                          << alphaCounter(number);
+                               else
+                                       s << alphaCounter(number)
+                                         << '.';
                                break;
                        default:
-                               if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                       s << number << '.';
-                               else
+                               if (par->isRightToLeftPar(buf->params))
                                        s << '.' << number;
+                               else
+                                       s << number << '.';
                                break;
                        }
-#ifdef HAVE_SSTREAM
+
                        par->labelstring = s.str().c_str();
                        // we really want to get rid of that c_str()
-#else
-                       s << '\0';
-                       char * tmps = s.str();
-                       par->labelstring = tmps;
-                       delete [] tmps;
-#endif
 
                        for (i += par->enumdepth + 1; i < 10; ++i)
                                par->setCounter(i, 0);  /* reset the following counters  */
         
                } 
        } else if (layout.labeltype == LABEL_BIBLIO) {// ale970302
-               int i = LABEL_COUNTER_ENUMI - LABEL_FIRST_COUNTER + par->enumdepth;
+               int i = LABEL_COUNTER_ENUMI - LABEL_COUNTER_CHAPTER + par->enumdepth;
                par->incCounter(i);
                int number = par->getCounter(i);
-               if (!par->bibkey)
-                       par->bibkey = new InsetBibKey();
+               if (!par->bibkey) {
+                       InsetCommandParams p( "bibitem" );
+                       par->bibkey = new InsetBibKey(p);
+               }
                par->bibkey->setCounter(number);
                par->labelstring = layout.labelstring();
                
@@ -1743,36 +2012,37 @@ void LyXText::SetCounter(LyXParagraph * par) const
                string s = layout.labelstring();
                
                // the caption hack:
-      
                if (layout.labeltype == LABEL_SENSITIVE) {
+                       bool isOK (par->InInset() && par->InInset()->owner() &&
+                                  (par->InInset()->owner()->LyxCode() == Inset::FLOAT_CODE));
+#ifndef NEW_INSETS
                        if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
                            && (par->footnotekind == LyXParagraph::FIG
-                               || par->footnotekind == LyXParagraph::WIDE_FIG))
-                               if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                       s = "Figure:";
-                               else
-                                       s = ":øåéà";
-                       else if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
+                               || par->footnotekind == LyXParagraph::WIDE_FIG)) {
+                               s = (par->getParLanguage(buf->params)->lang() == "hebrew")
+                                       ? ":øåéà" : "Figure:";
+                       } else if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
                                 && (par->footnotekind == LyXParagraph::TAB
-                                    || par->footnotekind == LyXParagraph::WIDE_TAB))
-                               if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                       s = "Table:";
-                               else
-                                       s = ":äìáè";
-                       else if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
-                                && par->footnotekind == LyXParagraph::ALGORITHM)
-                               if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                       s = "Algorithm:";
-                               else
-                                       s = ":íúéøåâìà";
-                       else {
+                                    || par->footnotekind == LyXParagraph::WIDE_TAB)) {
+                               s = (par->getParLanguage(buf->params)->lang() == "hebrew")
+                                       ? ":äìáè" : "Table:";
+                       } else if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
+                                  && par->footnotekind == LyXParagraph::ALGORITHM) {
+                               s = (par->getParLanguage(buf->params)->lang() == "hebrew")
+                                       ? ":íúéøåâìà" : "Algorithm:";
+                       } else
+#endif
+                       if (isOK) {
+                               InsetFloat * tmp = static_cast<InsetFloat*>(par->InInset()->owner());
+                               Floating const & fl
+                                       = floatList.getType(tmp->type());
+                               // We should get the correct number here too.
+                               s = fl.name() + " #:";
+                       } else {
                                /* par->SetLayout(0); 
                                   s = layout->labelstring;  */
-                               if (par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT)
-                                       s = "Senseless: ";
-                               else
-                                       s = " :úåòîùî Ã¸Ã±Ã§";
-          
+                               s = (par->getParLanguage(buf->params)->lang() == "hebrew")
+                                       ? " :úåòîùî Ã¸Ã±Ã§" : "Senseless: ";
                        }
                }
                par->labelstring = s;
@@ -1787,120 +2057,146 @@ void LyXText::SetCounter(LyXParagraph * par) const
 
 /* Updates all counters BEHIND the row. Changed paragraphs
 * with a dynamic left margin will be rebroken. */ 
-void LyXText::UpdateCounters(Row * row) const
+void LyXText::UpdateCounters(BufferView * bview, Row * row) const
 {
        LyXParagraph * par;
        if (!row) {
                row = firstrow;
-               par = row->par;
-       }
-       else {
-               if (row->par->next
-                   && row->par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
-                       par = row->par->LastPhysicalPar()->Next();
+               par = row->par();
+       } else {
+               if (row->par()->next
+#ifndef NEW_INSETS
+                   && row->par()->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE
+#endif
+                       ) {
+#ifndef NEW_INSETS
+                       par = row->par()->LastPhysicalPar()->Next();
+#else
+                       par = row->par()->Next();
+#endif
                } else {
-                       par = row->par->next;
+                       par = row->par()->next;
                }
        }
 
        while (par) {
-               while (row->par != par)
-                       row = row->next;
+               while (row->par() != par)
+                       row = row->next();
                
-               SetCounter(par);
+               SetCounter(bview->buffer(), par);
                
                /* now  check for the headline layouts. remember that they
                 * have a dynamic left margin */ 
-               if (!par->IsDummy()
-                   && ( textclasslist.Style(parameters->textclass, par->layout).margintype == MARGIN_DYNAMIC
-                        || textclasslist.Style(parameters->textclass, par->layout).labeltype == LABEL_SENSITIVE)
-                       ){
+               if (
+#ifndef NEW_INSETS
+                       !par->IsDummy() &&
+#endif
+                   ( textclasslist.Style(bview->buffer()->params.textclass,
+                                            par->layout).margintype == MARGIN_DYNAMIC
+                        || textclasslist.Style(bview->buffer()->params.textclass,
+                                               par->layout).labeltype == LABEL_SENSITIVE)
+                       ) {
         
                        /* Rebreak the paragraph */ 
                        RemoveParagraph(row);
-                       AppendParagraph(row);
-       
+                       AppendParagraph(bview, row);
+
+#ifndef NEW_INSETS
                        /* think about the damned open footnotes! */ 
                        while (par->Next() &&
                               (par->Next()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
                                || par->Next()->IsDummy())){
                                par = par->Next();
                                if (par->IsDummy()) {
-                                       while (row->par != par)
-                                               row = row->next;
+                                       while (row->par() != par)
+                                               row = row->next();
                                        RemoveParagraph(row);
-                                       AppendParagraph(row);
+                                       AppendParagraph(bview, row);
                                }
                        }
+#endif
                }
-     
+#ifndef NEW_INSETS
                par = par->LastPhysicalPar()->Next();
+#else
+               par = par->Next();
+#endif
      
        }
 }
 
 
 /* insets an inset. */ 
-void LyXText::InsertInset(Inset *inset)
-{
-       SetUndo(Undo::INSERT, 
-               cursor.par->ParFromPos(cursor.pos)->previous, 
-               cursor.par->ParFromPos(cursor.pos)->next);
-       cursor.par->InsertChar(cursor.pos, LyXParagraph::META_INSET);
-       cursor.par->InsertInset(cursor.pos, inset);
-       InsertChar(LyXParagraph::META_INSET);  /* just to rebreak and refresh correctly.
-                                     * The character will not be inserted a
-                                     * second time */
-}
-
-
-// this is for the simple cut and paste mechanism
-static LyXParagraph * simple_cut_buffer = 0;
-static char simple_cut_buffer_textclass = 0;
-
-void DeleteSimpleCutBuffer()
+void LyXText::InsertInset(BufferView * bview, Inset * inset)
 {
-       if (!simple_cut_buffer)
+       if (!cursor.par()->InsertInsetAllowed(inset))
                return;
-       LyXParagraph * tmppar;
-
-       while (simple_cut_buffer) {
-               tmppar =  simple_cut_buffer;
-               simple_cut_buffer = simple_cut_buffer->next;
-               delete tmppar;
+       SetUndo(bview->buffer(), Undo::INSERT,
+#ifndef NEW_INSETS
+               cursor.par()->ParFromPos(cursor.pos())->previous, 
+               cursor.par()->ParFromPos(cursor.pos())->next
+#else
+               cursor.par()->previous, 
+               cursor.par()->next
+#endif
+               );
+       cursor.par()->InsertInset(cursor.pos(), inset);
+       InsertChar(bview, LyXParagraph::META_INSET);  /* just to rebreak and refresh correctly.
+                                     * The character will not be inserted a
+                                     * second time */
+#if 1
+       // if we enter a text-inset the cursor should be to the left side
+       // of it! This couldn't happen before as Undo was not handled inside
+       // inset now after the Undo LyX tries to call inset->Edit(...) again
+       // and cannot do this as the cursor is behind the inset and GetInset
+       // does not return the inset!
+       if (inset->IsTextInset()) {
+               if (cursor.par()->isRightToLeftPar(bview->buffer()->params))
+                       CursorRight(bview);
+               else
+                       CursorLeft(bview);
        }
-       simple_cut_buffer = 0;
+#endif
 }
 
 
 void LyXText::copyEnvironmentType()
 {
-       copylayouttype = cursor.par->GetLayout();
+       copylayouttype = cursor.par()->GetLayout();
 }
 
 
-void LyXText::pasteEnvironmentType()
+void LyXText::pasteEnvironmentType(BufferView * bview)
 {
-       SetLayout(copylayouttype);
+       SetLayout(bview, copylayouttype);
 }
 
 
-void LyXText::CutSelection(bool doclear)
+void LyXText::CutSelection(BufferView * bview, bool doclear)
 {
+       // Stuff what we got on the clipboard. Even if there is no selection.
+
+       // There is a problem with having the stuffing here in that the
+       // larger the selection the slower LyX will get. This can be
+       // solved by running the line below only when the selection has
+       // finished. The solution used currently just works, to make it
+       // faster we need to be more clever and probably also have more
+       // calls to stuffClipboard. (Lgb)
+       bview->stuffClipboard(selectionAsString(bview->buffer()));
+
        // This doesn't make sense, if there is no selection
        if (!selection)
                return;
    
        // OK, we have a selection. This is always between sel_start_cursor
-       // and sel_end cursor
-       LyXParagraph * tmppar;
-   
+       // and sel_end_cursor
+#ifndef NEW_INSETS
        // Check whether there are half footnotes in the selection
-       if (sel_start_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
-           || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
-               tmppar = sel_start_cursor.par;
-               while (tmppar != sel_end_cursor.par){
-                       if (tmppar->footnoteflag != sel_end_cursor.par->footnoteflag) {
+       if (sel_start_cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE
+           || sel_end_cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
+       LyXParagraph * tmppar = sel_start_cursor.par();
+               while (tmppar != sel_end_cursor.par()){
+                       if (tmppar->footnoteflag != sel_end_cursor.par()->footnoteflag) {
                                WriteAlert(_("Impossible operation"),
                                           _("Don't know what to do with half floats."),
                                           _("sorry."));
@@ -1909,255 +2205,111 @@ void LyXText::CutSelection(bool doclear)
                        tmppar = tmppar->Next();
                }
        }
-
-       /* table stuff -- begin */
-       if (sel_start_cursor.par->table || sel_end_cursor.par->table) {
-               if ( sel_start_cursor.par != sel_end_cursor.par) {
-                       WriteAlert(_("Impossible operation"),
-                                  _("Don't know what to do with half tables."),
-                                  _("sorry."));
-                       return;
-               }
-               sel_start_cursor.par->table->Reinit();
-       }
-       /* table stuff -- end */
+#endif
 
        // make sure that the depth behind the selection are restored, too
-       LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+#ifndef NEW_INSETS
+       LyXParagraph * endpar = sel_end_cursor.par()->LastPhysicalPar()->Next();
+#else
+       LyXParagraph * endpar = sel_end_cursor.par()->Next();
+#endif
        LyXParagraph * undoendpar = endpar;
-
+    
        if (endpar && endpar->GetDepth()) {
                while (endpar && endpar->GetDepth()) {
+#ifndef NEW_INSETS
                        endpar = endpar->LastPhysicalPar()->Next();
+#else
+                       endpar = endpar->Next();
+#endif
                        undoendpar = endpar;
                }
        } else if (endpar) {
                endpar = endpar->Next(); // because of parindents etc.
        }
-   
-       SetUndo(Undo::DELETE, 
+    
+       SetUndo(bview->buffer(), Undo::DELETE,
+#ifndef NEW_INSETS
                sel_start_cursor
-               .par->ParFromPos(sel_start_cursor.pos)->previous, 
+               .par()->ParFromPos(sel_start_cursor.pos())->previous,
+#else
+               sel_start_cursor.par()->previous,
+#endif
                undoendpar);
-   
-       // clear the simple_cut_buffer
-       DeleteSimpleCutBuffer();
-   
-       // set the textclass
-       simple_cut_buffer_textclass = parameters->textclass;
-
-#ifdef WITH_WARNINGS
-#warning Asger: Make cut more intelligent here.
-#endif
-       /* 
-          White paper for "intelligent" cutting:
-          
-          Example: "This is our text."
-          Using " our " as selection, cutting will give "This istext.".
-          Using "our" as selection, cutting will give "This is text.".
-          Using " our" as selection, cutting will give "This is text.".
-          Using "our " as selection, cutting will give "This is text.".
-          
-          All those four selections will (however) paste identically:
-          Pasting with the cursor right after the "is" will give the
-          original text with all four selections.
-          
-          The rationale is to be intelligent such that words are copied,
-          cut and pasted in a functional manner.
-          
-          This is not implemented yet. (Asger)
-
-          The changes below sees to do a lot of what you want. However
-          I have not verified that all cases work as they should:
-                    - cut in single row
-                    - cut in multiple row
-                    - cut with insets
-                    - cut across footnotes and paragraph
-          My simplistic tests show that the idea are basically sound but
-          there are some items to fix up...we only need to find them
-          first.
-
-          As do redo Asger's example above (with | beeing the cursor in the
-          result after cutting.):
-          
-          Example: "This is our text."
-          Using " our " as selection, cutting will give "This is|text.".
-          Using "our"   as selection, cutting will give "This is | text.".
-          Using " our"  as selection, cutting will give "This is| text.".
-          Using "our "  as selection, cutting will give "This is |text.".
-
-          (Lgb)
-       */
+    
+       CutAndPaste cap;
 
-#ifndef FIX_DOUBLE_SPACE
-       bool space_wrapped =
-               sel_end_cursor.par->IsLineSeparator(sel_end_cursor.pos);
-       if (sel_end_cursor.pos > 0
-           && sel_end_cursor.par->IsLineSeparator(sel_end_cursor.pos - 1)) {
-               // please break before a space at the end
-               sel_end_cursor.pos--;
-               space_wrapped = true;
-       }
-       // cut behind a space if there is one
-       while (sel_start_cursor.par->Last() > sel_start_cursor.pos
-              && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)
-              && (sel_start_cursor.par != sel_end_cursor.par
-                  || sel_start_cursor.pos < sel_end_cursor.pos))
-               sel_start_cursor.pos++; 
-#endif
        // there are two cases: cut only within one paragraph or
        // more than one paragraph
-   
-       if (sel_start_cursor.par->ParFromPos(sel_start_cursor.pos) 
-           == sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)) {
-               // only within one paragraph
-               simple_cut_buffer = new LyXParagraph;
-               LyXParagraph::size_type i =
-                       sel_start_cursor.pos;
-               for (; i < sel_end_cursor.pos; ++i) {
-                       /* table stuff -- begin */
-                       if (sel_start_cursor.par->table
-                           && sel_start_cursor.par->IsNewline(sel_start_cursor.pos)) {
-                               sel_start_cursor.par->CopyIntoMinibuffer(sel_start_cursor.pos);
-                               sel_start_cursor.pos++;
-                       } else {
-                               /* table stuff -- end */
-                               sel_start_cursor.par->CopyIntoMinibuffer(sel_start_cursor.pos);
-                               sel_start_cursor.par->Erase(sel_start_cursor.pos);
-                       }
-                       simple_cut_buffer->InsertFromMinibuffer(simple_cut_buffer->Last());
-               }
-#ifndef FIX_DOUBLE_SPACE
-               // check for double spaces
-               if (sel_start_cursor.pos &&
-                   sel_start_cursor.par->Last() > sel_start_cursor.pos
-                   && sel_start_cursor.par
-                   ->IsLineSeparator(sel_start_cursor.pos - 1)
-                   && sel_start_cursor.par
-                   ->IsLineSeparator(sel_start_cursor.pos)) {
-                       sel_start_cursor.par->Erase(sel_start_cursor.pos);
-               }
-               if (space_wrapped)
-                       simple_cut_buffer->InsertChar(i - sel_start_cursor.pos,
-                                                     ' ');
+#ifndef NEW_INSETS
+       if (sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos()) 
+           == sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos()))
+#else
+       if (sel_start_cursor.par() == sel_end_cursor.par())
 #endif
-               endpar = sel_end_cursor.par->Next();
+               {
+               // only within one paragraph
+               endpar = sel_start_cursor.par();
+               int pos = sel_end_cursor.pos();
+               cap.cutSelection(sel_start_cursor.par(), &endpar,
+                                sel_start_cursor.pos(), pos,
+                                bview->buffer()->params.textclass, doclear);
+               sel_end_cursor.pos(pos);
        } else {
-               // cut more than one paragraph
-   
-               sel_end_cursor.par
-                       ->BreakParagraphConservative(sel_end_cursor.pos);
-#ifndef FIX_DOUBLE_SPACE
-               // insert a space at the end if there was one
-               if (space_wrapped)
-                       sel_end_cursor.par
-                               ->InsertChar(sel_end_cursor.par->Last(), ' ');
-#endif
-               sel_end_cursor.par = sel_end_cursor.par->Next();
-               sel_end_cursor.pos = 0;
-   
-               cursor = sel_end_cursor;
-
-#ifndef FIX_DOUBLE_SPACE
-               // please break behind a space, if there is one.
-               // The space should be copied too
-               if (sel_start_cursor.par
-                   ->IsLineSeparator(sel_start_cursor.pos))
-                       sel_start_cursor.pos++;
-#endif   
-               sel_start_cursor.par
-                       ->BreakParagraphConservative(sel_start_cursor.pos);
-#ifndef FIX_DOUBLE_SPACE
-               if (!sel_start_cursor.pos
-                   || sel_start_cursor.par
-                   ->IsLineSeparator(sel_start_cursor.pos - 1)
-                   || sel_start_cursor.par
-                   ->IsNewline(sel_start_cursor.pos - 1)) {
-                       sel_start_cursor.par->Next()->InsertChar(0, ' ');
-               }
-#endif
-               // store the endparagraph for redoing later
-               endpar = sel_end_cursor.par->Next(); /* needed because
-                                                       the sel_end_
-                                                       cursor.par
-                                                       will be pasted! */
-   
-               // store the selection
-               simple_cut_buffer = sel_start_cursor.par
-                       ->ParFromPos(sel_start_cursor.pos)->next;
-               simple_cut_buffer->previous = 0;
-               sel_end_cursor.par->previous->next = 0;
-
-               // cut the selection
-               sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->next 
-                       = sel_end_cursor.par;
-   
-               sel_end_cursor.par->previous 
-                       = sel_start_cursor.par->ParFromPos(sel_start_cursor.pos);
-
-               // care about footnotes
-               if (simple_cut_buffer->footnoteflag) {
-                       LyXParagraph * tmppar = simple_cut_buffer;
-                       while (tmppar){
-                               tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE;
-                               tmppar = tmppar->next;
-                       }
-               }
+               endpar = sel_end_cursor.par();
 
-               // the cut selection should begin with standard layout
-               simple_cut_buffer->Clear(); 
-   
-               // paste the paragraphs again, if possible
-               if (doclear)
-                       sel_start_cursor.par->Next()->ClearParagraph();
-               if (sel_start_cursor.par->FirstPhysicalPar()->HasSameLayout(sel_start_cursor.par->Next())
-                   || 
-                   !sel_start_cursor.par->Next()->Last())
-                       sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->PasteParagraph();
-
-#ifndef FIX_DOUBLE_SPACE
-               // maybe a forgotten blank
-               if (sel_start_cursor.pos 
-                   && sel_start_cursor.par
-                   ->IsLineSeparator(sel_start_cursor.pos)
-                   && sel_start_cursor.par
-                   ->IsLineSeparator(sel_start_cursor.pos - 1)) {
-                       sel_start_cursor.par->Erase(sel_start_cursor.pos);
-               }
-#endif
+               int pos = sel_end_cursor.pos();
+               cap.cutSelection(sel_start_cursor.par(), &endpar,
+                                sel_start_cursor.pos(), pos,
+                                bview->buffer()->params.textclass, doclear);
+               cursor.par(endpar);
+               sel_end_cursor.par(endpar);
+               sel_end_cursor.pos(pos);
+               cursor.pos(sel_end_cursor.pos());
        }
+       endpar = endpar->Next();
 
        // sometimes necessary
        if (doclear)
-               sel_start_cursor.par->ClearParagraph();
+               sel_start_cursor.par()->StripLeadingSpaces(bview->buffer()->params.textclass);
 
-       RedoParagraphs(sel_start_cursor, endpar);
+       RedoParagraphs(bview, sel_start_cursor, endpar);
    
        ClearSelection();
        cursor = sel_start_cursor;
-       SetCursor(cursor.par, cursor.pos);
+       SetCursor(bview, cursor.par(), cursor.pos());
        sel_cursor = cursor;
-       UpdateCounters(cursor.row);
+       UpdateCounters(bview, cursor.row());
 }
 
-    
-void LyXText::CopySelection()
+
+void LyXText::CopySelection(BufferView * bview)
 {
+       // Stuff what we got on the clipboard. Even if there is no selection.
+
+       // There is a problem with having the stuffing here in that the
+       // larger the selection the slower LyX will get. This can be
+       // solved by running the line below only when the selection has
+       // finished. The solution used currently just works, to make it
+       // faster we need to be more clever and probably also have more
+       // calls to stuffClipboard. (Lgb)
+       bview->stuffClipboard(selectionAsString(bview->buffer()));
+
        // this doesnt make sense, if there is no selection
        if (!selection)
                return;
 
        // ok we have a selection. This is always between sel_start_cursor
        // and sel_end cursor
-       LyXParagraph * tmppar;
-   
+
+#ifndef NEW_INSETS
        /* check wether there are half footnotes in the selection */
-       if (sel_start_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
-           || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
-               tmppar = sel_start_cursor.par;
-               while (tmppar != sel_end_cursor.par) {
+       if (sel_start_cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE
+           || sel_end_cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
+               LyXParagraph * tmppar = sel_start_cursor.par();
+               while (tmppar != sel_end_cursor.par()) {
                        if (tmppar->footnoteflag !=
-                           sel_end_cursor.par->footnoteflag) {
+                           sel_end_cursor.par()->footnoteflag) {
                                WriteAlert(_("Impossible operation"),
                                           _("Don't know what to do"
                                             " with half floats."),
@@ -2167,392 +2319,101 @@ void LyXText::CopySelection()
                        tmppar = tmppar->Next();
                }
        }
-
-       /* table stuff -- begin */
-       if (sel_start_cursor.par->table || sel_end_cursor.par->table){
-               if ( sel_start_cursor.par != sel_end_cursor.par){
-                       WriteAlert(_("Impossible operation"),
-                                  _("Don't know what to do with half tables."),
-                                  _("sorry."));
-                       return;
-               }
-       }
-       /* table stuff -- end */
+#endif
    
-       // delete the simple_cut_buffer
-       DeleteSimpleCutBuffer();
-
-       // set the textclass
-       simple_cut_buffer_textclass = parameters->textclass;
-
-#ifdef FIX_DOUBLE_SPACE
        // copy behind a space if there is one
-       while (sel_start_cursor.par->Last() > sel_start_cursor.pos
-              && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)
-              && (sel_start_cursor.par != sel_end_cursor.par
-                  || sel_start_cursor.pos < sel_end_cursor.pos))
-               sel_start_cursor.pos++; 
-#endif
-       // there are two cases: copy only within one paragraph
-       // or more than one paragraph
-       if (sel_start_cursor.par->ParFromPos(sel_start_cursor.pos) 
-           == sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)) {
-               // only within one paragraph
-               simple_cut_buffer = new LyXParagraph;
-               LyXParagraph::size_type i = 0;
-               for (i = sel_start_cursor.pos; i < sel_end_cursor.pos; ++i){
-                       sel_start_cursor.par->CopyIntoMinibuffer(i);
-                       simple_cut_buffer->InsertFromMinibuffer(i - sel_start_cursor.pos);
-               }
-       } else {
-               // copy more than one paragraph
-               // clone the paragraphs within the selection
-               tmppar =
-                       sel_start_cursor.par->ParFromPos(sel_start_cursor.pos);
-               simple_cut_buffer = tmppar->Clone();
-               LyXParagraph *tmppar2 = simple_cut_buffer;
-     
-               while (tmppar != sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)
-                      && tmppar->next) {
-                       tmppar = tmppar->next;
-                       tmppar2->next = tmppar->Clone();
-                       tmppar2->next->previous = tmppar2;
-                       tmppar2 = tmppar2->next;
-               }
-               tmppar2->next = 0;
+       while (sel_start_cursor.par()->Last() > sel_start_cursor.pos()
+              && sel_start_cursor.par()->IsLineSeparator(sel_start_cursor.pos())
+              && (sel_start_cursor.par() != sel_end_cursor.par()
+                  || sel_start_cursor.pos() < sel_end_cursor.pos()))
+               sel_start_cursor.pos(sel_start_cursor.pos() + 1); 
 
-               // care about footnotes
-               if (simple_cut_buffer->footnoteflag) {
-                       tmppar = simple_cut_buffer;
-                       while (tmppar){
-                               tmppar->footnoteflag =
-                                       LyXParagraph::NO_FOOTNOTE;
-                               tmppar = tmppar->next;
-                       }
-               }
-               
-               // the simple_cut_buffer paragraph is too big
-               LyXParagraph::size_type tmpi2 =
-                       sel_start_cursor.par->PositionInParFromPos(sel_start_cursor.pos);
-               for (; tmpi2; --tmpi2)
-                       simple_cut_buffer->Erase(0);
-               
-               // now tmppar 2 is too big, delete all after sel_end_cursor.pos
-     
-               tmpi2 = sel_end_cursor.par->PositionInParFromPos(sel_end_cursor.pos);
-               while (tmppar2->size() > tmpi2) {
-                       tmppar2->Erase(tmppar2->size() - 1);
-               }
-       }
+       CutAndPaste cap;
+
+       cap.copySelection(sel_start_cursor.par(), sel_end_cursor.par(),
+                         sel_start_cursor.pos(), sel_end_cursor.pos(),
+                         bview->buffer()->params.textclass);
 }
-          
 
-void LyXText::PasteSelection()
+
+void LyXText::PasteSelection(BufferView * bview)
 {
+       CutAndPaste cap;
+
        // this does not make sense, if there is nothing to paste
-       if (!simple_cut_buffer)
+       if (!cap.checkPastePossible(cursor.par(), cursor.pos()))
                return;
 
-       LyXParagraph * tmppar;
-       LyXParagraph * endpar;
-
-       LyXCursor tmpcursor;
-
-       // be carefull with footnotes in footnotes
-       if (cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
-      
-               // check whether the cut_buffer includes a footnote
-               tmppar = simple_cut_buffer;
-               while (tmppar
-                      && tmppar->footnoteflag == LyXParagraph::NO_FOOTNOTE)
-                       tmppar = tmppar->next;
-      
-               if (tmppar) {
-                       WriteAlert(_("Impossible operation"),
-                                  _("Can't paste float into float!"),
-                                  _("Sorry."));
-                       return;
-               }
-       }
-
-       /* table stuff -- begin */
-       if (cursor.par->table) {
-               if (simple_cut_buffer->next) {
-                       WriteAlert(_("Impossible operation"),
-                                  _("Table cell cannot include more than one paragraph!"),
-                                  _("Sorry."));
-                       return;
-               }
-       }
-       /* table stuff -- end */
-   
-       SetUndo(Undo::INSERT, 
-               cursor.par->ParFromPos(cursor.pos)->previous, 
-               cursor.par->ParFromPos(cursor.pos)->next); 
-
-       tmpcursor = cursor;
-
-       // There are two cases: cutbuffer only one paragraph or many
-       if (!simple_cut_buffer->next) {
-               // only within a paragraph
-
-#ifndef FIX_DOUBLE_SPACE
-               // please break behind a space, if there is one
-               while (tmpcursor.par->Last() > tmpcursor.pos
-                      && tmpcursor.par->IsLineSeparator(tmpcursor.pos))
-                       tmpcursor.pos++; 
-#endif
-               tmppar = simple_cut_buffer->Clone();
-               /* table stuff -- begin */
-               bool table_too_small = false;
-               if (tmpcursor.par->table) {
-                       while (simple_cut_buffer->size()
-                              && !table_too_small) {
-                               if (simple_cut_buffer->IsNewline(0)){
-                                       while(tmpcursor.pos < tmpcursor.par->Last() && !tmpcursor.par->IsNewline(tmpcursor.pos))
-                                               tmpcursor.pos++;
-                                       simple_cut_buffer->Erase(0);
-                                       if (tmpcursor.pos < tmpcursor.par->Last())
-                                               tmpcursor.pos++;
-                                       else
-                                               table_too_small = true;
-                               } else {
-#ifdef FIX_DOUBLE_SPACE
-                                       // This is an attempt to fix the
-                                       // "never insert a space at the
-                                       // beginning of a paragraph" problem.
-                                       if (tmpcursor.pos == 0
-                                           && simple_cut_buffer->IsLineSeparator(0)) {
-                                               simple_cut_buffer->Erase(0);
-                                       } else {
-                                               simple_cut_buffer->CutIntoMinibuffer(0);
-                                               simple_cut_buffer->Erase(0);
-                                               tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
-                                               tmpcursor.pos++;
-                                       }
+       SetUndo(bview->buffer(), Undo::INSERT,
+#ifndef NEW_INSETS
+               cursor.par()->ParFromPos(cursor.pos())->previous, 
+               cursor.par()->ParFromPos(cursor.pos())->next
 #else
-                                       simple_cut_buffer->CutIntoMinibuffer(0);
-                                       simple_cut_buffer->Erase(0);
-                                       tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
-                                       tmpcursor.pos++;
+               cursor.par()->previous, 
+               cursor.par()->next
 #endif
-                               }
-                       }
-               } else {
-                       /* table stuff -- end */
-                       // Some provisions should be done here for checking
-                       // if we are inserting at the beginning of a
-                       // paragraph. If there are a space at the beginning
-                       // of the text to insert and we are inserting at
-                       // the beginning of the paragraph the space should
-                       // be removed.
-                       while (simple_cut_buffer->size()) {
-#ifdef FIX_DOUBLE_SPACE
-                               // This is an attempt to fix the
-                               // "never insert a space at the
-                               // beginning of a paragraph" problem.
-                               if (tmpcursor.pos == 0
-                                   && simple_cut_buffer->IsLineSeparator(0)) {
-                                       simple_cut_buffer->Erase(0);
-                               } else {
-                                       simple_cut_buffer->CutIntoMinibuffer(0);
-                                       simple_cut_buffer->Erase(0);
-                                       tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
-                                       tmpcursor.pos++;
-                               }
-#else
-                               simple_cut_buffer->CutIntoMinibuffer(0);
-                               simple_cut_buffer->Erase(0);
-                               tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
-                               tmpcursor.pos++;
-#endif
-                       }
-               }
-               delete simple_cut_buffer;
-               simple_cut_buffer = tmppar;
-               endpar = tmpcursor.par->Next();
-       } else {
-               // many paragraphs
-
-               // make a copy of the simple cut_buffer
-               tmppar = simple_cut_buffer;
-               LyXParagraph * simple_cut_clone = tmppar->Clone();
-               LyXParagraph * tmppar2 = simple_cut_clone;
-               if (cursor.par->footnoteflag){
-                       tmppar->footnoteflag = cursor.par->footnoteflag;
-                       tmppar->footnotekind = cursor.par->footnotekind;
-               }
-               while (tmppar->next) {
-                       tmppar = tmppar->next;
-                       tmppar2->next = tmppar->Clone();
-                       tmppar2->next->previous = tmppar2;
-                       tmppar2 = tmppar2->next;
-                       if (cursor.par->footnoteflag){
-                               tmppar->footnoteflag = cursor.par->footnoteflag;
-                               tmppar->footnotekind = cursor.par->footnotekind;
-                       }
-               }
-     
-               // make sure there is no class difference
-               SwitchLayoutsBetweenClasses(simple_cut_buffer_textclass,
-                                           parameters->textclass,
-                                           simple_cut_buffer);
-     
-               // make the simple_cut_buffer exactly the same layout than
-               // the cursor paragraph
-               simple_cut_buffer->MakeSameLayout(cursor.par);
-     
-               // find the end of the buffer
-               LyXParagraph * lastbuffer = simple_cut_buffer;
-               while (lastbuffer->Next())
-                       lastbuffer = lastbuffer->Next();
-     
-#ifndef FIX_DOUBLE_SPACE
-               // Please break behind a space, if there is one. The space 
-               // should be copied too.
-               if (cursor.par->Last() > cursor.pos
-                   && cursor.par->IsLineSeparator(cursor.pos))
-                       cursor.pos++; 
-#endif
-               bool paste_the_end = false;
-
-               // open the paragraph for inserting the simple_cut_buffer
-               // if necessary
-               if (cursor.par->Last() > cursor.pos || !cursor.par->Next()){
-                       cursor.par->BreakParagraphConservative(cursor.pos);
-                       paste_the_end = true;
-               }
-
-#ifndef FIX_DOUBLE_SPACE
-               // be careful with double spaces
-               if ((!cursor.par->Last()
-                    || cursor.par->IsLineSeparator(cursor.pos - 1)
-                    || cursor.par->IsNewline(cursor.pos - 1))
-                   && simple_cut_buffer->text.size()
-                   && simple_cut_buffer->IsLineSeparator(0))
-                       simple_cut_buffer->Erase(0);
-#endif
-               // set the end for redoing later
-               endpar = cursor.par->ParFromPos(cursor.pos)->next->Next();
-     
-               // paste it!
-               lastbuffer->ParFromPos(lastbuffer->Last())->next =
-                       cursor.par->ParFromPos(cursor.pos)->next;
-               cursor.par->ParFromPos(cursor.pos)->next->previous =
-                       lastbuffer->ParFromPos(lastbuffer->Last());
-     
-               cursor.par->ParFromPos(cursor.pos)->next = simple_cut_buffer;
-               simple_cut_buffer->previous =
-                       cursor.par->ParFromPos(cursor.pos);
-   
-               if (cursor.par->ParFromPos(cursor.pos)->Next() == lastbuffer)
-                       lastbuffer = cursor.par;
-     
-               cursor.par->ParFromPos(cursor.pos)->PasteParagraph();
-     
-               // store the new cursor position
-               tmpcursor.par = lastbuffer;
-               tmpcursor.pos = lastbuffer->Last();
-     
-               // maybe some pasting
-               if (lastbuffer->Next() && paste_the_end) {
-                       if (lastbuffer->Next()->HasSameLayout(lastbuffer)) {
-#ifndef FIX_DOUBLE_SPACE
-                               // be careful with double spaces
-                               if ((!lastbuffer->Last()
-                                    || lastbuffer->IsLineSeparator(lastbuffer->Last() - 1)
-                                    || lastbuffer->IsNewline(lastbuffer->Last() - 1))
-                                   && lastbuffer->Next()->Last()
-                                   && lastbuffer->Next()->IsLineSeparator(0))
-                                       lastbuffer->Next()->Erase(0);
-#endif
-                               lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
-        
-                       } else if (!lastbuffer->Next()->Last()) {
-                               lastbuffer->Next()->MakeSameLayout(lastbuffer);
-#ifndef FIX_DOUBLE_SPACE
-                               // be careful witth double spaces
-                               if ((!lastbuffer->Last()
-                                    || lastbuffer->IsLineSeparator(lastbuffer->Last() - 1)
-                                    || lastbuffer->IsNewline(lastbuffer->Last() - 1))
-                                   && lastbuffer->Next()->Last()
-                                   && lastbuffer->Next()->IsLineSeparator(0))
-                                       lastbuffer->Next()->Erase(0);
-#endif
-                               lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
-        
-                       } else if (!lastbuffer->Last()) {
-                               lastbuffer->MakeSameLayout(lastbuffer->next);
-#ifndef FIX_DOUBLE_SPACE
-                               // be careful witth double spaces
-                               if ((!lastbuffer->Last()
-                                    || lastbuffer->IsLineSeparator(lastbuffer->Last() - 1)
-                                    || lastbuffer->IsNewline(lastbuffer->Last() - 1))
-                                   && lastbuffer->Next()->Last()
-                                   && lastbuffer->Next()->IsLineSeparator(0))
-                                       lastbuffer->Next()->Erase(0);
-#endif
-                               lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
-        
-                       } else
-                               lastbuffer->Next()->ClearParagraph();
-               }
+               ); 
 
-               // restore the simple cut buffer
-               simple_cut_buffer = simple_cut_clone;
-       }
+       LyXParagraph * endpar;
+       LyXParagraph * actpar = cursor.par();
 
-       RedoParagraphs(cursor, endpar);
+       int pos = cursor.pos();
+       cap.pasteSelection(&actpar, &endpar, pos, bview->buffer()->params.textclass);
     
-       SetCursor(cursor.par, cursor.pos);
+       RedoParagraphs(bview, cursor, endpar);
+       
+       SetCursor(bview, cursor.par(), cursor.pos());
        ClearSelection();
    
        sel_cursor = cursor;
-       SetCursor(tmpcursor.par, tmpcursor.pos);
+       SetCursor(bview, actpar, pos);
        SetSelection();
-       UpdateCounters(cursor.row);
+       UpdateCounters(bview, cursor.row());
 }
-   
+
 
 // returns a pointer to the very first LyXParagraph
 LyXParagraph * LyXText::FirstParagraph() const
 {
-       return params->paragraph;
+       return OwnerParagraph();
 }
 
 
 // returns true if the specified string is at the specified position
 bool LyXText::IsStringInText(LyXParagraph * par,
                             LyXParagraph::size_type pos,
-                            char const * str) const
+                            string const & str) const
 {
-       if (par) {
-               int i = 0;
-               while (pos + i < par->Last() && str[i] && 
-                      str[i] == par->GetChar(pos + i)) {
-                       ++i;
-               }
-               if (!str[i])
-                       return true;
+       if (!par)
+               return false;
+
+       LyXParagraph::size_type i = 0;
+       while (pos + i < par->Last()
+              && string::size_type(i) < str.length()
+              && str[i] == par->GetChar(pos + i)) {
+               ++i;
        }
+       if (str.length() == string::size_type(i))
+               return true;
        return false;
 }
 
 
 // sets the selection over the number of characters of string, no check!!
-void LyXText::SetSelectionOverString(char const * string)
+void LyXText::SetSelectionOverString(BufferView * bview, string const & str)
 {
        sel_cursor = cursor;
-       for (int i = 0; string[i]; ++i)
-               CursorRight();
+       for (int i = 0; str[i]; ++i)
+               CursorRight(bview);
        SetSelection();
 }
 
 
 // simple replacing. The font of the first selected character is used
-void LyXText::ReplaceSelectionWithString(char const * str)
+void LyXText::ReplaceSelectionWithString(BufferView * bview,
+                                        string const & str)
 {
-       SetCursorParUndo();
+       SetCursorParUndo(bview->buffer());
        FreezeUndo();
 
        if (!selection) { // create a dummy selection
@@ -2561,18 +2422,19 @@ void LyXText::ReplaceSelectionWithString(char const * str)
        }
 
        // Get font setting before we cut
-       LyXParagraph::size_type pos = sel_end_cursor.pos;
-       LyXFont font = sel_start_cursor.par->GetFontSettings(sel_start_cursor.pos);
+       LyXParagraph::size_type pos = sel_end_cursor.pos();
+       LyXFont const font = sel_start_cursor.par()
+               ->GetFontSettings(bview->buffer()->params,
+                                 sel_start_cursor.pos());
 
        // Insert the new string
-       for (int i = 0; str[i]; ++i) {
-               sel_end_cursor.par->InsertChar(pos, str[i]);
-               sel_end_cursor.par->SetFont(pos, font);
+       for (string::const_iterator cit = str.begin(); cit != str.end(); ++cit) {
+               sel_end_cursor.par()->InsertChar(pos, (*cit), font);
                ++pos;
        }
-
+       
        // Cut the selection
-       CutSelection();
+       CutSelection(bview);
 
        UnFreezeUndo();
 }
@@ -2580,10 +2442,10 @@ void LyXText::ReplaceSelectionWithString(char const * str)
 
 // if the string can be found: return true and set the cursor to
 // the new position
-bool LyXText::SearchForward(char const * str) const
+bool LyXText::SearchForward(BufferView * bview, string const & str) const
 {
-       LyXParagraph * par = cursor.par;
-       LyXParagraph::size_type pos = cursor.pos;
+       LyXParagraph * par = cursor.par();
+       LyXParagraph::size_type pos = cursor.pos();
        while (par && !IsStringInText(par, pos, str)) {
                if (pos < par->Last() - 1)
                        ++pos;
@@ -2593,7 +2455,7 @@ bool LyXText::SearchForward(char const * str) const
                }
        }
        if (par) {
-               SetCursor(par, pos);
+               SetCursor(bview, par, pos);
                return true;
        }
        else
@@ -2601,10 +2463,10 @@ bool LyXText::SearchForward(char const * str) const
 }
 
 
-bool LyXText::SearchBackward(char const * string) const
+bool LyXText::SearchBackward(BufferView * bview, string const & str) const
 {
-       LyXParagraph * par = cursor.par;
-       int pos = cursor.pos;
+       LyXParagraph * par = cursor.par();
+       int pos = cursor.pos();
 
        do {
                if (pos > 0)
@@ -2617,10 +2479,10 @@ bool LyXText::SearchBackward(char const * string) const
                                        pos = par->Last() - 1;
                        } while (par && pos < 0);
                }
-       } while (par && !IsStringInText(par, pos, string));
+       } while (par && !IsStringInText(par, pos, str));
   
        if (par) {
-               SetCursor(par, pos);
+               SetCursor(bview, par, pos);
                return true;
        } else
                return false;
@@ -2628,19 +2490,18 @@ bool LyXText::SearchBackward(char const * string) const
 
 
 // needed to insert the selection
-void LyXText::InsertStringA(string const & str)
+void LyXText::InsertStringA(BufferView * bview, string const & str)
 {
-       LyXParagraph * par = cursor.par;
-       LyXParagraph::size_type pos = cursor.pos;
+       LyXParagraph * par = cursor.par();
+       LyXParagraph::size_type pos = cursor.pos();
        LyXParagraph::size_type a = 0;
-        int cell = 0;
-       LyXParagraph * endpar = cursor.par->Next();
+       LyXParagraph * endpar = cursor.par()->Next();
        
-       SetCursorParUndo();
+       SetCursorParUndo(bview->buffer());
        
        bool flag =
-               textclasslist.Style(parameters->textclass, 
-                                   cursor.par->GetLayout()).isEnvironment();
+               textclasslist.Style(bview->buffer()->params.textclass, 
+                                   cursor.par()->GetLayout()).isEnvironment();
        // only to be sure, should not be neccessary
        ClearSelection();
        
@@ -2651,106 +2512,60 @@ void LyXText::InsertStringA(string const & str)
                        if (str[i] == ' ' 
                            && i + 1 < str.length() && str[i + 1] != ' '
                            && pos && par->GetChar(pos - 1)!= ' ') {
-                               par->InsertChar(pos,' ');
-                               par->SetFont(pos, current_font);
+                               par->InsertChar(pos, ' ', current_font);
                                ++pos;
-                       } else if (par->table) {
-                               if (str[i] == '\t') {
-                                       while((pos < par->size()) &&
-                                             (par->GetChar(pos) != LyXParagraph::META_NEWLINE))
-                                               ++pos;
-                                       if (pos < par->size())
-                                               ++pos;
-                                       else // no more fields to fill skip the rest
-                                               break;
-                               } else if ((str[i] != 13) &&
-                                          ((str[i] & 127) >= ' ')) {
-                                       par->InsertChar(pos, str[i]);
-                                       par->SetFont(pos, current_font);
-                                       ++pos;
-                               }
                         } else if (str[i] == ' ') {
-#if 1
                                InsetSpecialChar * new_inset =
                                        new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
-                               par->InsertChar(pos, LyXParagraph::META_INSET);
-                               par->SetFont(pos, current_font);
-                               par->InsertInset(pos, new_inset);
-#else
-                               par->InsertChar(pos, LyXParagraph::META_PROTECTED_SEPARATOR);
-                               par->SetFont(pos, current_font);
-#endif
+                               if (par->InsertInsetAllowed(new_inset)) {
+                                       par->InsertInset(pos, new_inset,
+                                                        current_font);
+                               } else {
+                                       delete new_inset;
+                               }
                                ++pos;
                        } else if (str[i] == '\t') {
                                for (a = pos; a < (pos / 8 + 1) * 8 ; ++a) {
-#if 1
                                InsetSpecialChar * new_inset =
                                        new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
-                               par->InsertChar(pos, LyXParagraph::META_INSET);
-                               par->SetFont(pos, current_font);
-                               par->InsertInset(pos, new_inset);
-#else
-                                       par->InsertChar(a, LyXParagraph::META_PROTECTED_SEPARATOR);
-                                       par->SetFont(a, current_font);
-#endif
+                               if (par->InsertInsetAllowed(new_inset)) {
+                                       par->InsertInset(pos, new_inset,
+                                                        current_font);
+                               } else {
+                                       delete new_inset;
+                               }
                                }
                                pos = a;
                        } else if (str[i] != 13 && 
                                   // Ignore unprintables
                                   (str[i] & 127) >= ' ') {
-                               par->InsertChar(pos, str[i]);
-                               par->SetFont(pos, current_font);
+                               par->InsertChar(pos, str[i], current_font);
                                ++pos;
                        }
                } else {
-                        if (par->table) {
-                                if (i + 1 >= str.length()) {
-                                        ++pos;
-                                        break;
-                                }
-                                while((pos < par->size()) &&
-                                      (par->GetChar(pos) != LyXParagraph::META_NEWLINE))
-                                        ++pos;
-                                ++pos;
-                                cell = NumberOfCell(par, pos);
-                                while((pos < par->size()) &&
-                                      !(par->table->IsFirstCell(cell))) {
-
-                                        while((pos < par->size()) &&
-                                              (par->GetChar(pos) != LyXParagraph::META_NEWLINE))
-                                                ++pos;
-                                        ++pos;
-                                        cell = NumberOfCell(par, pos);
-                                }
-                                if (pos >= par->size())
-                                        // no more fields to fill skip the rest
-                                        break;
-                        } else {
-                                if (!par->size()) { // par is empty
-#if 1
-                                       InsetSpecialChar * new_inset =
-                                               new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
-                                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                                       par->SetFont(pos, current_font);
-                                       par->InsertInset(pos, new_inset);
-#else
-                                        par->InsertChar(pos, LyXParagraph::META_PROTECTED_SEPARATOR);
-                                       par->SetFont(pos, current_font);
-#endif
-                                        ++pos;
-                                }
-                                par->BreakParagraph(pos, flag);
-                                par = par->Next();
-                                pos = 0;
-                        }
+                       if (!par->size()) { // par is empty
+                               InsetSpecialChar * new_inset =
+                                       new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
+                               if (par->InsertInsetAllowed(new_inset)) {
+                                       par->InsertInset(pos,
+                                                        new_inset,
+                                                        current_font);
+                               } else {
+                                       delete new_inset;
+                               }
+                               ++pos;
+                       }
+                       par->BreakParagraph(bview->buffer()->params, pos, flag);
+                       par = par->Next();
+                       pos = 0;
                }
                ++i;
        }
        
-       RedoParagraphs(cursor, endpar);
-       SetCursor(cursor.par, cursor.pos);
+       RedoParagraphs(bview, cursor, endpar);
+       SetCursor(bview, cursor.par(), cursor.pos());
        sel_cursor = cursor;
-       SetCursor(par, pos);
+       SetCursor(bview, par, pos);
        SetSelection();
 }
 
@@ -2759,17 +2574,16 @@ void LyXText::InsertStringA(string const & str)
  * that are ignored .Double spaces are also converted into one. Spaces at
  * the beginning of a paragraph are forbidden. tabs are converted into one
  * space. then InsertStringA is called */ 
-void LyXText::InsertStringB(string const & s)
+void LyXText::InsertStringB(BufferView * bview, string const & s)
 {
        string str(s);
-       LyXParagraph * par = cursor.par;
        string::size_type i = 1;
        while (i < str.length()) {
-               if (str[i] == '\t' && !par->table)
+               if (str[i] == '\t')
                        str[i] = ' ';
                if (str[i] == ' ' && i + 1 < str.length() && str[i + 1] == ' ')
                        str[i] = 13;
-               if (str[i] == '\n' && i + 1 < str.length() && !par->table){
+               if (str[i] == '\n' && i + 1 < str.length(){
                        if (str[i + 1] != '\n') {
                                if (str[i - 1] != ' ')
                                        str[i] = ' ';
@@ -2787,158 +2601,108 @@ void LyXText::InsertStringB(string const & s)
                }
                ++i;
        }
-       InsertStringA(str);
+       InsertStringA(bview, str);
 }
 
 
-bool LyXText::GotoNextError() const
+bool LyXText::GotoNextError(BufferView * bview) const
 {
        LyXCursor res = cursor;
        do {
-               if (res.pos < res.par->Last() - 1) {
-                       res.pos++;
-               }
-               else  {
-                       res.par = res.par->Next();
-                       res.pos = 0;
+               if (res.pos() < res.par()->Last() - 1) {
+                       res.pos(res.pos() + 1);
+               } else  {
+                       res.par(res.par()->Next());
+                       res.pos(0);
                }
       
-       } while (res.par && 
-                !(res.par->GetChar(res.pos) == LyXParagraph::META_INSET
-                  && res.par->GetInset(res.pos)->AutoDelete()));
+       } while (res.par() && 
+                !(res.par()->GetChar(res.pos()) == LyXParagraph::META_INSET
+                  && res.par()->GetInset(res.pos())->AutoDelete()));
    
-       if (res.par) {
-               SetCursor(res.par, res.pos);
+       if (res.par()) {
+               SetCursor(bview, res.par(), res.pos());
                return true;
        }
        return false;
 }
 
 
-bool LyXText::GotoNextNote() const
+bool LyXText::GotoNextNote(BufferView * bview) const
 {
        LyXCursor res = cursor;
        do {
-               if (res.pos < res.par->Last() - 1) {
-                       res.pos++;
+               if (res.pos() < res.par()->Last() - 1) {
+                       res.pos(res.pos() + 1);
                } else  {
-                       res.par = res.par->Next();
-                       res.pos = 0;
+                       res.par(res.par()->Next());
+                       res.pos(0);
                }
       
-       } while (res.par && 
-                !(res.par->GetChar(res.pos) == LyXParagraph::META_INSET
-                  && res.par->GetInset(res.pos)->LyxCode() == Inset::IGNORE_CODE));
+       } while (res.par() && 
+                !(res.par()->GetChar(res.pos()) == LyXParagraph::META_INSET
+                  && res.par()->GetInset(res.pos())->LyxCode() == Inset::IGNORE_CODE));
    
-       if (res.par) {
-               SetCursor(res.par, res.pos);
+       if (res.par()) {
+               SetCursor(bview, res.par(), res.pos());
                return true;
        }
        return false;
 }
 
 
-int LyXText::SwitchLayoutsBetweenClasses(LyXTextClassList::size_type class1,
-                                        LyXTextClassList::size_type class2,
-                                        LyXParagraph * par)
-{
-       int ret = 0;
-       if (!par || class1 == class2)
-               return ret;
-       par = par->FirstPhysicalPar();
-       while (par) {
-               string name = textclasslist.NameOfLayout(class1, par->layout);
-               int lay = 0;
-               pair<bool, LyXTextClass::LayoutList::size_type> pp =
-                       textclasslist.NumberOfLayout(class2, name);
-               if (pp.first) {
-                       lay = pp.second;
-               } else { // layout not found
-                       // use default layout "Standard" (0)
-                       lay = 0;
-               }
-               par->layout = lay;
-      
-               if (name != textclasslist.NameOfLayout(class2, par->layout)) {
-                       ++ret;
-                       string s = "Layout had to be changed from\n"
-                               + name + " to " + textclasslist.NameOfLayout(class2, par->layout)
-                               + "\nbecause of class conversion from\n"
-                               + textclasslist.NameOfClass(class1) + " to "
-                               + textclasslist.NameOfClass(class2);
-                       InsetError * new_inset = new InsetError(s);
-                       par->InsertChar(0, LyXParagraph::META_INSET);
-                       par->InsertInset(0, new_inset);
-               }
-      
-               par = par->next;
-       }
-       return ret;
-}
-
-
-void LyXText::CheckParagraph(LyXParagraph * par,
+void LyXText::CheckParagraph(BufferView * bview, LyXParagraph * par,
                             LyXParagraph::size_type pos)
 {
-  
-       LyXCursor tmpcursor;
+       LyXCursor tmpcursor;                    
 
-       /* table stuff -- begin*/
-   
-       if (par->table) {
-               CheckParagraphInTable(par, pos);
-       }
-       else {
-               /* table stuff -- end*/
-     
-               long y = 0;
-               LyXParagraph::size_type z;
-               Row * row = GetRow(par, pos, y);
-     
-               // is there a break one row above
-               if (row->previous && row->previous->par == row->par) {
-                       z = NextBreakPoint(row->previous, paperwidth);
-                       if ( z >= row->pos) {
-                               // set the dimensions of the row above
-                               y -= row->previous->height;
-                               refresh_y = y;
-                               refresh_row = row->previous;
-                               status = LyXText::NEED_MORE_REFRESH;
-       
-                               BreakAgain(row->previous);
-
-                               // set the cursor again. Otherwise
-                               // dangling pointers are possible
-                               SetCursor(cursor.par, cursor.pos);
-                               sel_cursor = cursor;
-                               return;
-                       }
+       int y = 0;
+       LyXParagraph::size_type z;
+       Row * row = GetRow(par, pos, y);
+       
+       // is there a break one row above
+       if (row->previous() && row->previous()->par() == row->par()) {
+               z = NextBreakPoint(bview, row->previous(), workWidth(bview));
+               if (z >= row->pos()) {
+                       // set the dimensions of the row above
+                       y -= row->previous()->height();
+                       refresh_y = y;
+                       refresh_row = row->previous();
+                       status = LyXText::NEED_MORE_REFRESH;
+                       
+                       BreakAgain(bview, row->previous());
+                       
+                       // set the cursor again. Otherwise
+                       // dangling pointers are possible
+                       SetCursor(bview, cursor.par(), cursor.pos(),
+                                 false, cursor.boundary());
+                       sel_cursor = cursor;
+                       return;
                }
+       }
 
-               int tmpheight = row->height;
-               LyXParagraph::size_type tmplast = RowLast(row);
-               refresh_y = y;
-               refresh_row = row;
-
-               BreakAgain(row);
-               if (row->height == tmpheight && RowLast(row) == tmplast)
-                       status = LyXText::NEED_VERY_LITTLE_REFRESH;
-               else
-                       status = LyXText::NEED_MORE_REFRESH; 
-   
-               // check the special right address boxes
-               if (textclasslist.Style(parameters->textclass,
-                                       par->GetLayout()).margintype
-                   == MARGIN_RIGHT_ADDRESS_BOX) {
-                       tmpcursor.par = par;
-                       tmpcursor.row = row;
-                       tmpcursor.y = y;
-                       tmpcursor.x = 0;
-                       tmpcursor.x_fix = 0;
-                       tmpcursor.pos = pos;
-                       RedoDrawingOfParagraph(tmpcursor); 
-               }
-   
+       int const tmpheight = row->height();
+       LyXParagraph::size_type const tmplast = RowLast(row);
+       refresh_y = y;
+       refresh_row = row;
+       
+       BreakAgain(bview, row);
+       if (row->height() == tmpheight && RowLast(row) == tmplast)
+               status = LyXText::NEED_VERY_LITTLE_REFRESH;
+       else
+               status = LyXText::NEED_MORE_REFRESH; 
+       
+       // check the special right address boxes
+       if (textclasslist.Style(bview->buffer()->params.textclass,
+                               par->GetLayout()).margintype
+           == MARGIN_RIGHT_ADDRESS_BOX) {
+               tmpcursor.par(par);
+               tmpcursor.row(row);
+               tmpcursor.y(y);
+               tmpcursor.x(0);
+               tmpcursor.x_fix(0);
+               tmpcursor.pos(pos);
+               RedoDrawingOfParagraph(bview, tmpcursor); 
        }
 
        // set the cursor again. Otherwise dangling pointers are possible
@@ -2946,61 +2710,75 @@ void LyXText::CheckParagraph(LyXParagraph * par,
    
        if (selection) {
                tmpcursor = cursor;
-               SetCursorIntern(sel_cursor.par, sel_cursor.pos);
+               SetCursorIntern(bview, sel_cursor.par(), sel_cursor.pos(),
+                               false, sel_cursor.boundary());
                sel_cursor = cursor; 
-               SetCursorIntern(sel_start_cursor.par, sel_start_cursor.pos);
+               SetCursorIntern(bview, sel_start_cursor.par(),
+                               sel_start_cursor.pos(),
+                               false, sel_start_cursor.boundary());
                sel_start_cursor = cursor; 
-               SetCursorIntern(sel_end_cursor.par, sel_end_cursor.pos);
+               SetCursorIntern(bview, sel_end_cursor.par(),
+                               sel_end_cursor.pos(),
+                               false, sel_end_cursor.boundary());
                sel_end_cursor = cursor; 
-               SetCursorIntern(last_sel_cursor.par, last_sel_cursor.pos);
+               SetCursorIntern(bview, last_sel_cursor.par(),
+                               last_sel_cursor.pos(),
+                               false, last_sel_cursor.boundary());
                last_sel_cursor = cursor; 
                cursor = tmpcursor;
        }
-       SetCursorIntern(cursor.par, cursor.pos);
+       SetCursorIntern(bview, cursor.par(), cursor.pos(),
+                       false, cursor.boundary());
 }
 
 
-// returns 0 if inset wasn't found
-int LyXText::UpdateInset(Inset * inset)
+// returns false if inset wasn't found
+bool LyXText::UpdateInset(BufferView * bview, Inset * inset)
 {
        // first check the current paragraph
-       int pos = cursor.par->GetPositionOfInset(inset);
+       int pos = cursor.par()->GetPositionOfInset(inset);
        if (pos != -1){
-               CheckParagraph(cursor.par, pos);
-               return 1;
+               CheckParagraph(bview, cursor.par(), pos);
+               return true;
        }
   
        // check every paragraph
   
        LyXParagraph * par = FirstParagraph();
        do {
+#ifndef NEW_INSETS
                // make sure the paragraph is open
                if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE){
+#endif
                        pos = par->GetPositionOfInset(inset);
                        if (pos != -1){
-                               CheckParagraph(par, pos);
-                               return 1;
+                               CheckParagraph(bview, par, pos);
+                               return true;
                        }
+#ifndef NEW_INSETS
                }
+#endif
                par = par->Next();
        } while (par);
   
-       return 0;
+       return false;
 }
 
 
-void LyXText::SetCursor(LyXParagraph * par,
-                       LyXParagraph::size_type pos, bool setfont) const
+void LyXText::SetCursor(BufferView * bview, LyXParagraph * par,
+                       LyXParagraph::size_type pos, 
+                       bool setfont, bool boundary) const
 {
        LyXCursor old_cursor = cursor;
-       SetCursorIntern(par, pos, setfont);
-       DeleteEmptyParagraphMechanism(old_cursor);
+       SetCursorIntern(bview, par, pos, setfont, boundary);
+       DeleteEmptyParagraphMechanism(bview, old_cursor);
 }
 
 
-void LyXText::SetCursorIntern(LyXParagraph * par,
-                             LyXParagraph::size_type pos, bool setfont) const
+void LyXText::SetCursor(BufferView *bview, LyXCursor & cur, LyXParagraph * par,
+                       LyXParagraph::size_type pos, bool boundary) const
 {
+#ifndef NEW_INSETS
        // correct the cursor position if impossible
        if (pos > par->Last()){
                LyXParagraph * tmppar = par->ParFromPos(pos);
@@ -3010,11 +2788,15 @@ void LyXText::SetCursorIntern(LyXParagraph * par,
        if (par->IsDummy() && par->previous &&
            par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
                while (par->previous &&
-                      ((par->previous->IsDummy() && par->previous->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) ||
-                       (par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE))) {
+                      ((par->previous->IsDummy() &&
+                        (par->previous->previous->footnoteflag ==
+                         LyXParagraph::CLOSED_FOOTNOTE)) ||
+                       (par->previous->footnoteflag ==
+                        LyXParagraph::CLOSED_FOOTNOTE))) {
                        par = par->previous ;
                        if (par->IsDummy() &&
-                           par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE)
+                           (par->previous->footnoteflag ==
+                            LyXParagraph::CLOSED_FOOTNOTE))
                                pos += par->size() + 1;
                }
                if (par->previous) {
@@ -3022,297 +2804,249 @@ void LyXText::SetCursorIntern(LyXParagraph * par,
                }
                pos += par->size() + 1;
        }
-
-       cursor.par = par;
-       cursor.pos = pos;
-
-       if (setfont)
-               if (cursor.pos && 
-                   (cursor.pos == cursor.par->Last() || cursor.par->IsSeparator(cursor.pos)
-                    || (cursor.pos && cursor.pos == BeginningOfMainBody(cursor.par)
-                        && !cursor.par->IsSeparator(cursor.pos))
-                    || (cursor.par->table && cursor.par->IsNewline(cursor.pos))
-                    )) {
-                       current_font = cursor.par->GetFontSettings(cursor.pos - 1);
-                       real_current_font = GetFont(cursor.par, cursor.pos - 1);
-               } else {
-                       current_font = cursor.par->GetFontSettings(cursor.pos);
-                       real_current_font = GetFont(cursor.par, cursor.pos);
-               }
+#endif
+       cur.par(par);
+       cur.pos(pos);
+       cur.boundary(boundary);
 
        /* get the cursor y position in text  */
-       long y = 0;
+       int y = 0;
        Row * row = GetRow(par, pos, y);
        /* y is now the beginning of the cursor row */ 
-       y += row->baseline;
+       y += row->baseline();
        /* y is now the cursor baseline */ 
-       cursor.y = y;
+       cur.y(y);
    
        /* now get the cursors x position */
        float x;
        float fill_separator, fill_hfill, fill_label_hfill;
-       PrepareToPrint(row, x, fill_separator, fill_hfill, fill_label_hfill);
-       LyXParagraph::size_type cursor_vpos;
-       LyXParagraph::size_type last = RowLast(row);
-       if (row->pos > last)
-               cursor_vpos = 0;
-       else if (pos > last)
-               cursor_vpos = (row->par->getLetterDirection(last) == LYX_DIR_LEFT_TO_RIGHT)
-                       ? log2vis(last)+1 : log2vis(last);
-       else {      
-               LyXDirection letter_direction =
-                       row->par->getLetterDirection(pos);
-               LyXDirection font_direction =
-                       (real_current_font.isVisibleRightToLeft())
-                       ?  LYX_DIR_RIGHT_TO_LEFT : LYX_DIR_LEFT_TO_RIGHT;
-               if (letter_direction == font_direction
-                   || pos <= row->pos
-                   || (row->par->table && row->par->IsNewline(pos-1)))
-                       cursor_vpos = (letter_direction == LYX_DIR_LEFT_TO_RIGHT)
-                               ? log2vis(pos) : log2vis(pos) + 1;
-               else
-                       cursor_vpos = (font_direction == LYX_DIR_LEFT_TO_RIGHT)
-                               ? log2vis(pos-1) + 1 : log2vis(pos - 1);
+       PrepareToPrint(bview, row, x, fill_separator, fill_hfill,
+                      fill_label_hfill);
+       LyXParagraph::size_type cursor_vpos = 0;
+       LyXParagraph::size_type last = RowLastPrintable(row);
+
+       if (pos > last + 1)   // This shouldn't happen.
+               pos = last + 1;
+       else if (pos < row->pos())
+               pos = row->pos();
+
+       if (last < row->pos())
+                cursor_vpos = row->pos();
+       else if (pos > last && !boundary)
+               cursor_vpos = (row->par()->isRightToLeftPar(bview->buffer()->params))
+                       ? row->pos() : last + 1; 
+       else if (pos > row->pos() &&
+                (pos > last || boundary))
+               /// Place cursor after char at (logical) position pos - 1
+               cursor_vpos = (bidi_level(pos - 1) % 2 == 0)
+                       ? log2vis(pos - 1) + 1 : log2vis(pos - 1);
+       else
+               /// Place cursor before char at (logical) position pos
+               cursor_vpos = (bidi_level(pos) % 2 == 0)
+                       ? log2vis(pos) : log2vis(pos) + 1;
+       
+       LyXParagraph::size_type main_body =
+               BeginningOfMainBody(bview->buffer(), row->par());
+       if ((main_body > 0) &&
+           ((main_body-1 > last) || 
+            !row->par()->IsLineSeparator(main_body-1)))
+               main_body = 0;
+       
+       for (LyXParagraph::size_type vpos = row->pos();
+            vpos < cursor_vpos; ++vpos) {
+               pos = vis2log(vpos);
+               if (main_body > 0 && pos == main_body - 1) {
+                       x += fill_label_hfill +
+                               lyxfont::width(textclasslist.Style(
+                                       bview->buffer()->params.textclass,
+                                       row->par()->GetLayout())
+                                              .labelsep,
+                                              GetFont(bview->buffer(), row->par(), -2));
+                       if (row->par()->IsLineSeparator(main_body-1))
+                               x -= SingleWidth(bview, row->par(),main_body-1);
+               }
+               if (HfillExpansion(bview->buffer(), row, pos)) {
+                       x += SingleWidth(bview, row->par(), pos);
+                       if (pos >= main_body)
+                               x += fill_hfill;
+                       else 
+                               x += fill_label_hfill;
+               } else if (row->par()->IsSeparator(pos)) {
+                       x += SingleWidth(bview, row->par(), pos);
+                       if (pos >= main_body)
+                               x += fill_separator;
+               } else
+                       x += SingleWidth(bview, row->par(), pos);
        }
        
-       /* table stuff -- begin*/
-       if (row->par->table) {
-               int cell = NumberOfCell(row->par, row->pos);
-               float x_old = x;
-               x += row->par->table->GetBeginningOfTextInCell(cell);
-               for (LyXParagraph::size_type vpos = row->pos; vpos < cursor_vpos; ++vpos)  {
-                       pos = vis2log(vpos);
-                       if (row->par->IsNewline(pos)) {
-                               x = x_old + row->par->table->WidthOfColumn(cell);
-                               x_old = x;
-                               ++cell;
-                               x += row->par->table->GetBeginningOfTextInCell(cell);
-                       } else {
-                               x += SingleWidth(row->par, pos);
-                       }
-               }
-       } else {
-               /* table stuff -- end*/
-               LyXParagraph::size_type main_body =
-                       BeginningOfMainBody(row->par);
-               if (main_body > 0 &&
-                   (main_body-1 > last || 
-                    !row->par->IsLineSeparator(main_body-1)))
-                       main_body = 0;
-
-               for (LyXParagraph::size_type vpos = row->pos; vpos < cursor_vpos; ++vpos)  {
-                       pos = vis2log(vpos);
-                       if (main_body > 0 && pos == main_body-1) {
-                               x += fill_label_hfill +
-                                       lyxfont::width(textclasslist
-                                                      .Style(parameters->textclass,
-                                                             row->par->GetLayout())
-                                                      .labelsep,
-                                                      GetFont(row->par, -2));
-                               if (row->par->IsLineSeparator(main_body-1))
-                                       x -= SingleWidth(row->par, main_body-1);
-                       }
-                       if (HfillExpansion(row, pos)) {
-                               x += SingleWidth(row->par, pos);
-                               if (pos >= main_body)
-                                       x += fill_hfill;
-                               else 
-                                       x += fill_label_hfill;
-                       }
-                       else if (row->par->IsSeparator(pos)) {
-                               if (pos != last ||
-                                   !row->next ||
-                                   row->next->par != row->par ||
-                                   row->par->getParDirection() ==
-                                   row->par->getLetterDirection(last)) {
-                                       x += SingleWidth(row->par, pos);
-                                       if (pos >= main_body)
-                                               x += fill_separator;
-                               }
-                       } else
-                               x += SingleWidth(row->par, pos);
+       cur.x(int(x));
+       cur.x_fix(cur.x());
+       cur.row(row);
+}
+
+
+void LyXText::SetCursorIntern(BufferView * bview, LyXParagraph * par,
+                             LyXParagraph::size_type pos,
+                             bool setfont, bool boundary) const
+{
+       SetCursor(bview, cursor, par, pos, boundary);
+       if (setfont)
+               SetCurrentFont(bview);
+}
+
+
+void LyXText::SetCurrentFont(BufferView * bview) const
+{
+       LyXParagraph::size_type pos = cursor.pos();
+       if (cursor.boundary() && pos > 0)
+               --pos;
+
+       if (pos > 0) {
+               if (pos == cursor.par()->Last())
+                       --pos;
+               else if (cursor.par()->IsSeparator(pos)) {
+                       if (pos > cursor.row()->pos() &&
+                           bidi_level(pos) % 2 == 
+                           bidi_level(pos - 1) % 2)
+                               --pos;
+                       else if (pos + 1 < cursor.par()->Last())
+                               ++pos;
                }
        }
-   
-       cursor.x = int(x);
-   
-       cursor.x_fix = cursor.x;
-       cursor.row = row;
+
+       current_font =
+               cursor.par()->GetFontSettings(bview->buffer()->params, pos);
+       real_current_font = GetFont(bview->buffer(), cursor.par(), pos);
+
+       if (cursor.pos() == cursor.par()->Last() &&
+           IsBoundary(bview->buffer(), cursor.par(), cursor.pos()) &&
+           !cursor.boundary()) {
+               Language const * lang =
+                       cursor.par()->getParLanguage(bview->buffer()->params);
+               current_font.setLanguage(lang);
+               real_current_font.setLanguage(lang);
+       }
 }
 
 
-void LyXText::SetCursorFromCoordinates(int x, long y) const
+void LyXText::SetCursorFromCoordinates(BufferView * bview, int x, int y) const
 {
        LyXCursor old_cursor = cursor;
    
        /* get the row first */ 
    
        Row * row = GetRowNearY(y);
-   
-       cursor.par = row->par;
-   
-       int column = GetColumnNearX(row, x);
-       cursor.pos = row->pos + column;
-       cursor.x = x;
-       cursor.y = y + row->baseline;
-   
-       cursor.row = row;
-    
-       if (cursor.pos && 
-           (cursor.pos == cursor.par->Last()
-            || cursor.par->IsSeparator(cursor.pos)
-            || (cursor.pos && cursor.pos == BeginningOfMainBody(cursor.par)
-                && !cursor.par->IsSeparator(cursor.pos))
-            || (cursor.par->table && cursor.par->IsNewline(cursor.pos))
-                   )) {
-               current_font = cursor.par->GetFontSettings(cursor.pos - 1);
-               real_current_font = GetFont(cursor.par, cursor.pos - 1);
-       } else {
-               current_font = cursor.par->GetFontSettings(cursor.pos);
-               real_current_font = GetFont(cursor.par, cursor.pos);
-       }
-       DeleteEmptyParagraphMechanism(old_cursor);
+       cursor.par(row->par());
+
+       bool bound = false;
+       int column = GetColumnNearX(bview, row, x, bound);
+       cursor.pos(row->pos() + column);
+       cursor.x(x);
+       cursor.y(y + row->baseline());
+       cursor.row(row);
+       cursor.boundary(bound);
+       SetCurrentFont(bview);
+       DeleteEmptyParagraphMechanism(bview, old_cursor);
 }
 
-void LyXText::SetCursorFromCoordinates(LyXCursor & cur, int x, long y) const
+
+void LyXText::SetCursorFromCoordinates(BufferView * bview, LyXCursor & cur,
+                                      int x, int y) const
 {
        /* get the row first */ 
    
        Row * row = GetRowNearY(y);
-       int column = GetColumnNearX(row, x);
+       bool bound = false;
+       int column = GetColumnNearX(bview, row, x, bound);
    
-       cur.par = row->par;
-       cur.pos = row->pos + column;
-       cur.x = x;
-       cur.y = y + row->baseline;
-       cur.row = row;
+       cur.par(row->par());
+       cur.pos(row->pos() + column);
+       cur.x(x);
+       cur.y(y + row->baseline());
+       cur.row(row);
+       cur.boundary(bound);
 }
 
 
-void LyXText::CursorLeft() const
+void LyXText::CursorLeft(BufferView * bview, bool internal) const
 {
-       CursorLeftIntern();
-        if (cursor.par->table) {
-                int cell = NumberOfCell(cursor.par, cursor.pos);
-                if (cursor.par->table->IsContRow(cell) &&
-                    cursor.par->table->CellHasContRow(cursor.par->table->GetCellAbove(cell)) < 0) {
-                        CursorUp();
-                }
-        }
-}
-
-
-void LyXText::CursorLeftIntern() const
-{
-       if (cursor.pos > 0) {
-               SetCursor(cursor.par, cursor.pos - 1);
-       }
-       else if (cursor.par->Previous()) { // steps into the above paragraph.
-               SetCursor(cursor.par->Previous(), cursor.par->Previous()->Last());
+       if (cursor.pos() > 0) {
+               bool boundary = cursor.boundary();
+               SetCursor(bview, cursor.par(), cursor.pos() - 1, true, false);
+               if (!internal && !boundary &&
+                   IsBoundary(bview->buffer(), cursor.par(), cursor.pos() + 1))
+                       SetCursor(bview, cursor.par(), cursor.pos() + 1, true, true);
+       } else if (cursor.par()->Previous()) { // steps into the above paragraph.
+               LyXParagraph * par = cursor.par()->Previous();
+               SetCursor(bview, par, par->Last());
        }
 }
 
 
-void LyXText::CursorRight() const
+void LyXText::CursorRight(BufferView * bview, bool internal) const
 {
-       CursorRightIntern();
-        if (cursor.par->table) {
-                int cell = NumberOfCell(cursor.par, cursor.pos);
-                if (cursor.par->table->IsContRow(cell) &&
-                    cursor.par->table->CellHasContRow(cursor.par->table->GetCellAbove(cell))<0) {
-                        CursorUp();
-                }
-        }
+       if (!internal && cursor.boundary() &&
+           !cursor.par()->IsNewline(cursor.pos()))
+               SetCursor(bview, cursor.par(), cursor.pos(), true, false);
+       else if (cursor.pos() < cursor.par()->Last()) {
+               SetCursor(bview, cursor.par(), cursor.pos() + 1, true, false);
+               if (!internal &&
+                   IsBoundary(bview->buffer(), cursor.par(), cursor.pos()))
+                       SetCursor(bview, cursor.par(), cursor.pos(), true, true);
+       } else if (cursor.par()->Next())
+               SetCursor(bview, cursor.par()->Next(), 0);
 }
 
 
-void LyXText::CursorRightIntern() const
+void LyXText::CursorUp(BufferView * bview) const
 {
-       if (cursor.pos < cursor.par->Last()) {
-               SetCursor(cursor.par, cursor.pos + 1);
-       }
-       else if (cursor.par->Next()) {
-               SetCursor(cursor.par->Next(), 0);
-       }
+       SetCursorFromCoordinates(bview, cursor.x_fix(), 
+                                cursor.y() - cursor.row()->baseline() - 1);
 }
 
 
-void LyXText::CursorUp() const
+void LyXText::CursorDown(BufferView * bview) const
 {
-       SetCursorFromCoordinates(cursor.x_fix, 
-                                cursor.y - cursor.row->baseline - 1);
-        if (cursor.par->table) {
-                int cell = NumberOfCell(cursor.par, cursor.pos);
-                if (cursor.par->table->IsContRow(cell) &&
-                    cursor.par->table->CellHasContRow(cursor.par->table->GetCellAbove(cell))<0) {
-                        CursorUp();
-                }
-        }
-}
-
-
-void LyXText::CursorDown() const
-{
-        if (cursor.par->table &&
-            cursor.par->table->ShouldBeVeryLastRow(NumberOfCell(cursor.par, cursor.pos)) &&
-            !cursor.par->next)
-                return;
-       SetCursorFromCoordinates(cursor.x_fix, 
-                                cursor.y - cursor.row->baseline
-                                + cursor.row->height + 1);
-        if (cursor.par->table) {
-                int cell = NumberOfCell(cursor.par, cursor.pos);
-                int cell_above = cursor.par->table->GetCellAbove(cell);
-                while(cursor.par->table &&
-                      cursor.par->table->IsContRow(cell) &&
-                      (cursor.par->table->CellHasContRow(cell_above)<0)) {
-                    SetCursorFromCoordinates(cursor.x_fix, 
-                                             cursor.y - cursor.row->baseline
-                                             + cursor.row->height + 1);
-                    if (cursor.par->table) {
-                        cell = NumberOfCell(cursor.par, cursor.pos);
-                        cell_above = cursor.par->table->GetCellAbove(cell);
-                    }
-                }
-        }
+       SetCursorFromCoordinates(bview, cursor.x_fix(), 
+                                cursor.y() - cursor.row()->baseline()
+                                + cursor.row()->height() + 1);
 }
 
 
-void LyXText::CursorUpParagraph() const
+void LyXText::CursorUpParagraph(BufferView * bview) const
 {
-       if (cursor.pos > 0) {
-               SetCursor(cursor.par, 0);
+       if (cursor.pos() > 0) {
+               SetCursor(bview, cursor.par(), 0);
        }
-       else if (cursor.par->Previous()) {
-               SetCursor(cursor.par->Previous(), 0);
+       else if (cursor.par()->Previous()) {
+               SetCursor(bview, cursor.par()->Previous(), 0);
        }
 }
 
 
-void LyXText::CursorDownParagraph() const
+void LyXText::CursorDownParagraph(BufferView * bview) const
 {
-       if (cursor.par->Next()) {
-               SetCursor(cursor.par->Next(), 0);
+       if (cursor.par()->Next()) {
+               SetCursor(bview, cursor.par()->Next(), 0);
        } else {
-               SetCursor(cursor.par, cursor.par->Last());
+               SetCursor(bview, cursor.par(), cursor.par()->Last());
        }
 }
 
 
-
-void LyXText::DeleteEmptyParagraphMechanism(LyXCursor const & old_cursor) const
+void LyXText::DeleteEmptyParagraphMechanism(BufferView * bview,
+                                           LyXCursor const & old_cursor) const
 {
        // Would be wrong to delete anything if we have a selection.
        if (selection) return;
 
        // We allow all kinds of "mumbo-jumbo" when freespacing.
-       if (textclasslist.Style(parameters->textclass,
-                               old_cursor.par->GetLayout()).free_spacing)
+       if (textclasslist.Style(bview->buffer()->params.textclass,
+                               old_cursor.par()->GetLayout()).free_spacing)
                return;
 
        bool deleted = false;
        
-#ifdef FIX_DOUBLE_SPACE
        /* Ok I'll put some comments here about what is missing.
           I have fixed BackSpace (and thus Delete) to not delete
           double-spaces automagically. I have also changed Cut,
@@ -3328,123 +3062,138 @@ void LyXText::DeleteEmptyParagraphMechanism(LyXCursor const & old_cursor) const
           that I can get some feedback. (Lgb)
        */
 
-       // If old_cursor.pos == 0 and old_cursor.pos(1) == LineSeparator
+       // If old_cursor.pos() == 0 and old_cursor.pos()(1) == LineSeparator
        // delete the LineSeparator.
        // MISSING
 
-       // If old_cursor.pos == 1 and old_cursor.pos(0) == LineSeparator
+       // If old_cursor.pos() == 1 and old_cursor.pos()(0) == LineSeparator
        // delete the LineSeparator.
        // MISSING
 
        // If the pos around the old_cursor were spaces, delete one of them.
-       if (old_cursor.par != cursor.par || old_cursor.pos != cursor.pos) { // Only if the cursor has really moved
+       if (old_cursor.par() != cursor.par() || old_cursor.pos() != cursor.pos()) { 
+               // Only if the cursor has really moved
                
-               if (old_cursor.pos > 0
-                   && old_cursor.pos < old_cursor.par->Last()
-                   && old_cursor.par->IsLineSeparator(old_cursor.pos)
-                   && old_cursor.par->IsLineSeparator(old_cursor.pos - 1)) {
-                       old_cursor.par->Erase(old_cursor.pos - 1);
-                       status = LyXText::NEED_MORE_REFRESH;
+               if (old_cursor.pos() > 0
+                   && old_cursor.pos() < old_cursor.par()->Last()
+                   && old_cursor.par()->IsLineSeparator(old_cursor.pos())
+                   && old_cursor.par()->IsLineSeparator(old_cursor.pos() - 1)) {
+                       old_cursor.par()->Erase(old_cursor.pos() - 1);
+                       RedoParagraphs(bview, old_cursor, old_cursor.par()->Next());
                        // correct cursor
-                       if (old_cursor.par == cursor.par &&
-                           cursor.pos > old_cursor.pos) {
-                               //SetCursor(cursor.par, cursor.pos - 1);
-                               cursor.pos--;
-                       } //else
-                       //      SetCursor(cursor.par, cursor.pos);
+                       if (old_cursor.par() == cursor.par() &&
+                           cursor.pos() > old_cursor.pos()) {
+                               SetCursorIntern(bview, cursor.par(),
+                                               cursor.pos() - 1);
+                       } else
+                               SetCursorIntern(bview, cursor.par(),
+                                               cursor.pos());
                        return;
                }
        }
-#endif
-#if 1
+
        // Do not delete empty paragraphs with keepempty set.
-       if ((textclasslist.Style(parameters->textclass,
-                                old_cursor.par->GetLayout())).keepempty)
+       if ((textclasslist.Style(bview->buffer()->params.textclass,
+                                old_cursor.par()->GetLayout())).keepempty)
                return;
 
        LyXCursor tmpcursor;
 
-       if (old_cursor.par != cursor.par) {
-               if ( (old_cursor.par->Last() == 0
-                     || (old_cursor.par->Last() == 1
-                         && old_cursor.par->IsLineSeparator(0)))
-                    && old_cursor.par->FirstPhysicalPar()
-                    == old_cursor.par->LastPhysicalPar()) {
+       if (old_cursor.par() != cursor.par()) {
+               if ((old_cursor.par()->Last() == 0
+                     || (old_cursor.par()->Last() == 1
+                         && old_cursor.par()->IsLineSeparator(0)))
+#ifndef NEW_INSETS
+                    && old_cursor.par()->FirstPhysicalPar()
+                    == old_cursor.par()->LastPhysicalPar()
+#endif
+                       ) {
                        // ok, we will delete anything
                        
                        // make sure that you do not delete any environments
-                       if ((old_cursor.par->footnoteflag != LyXParagraph::OPEN_FOOTNOTE &&
-                            !(old_cursor.row->previous 
-                              && old_cursor.row->previous->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
-                            && !(old_cursor.row->next 
-                                 && old_cursor.row->next->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
-                           || (old_cursor.par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
-                               && ((old_cursor.row->previous 
-                                    && old_cursor.row->previous->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
-                                   || (old_cursor.row->next
-                                       && old_cursor.row->next->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
+#ifndef NEW_INSETS
+                       if ((
+                               old_cursor.par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE &&
+                            !(old_cursor.row()->previous() 
+                              && old_cursor.row()->previous()->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
+                            && !(old_cursor.row()->next() 
+                                 && old_cursor.row()->next()->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
+                           || (old_cursor.par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
+                               && ((old_cursor.row()->previous() 
+                                    && old_cursor.row()->previous()->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
+                                   || (old_cursor.row()->next()
+                                       && old_cursor.row()->next()->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
                                    )) {
+#endif
                                status = LyXText::NEED_MORE_REFRESH;
                                deleted = true;
                                
-                               if (old_cursor.row->previous) {
-                                       refresh_row = old_cursor.row->previous;
-                                       refresh_y = old_cursor.y - old_cursor.row->baseline - refresh_row->height;
+                               if (old_cursor.row()->previous()) {
+                                       refresh_row = old_cursor.row()->previous();
+                                       refresh_y = old_cursor.y() - old_cursor.row()->baseline() - refresh_row->height();
                                        tmpcursor = cursor;
                                        cursor = old_cursor; // that undo can restore the right cursor position
-                                       LyXParagraph * endpar = old_cursor.par->next;
+                                       LyXParagraph * endpar = old_cursor.par()->next;
                                        if (endpar && endpar->GetDepth()) {
                                                while (endpar && endpar->GetDepth()) {
+#ifndef NEW_INSETS
                                                        endpar = endpar->LastPhysicalPar()->Next();
+#else
+                                                       endpar = endpar->Next();
+#endif
                                                }
                                        }
-                                       SetUndo(Undo::DELETE,
-                                               old_cursor.par->previous,
+                                       SetUndo(bview->buffer(), Undo::DELETE,
+                                               old_cursor.par()->previous,
                                                endpar);
                                        cursor = tmpcursor;
 
                                        // delete old row
-                                       RemoveRow(old_cursor.row);
-                                       if (params->paragraph == old_cursor.par) {
-                                               params->paragraph = params->paragraph->next;
+                                       RemoveRow(old_cursor.row());
+                                       if (OwnerParagraph() == old_cursor.par()) {
+                                               OwnerParagraph(OwnerParagraph()->next);
                                        }
                                        // delete old par
-                                       delete old_cursor.par;
+                                       delete old_cursor.par();
                                        
                                        /* Breakagain the next par. Needed
                                         * because of the parindent that
                                         * can occur or dissappear. The
                                         * next row can change its height,
                                         * if there is another layout before */
-                                       if (refresh_row->next) {
-                                               BreakAgain(refresh_row->next);
-                                               UpdateCounters(refresh_row);
+                                       if (refresh_row->next()) {
+                                               BreakAgain(bview, refresh_row->next());
+                                               UpdateCounters(bview, refresh_row);
                                        }
-                                       SetHeightOfRow(refresh_row);
+                                       SetHeightOfRow(bview, refresh_row);
                                } else {
-                                       refresh_row = old_cursor.row->next;
-                                       refresh_y = old_cursor.y - old_cursor.row->baseline;
+                                       refresh_row = old_cursor.row()->next();
+                                       refresh_y = old_cursor.y() - old_cursor.row()->baseline();
                                        
                                        tmpcursor = cursor;
                                        cursor = old_cursor; // that undo can restore the right cursor position
-                                       LyXParagraph *endpar = old_cursor.par->next;
+                                       LyXParagraph * endpar = old_cursor.par()->next;
                                        if (endpar && endpar->GetDepth()) {
                                                while (endpar && endpar->GetDepth()) {
+#ifndef NEW_INSETS
                                                        endpar = endpar->LastPhysicalPar()->Next();
+#else
+                                                       endpar = endpar->Next();
+#endif
                                                }
                                        }
-                                       SetUndo(Undo::DELETE,
-                                               old_cursor.par->previous,
+                                       SetUndo(bview->buffer(), Undo::DELETE,
+                                               old_cursor.par()->previous,
                                                endpar);
                                        cursor = tmpcursor;
 
                                        // delete old row
-                                       RemoveRow(old_cursor.row);
+                                       RemoveRow(old_cursor.row());
                                        // delete old par
-                                       if (params->paragraph == old_cursor.par) {
-                                               params->paragraph = params->paragraph->next;
+                                       if (OwnerParagraph() == old_cursor.par()) {
+                                               OwnerParagraph(OwnerParagraph()->next);
                                        }
-                                       delete old_cursor.par;
+                                       delete old_cursor.par();
                                        
                                        /* Breakagain the next par. Needed
                                           because of the parindent that can
@@ -3453,34 +3202,33 @@ void LyXText::DeleteEmptyParagraphMechanism(LyXCursor const & old_cursor) const
                                           if there is another layout before
                                        */ 
                                        if (refresh_row) {
-                                               BreakAgain(refresh_row);
-                                               UpdateCounters(refresh_row->previous);
+                                               BreakAgain(bview, refresh_row);
+                                               UpdateCounters(bview, refresh_row->previous());
                                        }
                                }
                                
                                // correct cursor y
-                               SetCursor(cursor.par, cursor.pos);
-                               
-                               /* if (cursor.y > old_cursor.y)
-                                  cursor.y -= old_cursor.row->height; */ 
-        
-                               if (sel_cursor.par  == old_cursor.par
-                                   && sel_cursor.pos == sel_cursor.pos) {
+
+                               SetCursorIntern(bview, cursor.par(), cursor.pos());
+
+                               if (sel_cursor.par()  == old_cursor.par()
+                                   && sel_cursor.pos() == sel_cursor.pos()) {
                                        // correct selection
                                        sel_cursor = cursor;
                                }
+#ifndef NEW_INSETS
                        }
+#endif
                }
                if (!deleted) {
-                       if (old_cursor.par->ClearParagraph()) {
-                               RedoParagraphs(old_cursor, old_cursor.par->Next());
+                       if (old_cursor.par()->StripLeadingSpaces(bview->buffer()->params.textclass)) {
+                               RedoParagraphs(bview, old_cursor, old_cursor.par()->Next());
                                // correct cursor y
-                               SetCursor(cursor.par, cursor.pos);
+                               SetCursorIntern(bview, cursor.par(), cursor.pos());
                                sel_cursor = cursor;
                        }
                }
        }
-#endif
 }
 
 
@@ -3494,40 +3242,46 @@ LyXParagraph * LyXText::GetParFromID(int id)
 
 
 // undo functions
-bool LyXText::TextUndo()
+bool LyXText::TextUndo(BufferView * bview)
 {
+       if (inset_owner)
+               return false;
        // returns false if no undo possible
-       Undo * undo = params->undostack.pop();
+       Undo * undo = bview->buffer()->undostack.pop();
        if (undo) {
                FinishUndo();
                if (!undo_frozen)
-                       params->redostack
-                               .push(CreateUndo(undo->kind, 
+                       bview->buffer()->redostack
+                               .push(CreateUndo(bview->buffer(), undo->kind, 
                                                 GetParFromID(undo->number_of_before_par),
                                                 GetParFromID(undo->number_of_behind_par)));
        }
-       return TextHandleUndo(undo);
+       return TextHandleUndo(bview, undo);
 }
 
 
-bool LyXText::TextRedo()
+bool LyXText::TextRedo(BufferView * bview)
 {
+       if (inset_owner)
+               return false;
        // returns false if no redo possible
-       Undo * undo = params->redostack.pop();
+       Undo * undo = bview->buffer()->redostack.pop();
        if (undo) {
                FinishUndo();
                if (!undo_frozen)
-                       params->undostack
-                               .push(CreateUndo(undo->kind, 
+                       bview->buffer()->undostack
+                               .push(CreateUndo(bview->buffer(), undo->kind, 
                                                 GetParFromID(undo->number_of_before_par),
                                                 GetParFromID(undo->number_of_behind_par)));
        }
-       return TextHandleUndo(undo);
+       return TextHandleUndo(bview, undo);
 }
 
 
-bool LyXText::TextHandleUndo(Undo * undo)
+bool LyXText::TextHandleUndo(BufferView * bview, Undo * undo)
 {
+       if (inset_owner)
+               return false;
        // returns false if no undo possible
        bool result = false;
        if (undo) {
@@ -3543,7 +3297,7 @@ bool LyXText::TextHandleUndo(Undo * undo)
                // if there's no before take the beginning
                // of the document for redoing
                if (!before)
-                       SetCursorIntern(FirstParagraph(), 0);
+                       SetCursorIntern(bview, FirstParagraph(), 0);
 
                // replace the paragraphs with the undo informations
 
@@ -3560,7 +3314,7 @@ bool LyXText::TextHandleUndo(Undo * undo)
                        if (before)
                                tmppar5 = before->next;
                        else
-                               tmppar5 = params->paragraph;
+                               tmppar5 = OwnerParagraph();
                        tmppar2 = tmppar3;
                        while (tmppar5 && tmppar5 != behind){
                                tmppar = tmppar5;
@@ -3570,17 +3324,8 @@ bool LyXText::TextHandleUndo(Undo * undo)
                                if (undo->kind == Undo::EDIT) {
                                        tmppar2->setContentsFromPar(tmppar);
                                        tmppar->clearContents();
-                                       //tmppar2->text = tmppar->text;
-                                       //tmppar->text.clear();
                                        tmppar2 = tmppar2->next;
                                }
-                               if ( currentrow && currentrow->par == tmppar )
-                                       currentrow = currentrow -> previous;
-                               // Commenting out this might remove the error
-                               // reported by Purify, but it might also
-                               // introduce a memory leak. We need to
-                               // check this (Lgb)
-                               //delete tmppar;
                        }
                }
     
@@ -3589,12 +3334,11 @@ bool LyXText::TextHandleUndo(Undo * undo)
                        if (before)
                                before->next = tmppar3;
                        else
-                               params->paragraph = tmppar3;
+                               OwnerParagraph(tmppar3);
                        tmppar3->previous = before;
-               }
-               else {
+               } else {
                        if (!before)
-                               params->paragraph = behind;
+                               OwnerParagraph(behind);
                }
                if (tmppar4) {
                        tmppar4->next = behind;
@@ -3605,7 +3349,12 @@ bool LyXText::TextHandleUndo(Undo * undo)
     
                // Set the cursor for redoing
                if (before) {
-                       SetCursorIntern(before->FirstSelfrowPar(), 0);
+#ifndef NEW_INSETS
+                       SetCursorIntern(bview, before->FirstSelfrowPar(), 0);
+#else
+                       SetCursorIntern(bview, before, 0);
+#endif
+#ifndef NEW_INSETS
                        // check wether before points to a closed float and open it if necessary
                        if (before && before->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE
                            && before->next && before->next->footnoteflag != LyXParagraph::NO_FOOTNOTE){
@@ -3618,8 +3367,10 @@ bool LyXText::TextHandleUndo(Undo * undo)
                                        tmppar4 = tmppar4->next;
                                }
                        }
+#endif
                }
-    
+
+#ifndef NEW_INSETS
                // open a cosed footnote at the end if necessary
                if (behind && behind->previous && 
                    behind->previous->footnoteflag != LyXParagraph::NO_FOOTNOTE &&
@@ -3629,22 +3380,26 @@ bool LyXText::TextHandleUndo(Undo * undo)
                                behind = behind->next;
                        }
                }
+#endif
     
                // calculate the endpar for redoing the paragraphs.
-               if (behind){
+               if (behind) {
+#ifndef NEW_INSETS
                        if (behind->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE)
                                endpar = behind->LastPhysicalPar()->Next();
                        else
                                endpar = behind->NextAfterFootnote()->LastPhysicalPar()->Next();
-               }
-               else
+#else
+                               endpar = behind->Next();
+#endif
+               } else
                        endpar = behind;
     
                tmppar = GetParFromID(undo->number_of_cursor_par);
-               RedoParagraphs(cursor, endpar); 
+               RedoParagraphs(bview, cursor, endpar); 
                if (tmppar){
-                       SetCursorIntern(tmppar, undo->cursor_pos);
-                       UpdateCounters(cursor.row);
+                       SetCursorIntern(bview, tmppar, undo->cursor_pos);
+                       UpdateCounters(bview, cursor.row());
                }
                result = true;
                delete undo;
@@ -3656,44 +3411,59 @@ bool LyXText::TextHandleUndo(Undo * undo)
 
 void LyXText::FinishUndo()
 {
+       if (inset_owner)
+               return;
        // makes sure the next operation will be stored
-       undo_finished = True;
+       undo_finished = true;
 }
 
 
 void LyXText::FreezeUndo()
 {
+       if (inset_owner)
+               return;
        // this is dangerous and for internal use only
-       undo_frozen = True;
+       undo_frozen = true;
 }
 
 
 void LyXText::UnFreezeUndo()
 {
+       if (inset_owner)
+               return;
        // this is dangerous and for internal use only
        undo_frozen = false;
 }
 
 
-void LyXText::SetUndo(Undo::undo_kind kind, LyXParagraph const * before,
+void LyXText::SetUndo(Buffer * buf, Undo::undo_kind kind,
+                     LyXParagraph const * before,
                      LyXParagraph const * behind) const
 {
+       if (inset_owner)
+               return;
        if (!undo_frozen)
-               params->undostack.push(CreateUndo(kind, before, behind));
-       params->redostack.clear();
+               buf->undostack.push(CreateUndo(buf, kind, before, behind));
+       buf->redostack.clear();
 }
 
 
-void LyXText::SetRedo(Undo::undo_kind kind, LyXParagraph const * before,
-                     LyXParagraph const * behind)
+void LyXText::SetRedo(Buffer * buf, Undo::undo_kind kind,
+                     LyXParagraph const * before, LyXParagraph const * behind)
 {
-       params->redostack.push(CreateUndo(kind, before, behind));
+       if (inset_owner)
+               return;
+       buf->redostack.push(CreateUndo(buf, kind, before, behind));
 }
 
 
-Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph const * before,
-                         LyXParagraph const * behind) const
+Undo * LyXText::CreateUndo(Buffer * buf, Undo::undo_kind kind,
+                          LyXParagraph const * before,
+                          LyXParagraph const * behind) const
 {
+       if (inset_owner)
+               return 0;
+
        int before_number = -1;
        int behind_number = -1;
        if (before)
@@ -3707,13 +3477,12 @@ Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph const * before,
        // appear one by one when undoing. 
        // EDIT is special since only layout information, not the
        // contents of a paragaph are stored.
-       if (!undo_finished && kind != Undo::EDIT && 
-           kind != Undo::FINISH){
+       if (!undo_finished && (kind != Undo::EDIT) && (kind != Undo::FINISH)){
                // check wether storing is needed
-               if (!params->undostack.empty() && 
-                   params->undostack.top()->kind == kind &&
-                   params->undostack.top()->number_of_before_par ==  before_number &&
-                   params->undostack.top()->number_of_behind_par ==  behind_number ){
+               if (!buf->undostack.empty() && 
+                   buf->undostack.top()->kind == kind &&
+                   buf->undostack.top()->number_of_before_par ==  before_number &&
+                   buf->undostack.top()->number_of_behind_par ==  behind_number ){
                        // no undo needed
                        return 0;
                }
@@ -3738,9 +3507,9 @@ Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph const * before,
                        end = end->next;
        }
 
-       if (start && end
-           && start != end->next
-           && (before != behind || (!before && !behind))) {
+       if (start && end && (start != end->next) &&
+           ((before != behind) || (!before && !behind)))
+       {
                tmppar = start;
                tmppar2 = tmppar->Clone();
                tmppar2->id(tmppar->id());
@@ -3770,9 +3539,14 @@ Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph const * before,
                tmppar2->next = 0;
        } else
                undopar = 0; // nothing to replace (undo of delete maybe)
-  
-       int cursor_par = cursor.par->ParFromPos(cursor.pos)->id();
-       int cursor_pos =  cursor.par->PositionInParFromPos(cursor.pos);
+
+#ifndef NEW_INSETS
+       int cursor_par = cursor.par()->ParFromPos(cursor.pos())->id();
+       int cursor_pos =  cursor.par()->PositionInParFromPos(cursor.pos());
+#else
+       int cursor_par = cursor.par()->id();
+       int cursor_pos =  cursor.pos();
+#endif
 
        Undo * undo = new Undo(kind, 
                               before_number, behind_number,  
@@ -3784,76 +3558,29 @@ Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph const * before,
 }
 
 
-void LyXText::SetCursorParUndo()
-{
-       SetUndo(Undo::FINISH, 
-               cursor.par->ParFromPos(cursor.pos)->previous, 
-               cursor.par->ParFromPos(cursor.pos)->next); 
-}
-
-
-void LyXText::RemoveTableRow(LyXCursor * cur) const
+void LyXText::SetCursorParUndo(Buffer * buf)
 {
-       int cell = -1;
-       int cell_org = 0;
-       int ocell = 0;
-    
-       // move to the previous row
-       int cell_act = NumberOfCell(cur->par, cur->pos);
-       if (cell < 0)
-               cell = cell_act;
-       while (cur->pos && !cur->par->IsNewline(cur->pos - 1))
-               cur->pos--;
-       while (cur->pos && 
-              !cur->par->table->IsFirstCell(cell_act)) {
-               cur->pos--;
-               while (cur->pos && !cur->par->IsNewline(cur->pos - 1))
-                       cur->pos--;
-               --cell;
-               --cell_act;
-       }
-       // now we have to pay attention if the actual table is the
-       //   main row of TableContRows and if yes to delete all of them
-       if (!cell_org)
-               cell_org = cell;
-       do {
-               ocell = cell;
-               // delete up to the next row
-               while (cur->pos < cur->par->Last() && 
-                      (cell_act == ocell
-                       || !cur->par->table->IsFirstCell(cell_act))) {
-                       while (cur->pos < cur->par->Last() &&
-                              !cur->par->IsNewline(cur->pos))
-                               cur->par->Erase(cur->pos);
-                       ++cell;
-                       ++cell_act;
-                       if (cur->pos < cur->par->Last())
-                               cur->par->Erase(cur->pos);
-               }
-               if (cur->pos && cur->pos == cur->par->Last()) {
-                       cur->pos--;
-                       cur->par->Erase(cur->pos); // no newline at very end!
-               }
-       } while (((cell + 1) < cur->par->table->GetNumberOfCells()) &&
-                !cur->par->table->IsContRow(cell_org) &&
-                cur->par->table->IsContRow(cell));
-       cur->par->table->DeleteRow(cell_org);
-       return;
+       if (inset_owner)
+               return;
+       SetUndo(buf, Undo::FINISH,
+#ifndef NEW_INSETS
+               cursor.par()->ParFromPos(cursor.pos())->previous, 
+               cursor.par()->ParFromPos(cursor.pos())->next
+#else
+               cursor.par()->previous, 
+               cursor.par()->next
+#endif
+               ); 
 }
 
 
-bool LyXText::IsEmptyTableCell() const
+void LyXText::toggleAppendix(BufferView * bview)
 {
-       LyXParagraph::size_type pos = cursor.pos - 1;
-       while (pos >= 0 && pos < cursor.par->Last()
-              && !cursor.par->IsNewline(pos))
-               --pos;
-       return cursor.par->IsNewline(pos + 1);
-}
-
-
-void LyXText::toggleAppendix(){
-       LyXParagraph * par = cursor.par->FirstPhysicalPar();
+#ifndef NEW_INSETS
+       LyXParagraph * par = cursor.par()->FirstPhysicalPar();
+#else
+       LyXParagraph * par = cursor.par();
+#endif
        bool start = !par->start_of_appendix;
 
        // ensure that we have only one start_of_appendix in this document
@@ -3866,7 +3593,25 @@ void LyXText::toggleAppendix(){
        status = LyXText::NEED_MORE_REFRESH;
        refresh_y = 0;
        refresh_row = 0; // not needed for full update
-       UpdateCounters(0);
-       SetCursor(cursor.par, cursor.pos);
+       UpdateCounters(bview, 0);
+       SetCursor(bview, cursor.par(), cursor.pos());
+}
+
+
+LyXParagraph * LyXText::OwnerParagraph() const
+{
+       if (inset_owner)
+               return inset_owner->par;
+
+       return bv_owner->buffer()->paragraph;
 }
 
+
+LyXParagraph * LyXText::OwnerParagraph(LyXParagraph * p) const
+{
+       if (inset_owner)
+               inset_owner->par = p;
+       else
+               bv_owner->buffer()->paragraph = p;
+       return 0;
+}