]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
small fix with footnote, use stringstream some more
[lyx.git] / src / text.C
index 0783fe9753bee37361c04ea47de743a87df94196..075df005f7d354e404cb6afaa318ce4b13b0f69f 100644 (file)
 #include <cctype>
 #include <algorithm>
 
-#ifdef __GNUG__
-#pragma implementation "table.h"
-#endif
-
+#include "lyxtext.h"
 #include "layout.h"
 #include "lyxparagraph.h"
-#include "lyxtext.h"
 #include "support/textutils.h"
 #include "insets/insetbib.h"
 #include "insets/insettext.h"
 #include "gettext.h"
 #include "bufferparams.h"
 #include "buffer.h"
-#include "minibuffer.h"
 #include "debug.h"
 #include "lyxrc.h"
 #include "LyXView.h"
-#include "lyxrow.h"
 #include "Painter.h"
 #include "tracer.h"
 #include "font.h"
 #include "encoding.h"
+#include "lyxscreen.h"
+#include "bufferview_funcs.h"
+#include "language.h"
 
 using std::max;
 using std::min;
 using std::endl;
 using std::pair;
 
-static const int LYX_PAPER_MARGIN = 20;
+namespace {
+
+int const LYX_PAPER_MARGIN = 20;
+
+} // namespace anon
+
 extern int bibitemMaxWidth(BufferView *, LyXFont const &);
 
 
 int LyXText::workWidth(BufferView * bview) const
 {
        if (inset_owner) {
-               return inset_owner->textWidth(bview->painter());
+               return inset_owner->textWidth(bview);
        }
        return bview->workWidth();
 }
 
 
+int LyXText::GetRealCursorX(BufferView * bview) const
+{
+       int x = cursor.x();
+       if (the_locking_inset && (the_locking_inset->getLyXText(bview)!=this))
+               x = the_locking_inset->getLyXText(bview)->GetRealCursorX(bview);
+       return x;
+}
+
+
 unsigned char LyXText::TransformChar(unsigned char c, LyXParagraph * par,
                        LyXParagraph::size_type pos) const
 {
-       if (!Encoding::is_arabic(c))
+       if (!Encodings::is_arabic(c))
                if (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 && isdigit(c))
                        return c + (0xb0 - '0');
                else
                        return c;
 
-       unsigned char prev_char = pos > 0 ? par->GetChar(pos-1) : ' ';
+       unsigned char const prev_char = pos > 0 ? par->GetChar(pos-1) : ' ';
        unsigned char next_char = ' ';
-       for (LyXParagraph::size_type i = pos+1; i < par->Last(); ++i)
-               if (!Encoding::IsComposeChar_arabic(par->GetChar(i))) {
+
+       for (LyXParagraph::size_type i = pos+1; i < par->size(); ++i)
+               if (!Encodings::IsComposeChar_arabic(par->GetChar(i))) {
                        next_char = par->GetChar(i);
                        break;
                }
 
-       if (Encoding::is_arabic(next_char))
-               if (Encoding::is_arabic(prev_char))
-                       return Encoding::TransformChar(c, Encoding::FORM_MEDIAL);
+       if (Encodings::is_arabic(next_char)) {
+               if (Encodings::is_arabic(prev_char))
+                       return Encodings::TransformChar(c, Encodings::FORM_MEDIAL);
                else
-                       return Encoding::TransformChar(c, Encoding::FORM_INITIAL);
-       else
-               if (Encoding::is_arabic(prev_char))
-                       return Encoding::TransformChar(c, Encoding::FORM_FINAL);
+                       return Encodings::TransformChar(c, Encodings::FORM_INITIAL);
+       } else {
+               if (Encodings::is_arabic(prev_char))
+                       return Encodings::TransformChar(c, Encodings::FORM_FINAL);
                else
-                       return Encoding::TransformChar(c, Encoding::FORM_ISOLATED);
+                       return Encodings::TransformChar(c, Encodings::FORM_ISOLATED);
+       }
 }
 
 // This is the comments that some of the warnings below refers to.
@@ -112,7 +125,7 @@ unsigned char LyXText::TransformChar(unsigned char c, LyXParagraph * par,
 int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par,
                         LyXParagraph::size_type pos) const
 {
-       char c = par->GetChar(pos);
+       char const c = par->GetChar(pos);
        return SingleWidth(bview, par, pos, c);
 }
 
@@ -120,7 +133,7 @@ int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par,
 int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par,
                         LyXParagraph::size_type pos, char c) const
 {
-       LyXFont font = GetFont(bview->buffer(), par, pos);
+       LyXFont const font = GetFont(bview->buffer(), par, pos);
 
        // The most common case is handled first (Asger)
        if (IsPrintable(c)) {
@@ -128,12 +141,12 @@ int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par,
                        if (font.language()->lang() == "arabic" &&
                            (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 ||
                             lyxrc.font_norm_type == LyXRC::ISO_10646_1))
-                               if (Encoding::IsComposeChar_arabic(c))
+                               if (Encodings::IsComposeChar_arabic(c))
                                        return 0;
                                else
                                        c = TransformChar(c, par, pos);
                        else if (font.language()->lang() == "hebrew" &&
-                                Encoding::IsComposeChar_hebrew(c))
+                                Encodings::IsComposeChar_hebrew(c))
                                return 0;
                }
                return lyxfont::width(c, font);
@@ -141,42 +154,6 @@ int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par,
        } else if (IsHfillChar(c)) {
                return 3;       /* Because of the representation
                                 * as vertical lines */
-#ifndef NEW_INSETS
-       } else if (c == LyXParagraph::META_FOOTNOTE ||
-                  c == LyXParagraph::META_MARGIN ||
-                  c == LyXParagraph::META_FIG ||
-                  c == LyXParagraph::META_TAB ||
-                  c == LyXParagraph::META_WIDE_FIG ||
-                  c == LyXParagraph::META_WIDE_TAB ||
-                  c == LyXParagraph::META_ALGORITHM) {
-               string fs;
-               switch (c) {
-               case LyXParagraph::META_MARGIN:
-                       fs = "margin";
-                       break;
-               case LyXParagraph::META_FIG:
-                       fs = "fig";
-                       break;
-               case LyXParagraph::META_TAB:
-                       fs = "tab";
-                       break;
-               case LyXParagraph::META_ALGORITHM:
-                       fs = "alg";
-                       break;
-               case LyXParagraph::META_WIDE_FIG:
-                       fs = "wide-fig";
-                       break;
-               case LyXParagraph::META_WIDE_TAB:
-                       fs = "wide-tab";
-                       break;
-               case LyXParagraph::META_FOOTNOTE:
-                       fs = "foot";
-                       break;
-               }
-               font.decSize();
-               font.decSize();
-               return lyxfont::width(fs, font);
-#endif
        } else if (c == LyXParagraph::META_INSET) {
                Inset * tmpinset = par->GetInset(pos);
                if (tmpinset) {
@@ -197,9 +174,9 @@ int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par,
 LyXParagraph::size_type LyXText::RowLast(Row const * row) const
 {
        if (row->next() == 0)
-               return row->par()->Last() - 1;
+               return row->par()->size() - 1;
        else if (row->next()->par() != row->par()) 
-               return row->par()->Last() - 1;
+               return row->par()->size() - 1;
        else 
                return row->next()->pos() - 1;
 }
@@ -207,7 +184,7 @@ LyXParagraph::size_type LyXText::RowLast(Row const * row) const
 
 LyXParagraph::size_type LyXText::RowLastPrintable(Row const * row) const
 {
-       LyXParagraph::size_type last = RowLast(row);
+       LyXParagraph::size_type const last = RowLast(row);
        if (last >= row->pos()
            && row->next()
            && row->next()->par() == row->par()
@@ -248,38 +225,39 @@ void LyXText::ComputeBidiTables(Buffer const * buf, Row * row) const
        log2vis_list[bidi_end + 1 - bidi_start] = -1;
 
        LyXParagraph::size_type stack[2];
-       bool rtl_par = row->par()->getParLanguage(buf->params)->RightToLeft();
+       bool const rtl_par =
+               row->par()->getParLanguage(buf->params)->RightToLeft();
        int level = 0;
        bool rtl = false;
        bool rtl0 = false;
-       LyXParagraph::size_type main_body = BeginningOfMainBody(buf, row->par());
+       LyXParagraph::size_type const main_body =
+               BeginningOfMainBody(buf, row->par());
 
        for (LyXParagraph::size_type lpos = bidi_start;
             lpos <= bidi_end; ++lpos) {
                bool is_space = row->par()->IsLineSeparator(lpos);
-               LyXParagraph::size_type pos =
+               LyXParagraph::size_type const pos =
                        (is_space && lpos + 1 <= bidi_end &&
                         !row->par()->IsLineSeparator(lpos + 1) &&
-                        (
-#ifndef NEW_TABULAR
-                                !row->par()->table ||
-#endif
-                                !row->par()->IsNewline(lpos + 1)) )
+                        !row->par()->IsNewline(lpos + 1))
                        ? lpos + 1 : lpos;
                LyXFont font = row->par()->GetFontSettings(buf->params, pos);
+               if (pos != lpos && 0 < lpos && rtl0 && font.isRightToLeft() &&
+                   font.number() == LyXFont::ON &&
+                   row->par()->GetFontSettings(buf->params, lpos-1).number()
+                   == LyXFont::ON) {
+                       font = row->par()->GetFontSettings(buf->params, lpos);
+                       is_space = false;
+               }
+
+
                bool new_rtl = font.isVisibleRightToLeft();
                bool new_rtl0 = font.isRightToLeft();
                int new_level;
 
-#ifndef NEW_TABULAR
-               if (row->par()->table && row->par()->IsNewline(lpos)) {
-                       new_level = 0;
-                       new_rtl = new_rtl0 = false;
-               } else
-#endif
-                       if (lpos == main_body - 1
-                          && row->pos() < main_body - 1
-                          && row->par()->IsLineSeparator(lpos)) {
+               if (lpos == main_body - 1
+                   && row->pos() < main_body - 1
+                   && is_space) {
                        new_level = (rtl_par) ? 1 : 0;
                        new_rtl = new_rtl0 = rtl_par;
                } else if (new_rtl0)
@@ -322,7 +300,7 @@ void LyXText::ComputeBidiTables(Buffer const * buf, Row * row) const
        }
 
        while (level > 0) {
-               LyXParagraph::size_type old_lpos = stack[--level];
+               LyXParagraph::size_type const old_lpos = stack[--level];
                int delta = bidi_end - old_lpos;
                if (level % 2)
                        delta = -delta;
@@ -343,26 +321,19 @@ void LyXText::ComputeBidiTables(Buffer const * buf, Row * row) const
 bool LyXText::IsBoundary(Buffer const * buf, LyXParagraph * par,
                         LyXParagraph::size_type pos) const
 {
-       if (!lyxrc.rtl_support)
-               return false;    // This is just for speedup
+       if (!lyxrc.rtl_support || pos == 0)
+               return false;
 
-       if (!bidi_InRange(pos - 1)
-#ifndef NEW_TABULAR
-           || (par->table && par->IsNewline(pos-1))
-#endif
-               )
+       if (!bidi_InRange(pos - 1)) {
+               /// This can happen if pos is the first char of a row.
+               /// Returning false in this case is incorrect!
                return false;
+       }
 
-       bool rtl = bidi_level(pos - 1) % 2;
-       bool rtl2 = rtl;
-       if (pos == par->Last()
-#ifndef NEW_TABULAR
-           || (par->table && par->IsNewline(pos))
-#endif
-               )
-               rtl2 = par->isRightToLeftPar(buf->params);
-       else if (bidi_InRange(pos))
-               rtl2 = bidi_level(pos) % 2;
+       bool const rtl = bidi_level(pos - 1) % 2;
+       bool const rtl2 = bidi_InRange(pos)
+               ? bidi_level(pos) % 2
+               : par->isRightToLeftPar(buf->params);
        return rtl != rtl2;
 }
 
@@ -374,16 +345,10 @@ bool LyXText::IsBoundary(Buffer const * buf, LyXParagraph * par,
        if (!lyxrc.rtl_support)
                return false;    // This is just for speedup
 
-       bool rtl = font.isVisibleRightToLeft();
-       bool rtl2 = rtl;
-       if (pos == par->Last()
-#ifndef NEW_TABULAR
-           || (par->table && par->IsNewline(pos))
-#endif
-               )
-               rtl2 = par->isRightToLeftPar(buf->params);
-       else if (bidi_InRange(pos))
-               rtl2 =  bidi_level(pos) % 2;
+       bool const rtl = font.isVisibleRightToLeft();
+       bool const rtl2 = bidi_InRange(pos)
+               ? bidi_level(pos) % 2
+               : par->isRightToLeftPar(buf->params);
        return rtl != rtl2;
 }
 
@@ -401,11 +366,12 @@ void LyXText::draw(BufferView * bview, Row const * row,
        if (IsNewlineChar(c)) {
                ++vpos;
                // Draw end-of-line marker
-               LyXFont font = GetFont(bview->buffer(), row->par(), pos);
-               int wid = lyxfont::width('n', font);
-               int asc = lyxfont::maxAscent(font);
-               int y = offset + row->baseline();
-               int xp[3], yp[3];
+               LyXFont const font = GetFont(bview->buffer(), row->par(), pos);
+               int const wid = lyxfont::width('n', font);
+               int const asc = lyxfont::maxAscent(font);
+               int const y = offset + row->baseline();
+               int xp[3];
+               int yp[3];
                
                if (bidi_level(pos) % 2 == 0) {
                        xp[0] = int(x + wid * 0.375);
@@ -458,75 +424,25 @@ void LyXText::draw(BufferView * bview, Row const * row,
 
        LyXFont font = GetFont(bview->buffer(), row->par(), pos);
        LyXFont font2 = font;
-#ifndef NEW_INSETS
-       if (c == LyXParagraph::META_FOOTNOTE
-           || c == LyXParagraph::META_MARGIN
-           || c == LyXParagraph::META_FIG
-           || c == LyXParagraph::META_TAB
-           || c == LyXParagraph::META_WIDE_FIG
-           || c == LyXParagraph::META_WIDE_TAB
-           || c == LyXParagraph::META_ALGORITHM) {
-               string fs;
-               switch (c) {
-               case LyXParagraph::META_MARGIN:
-                       fs = "margin";
-                       break;
-               case LyXParagraph::META_FIG:
-                       fs = "fig";
-                       break;
-               case LyXParagraph::META_TAB:
-                       fs = "tab";
-                       break;
-               case LyXParagraph::META_ALGORITHM:
-                       fs = "alg";
-                       break;
-               case LyXParagraph::META_WIDE_FIG:
-                       fs = "wide-fig";
-                       break;
-               case LyXParagraph::META_WIDE_TAB:
-                       fs = "wide-tab";
-                       break;
-               case LyXParagraph::META_FOOTNOTE:
-                       fs = "foot";
-                       break;
-               }
-               font.decSize();
-               font.decSize();
-         
-               // calculate the position of the footnotemark
-               int y = (row->baseline() - lyxfont::maxAscent(font2) 
-                        + lyxfont::maxAscent(font));
-         
-               font.setColor(LColor::footnote);
-
-               // draw it and set new x position
-               
-               pain.text(int(x), offset + y, fs, font);
-               x += lyxfont::width(fs, font);
-               pain.line(int(tmpx), offset + row->baseline(),
-                         int(x), offset + row->baseline(),
-                         LColor::footnote);
 
-               ++vpos;
-               return;
-       } else
-#endif
-               if (c == LyXParagraph::META_INSET) {
+       if (c == LyXParagraph::META_INSET) {
                Inset * tmpinset = row->par()->GetInset(pos);
                if (tmpinset) {
 //                     tmpinset->update(bview, font, false);
                        tmpinset->draw(bview, font, offset+row->baseline(), x,
                                       cleared);
+#ifdef SEEMS_TO_BE_NOT_NEEDED
                        if (status == CHANGED_IN_DRAW) {
                                UpdateInset(bview, tmpinset);
                                status = CHANGED_IN_DRAW;
                        }
+#endif
                }
                ++vpos;
 
                if (lyxrc.mark_foreign_language &&
-                   font.language() != bview->buffer()->params.language_info) {
-                       int y = offset + row->height() - 1;
+                   font.language() != bview->buffer()->params.language) {
+                       int const y = offset + row->height() - 1;
                        pain.line(int(tmpx), y, int(x), y,
                                  LColor::language);
                }
@@ -551,17 +467,20 @@ void LyXText::draw(BufferView * bview, Row const * row,
        textstring = c;
        ++vpos;
 
-       LyXParagraph::size_type last = RowLastPrintable(row);
+       LyXParagraph::size_type const last = RowLastPrintable(row);
 
        if (font.language()->lang() == "hebrew") {
-               if (Encoding::IsComposeChar_hebrew(c)) {
-                       int width = lyxfont::width(c, font2);
+               if (Encodings::IsComposeChar_hebrew(c)) {
+                       int const width = lyxfont::width(c, font2);
                        int dx = 0;
                        for (LyXParagraph::size_type i = pos-1; i >= 0; --i) {
                                c = row->par()->GetChar(i);
-                               if (!Encoding::IsComposeChar_hebrew(c)) {
+                               if (!Encodings::IsComposeChar_hebrew(c)) {
                                        if (IsPrintableNonspace(c)) {
-                                               int width2 = SingleWidth(bview, row->par(), i, c);
+                                               int const width2 =
+                                                       SingleWidth(bview,
+                                                                   row->par(),
+                                                                   i, c);
                                                dx = (c == 'ø' || c == 'ã') // dalet / resh
                                                        ? width2 - width : (width2 - width) / 2;
                                        }
@@ -575,7 +494,7 @@ void LyXText::draw(BufferView * bview, Row const * row,
                        while (vpos <= last &&
                               (pos = vis2log(vpos)) >= 0
                               && IsPrintableNonspace(c = row->par()->GetChar(pos))
-                              && !Encoding::IsComposeChar_hebrew(c)
+                              && !Encodings::IsComposeChar_hebrew(c)
                               && font2 == GetFont(bview->buffer(), row->par(), pos)) {
                                textstring += c;
                                ++vpos;
@@ -588,16 +507,19 @@ void LyXText::draw(BufferView * bview, Row const * row,
        } else if (font.language()->lang() == "arabic" &&
                   (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 ||
                    lyxrc.font_norm_type == LyXRC::ISO_10646_1)) {
-               if (Encoding::IsComposeChar_arabic(c)) {
+               if (Encodings::IsComposeChar_arabic(c)) {
                        c = TransformChar(c, row->par(), pos);
                        textstring = c;
-                       int width = lyxfont::width(c, font2);
+                       int const width = lyxfont::width(c, font2);
                        int dx = 0;
                        for (LyXParagraph::size_type i = pos-1; i >= 0; --i) {
                                c = row->par()->GetChar(i);
-                               if (!Encoding::IsComposeChar_arabic(c)) {
+                               if (!Encodings::IsComposeChar_arabic(c)) {
                                        if (IsPrintableNonspace(c)) {
-                                               int width2 = SingleWidth(bview, row->par(), i, c);
+                                               int const width2 =
+                                                       SingleWidth(bview,
+                                                                   row->par(),
+                                                                   i, c);
                                                dx = (width2 - width) / 2;
                                        }
                                        break;
@@ -611,7 +533,7 @@ void LyXText::draw(BufferView * bview, Row const * row,
                        while (vpos <= last &&
                               (pos = vis2log(vpos)) >= 0
                               && IsPrintableNonspace(c = row->par()->GetChar(pos))
-                              && !Encoding::IsComposeChar_arabic(c)
+                              && !Encodings::IsComposeChar_arabic(c)
                               && font2 == GetFont(bview->buffer(), row->par(), pos)) {
                                c = TransformChar(c, row->par(), pos);
                                textstring += c;
@@ -636,8 +558,8 @@ void LyXText::draw(BufferView * bview, Row const * row,
        }
 
        if (lyxrc.mark_foreign_language &&
-           font.language() != bview->buffer()->params.language_info) {
-               int y = offset + row->height() - 1;
+           font.language() != bview->buffer()->params.language) {
+               int const y = offset + row->height() - 1;
                pain.line(int(tmpx), y, int(x), y,
                          LColor::language);
        }
@@ -660,12 +582,6 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const
        
        string parindent = layout.parindent; 
 
-#ifndef NEW_TABULAR
-       /* table stuff -- begin */ 
-       if (row->par()->table)
-               parindent.erase();
-       /* table stuff -- end */
-#endif
        int x = LYX_PAPER_MARGIN;
        
        x += lyxfont::signedWidth(textclasslist
@@ -674,25 +590,14 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const
                                  textclasslist
                                  .TextClass(bview->buffer()->params.textclass)
                                  .defaultfont());
-#ifndef NEW_INSETS
-       if (row->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)  {
-               LyXFont font(LyXFont::ALL_SANE);
-               font.setSize(LyXFont::SIZE_SMALL);
-               x += lyxfont::width("Mwide-figM", font)
-                       + LYX_PAPER_MARGIN/2;
-       }
-#endif
+
        // this is the way, LyX handles the LaTeX-Environments.
        // I have had this idea very late, so it seems to be a
        // later added hack and this is true
        if (!row->par()->GetDepth()) {
                if (!row->par()->GetLayout()) {
                        // find the previous same level paragraph
-#ifndef NEW_INSETS
-                       if (row->par()->FirstPhysicalPar()->Previous()) {
-#else
-                       if (row->par()->Previous()) {
-#endif
+                       if (row->par()->previous()) {
                                LyXParagraph * newpar = row->par()
                                        ->DepthHook(row->par()->GetDepth());
                                if (newpar &&
@@ -712,34 +617,23 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const
                
                // check wether it is a sufficent paragraph 
                if (newpar
-#ifndef NEW_INSETS
-                   && newpar->footnoteflag == row->par()->footnoteflag
-#endif
                    && textclasslist
                        .Style(bview->buffer()->params.textclass, 
                               newpar->GetLayout()).isEnvironment()) {
                        Row dummyrow;
                        dummyrow.par(newpar);
-                       dummyrow.pos(newpar->Last());
+                       dummyrow.pos(newpar->size());
                        x = LeftMargin(bview, &dummyrow);
                } else {
                        // this is no longer an error, because this function
                        // is used to clear impossible depths after changing
                        // a layout. Since there is always a redo,
                        // LeftMargin() is always called
-#ifndef NEW_INSETS
-                       row->par()->FirstPhysicalPar()->depth = 0;
-#else
-                       row->par()->depth = 0;
-#endif
+                       row->par()->params.depth(0);
                }
                
                if (newpar && !row->par()->GetLayout()) {
-#ifndef NEW_INSETS
-                       if (newpar->FirstPhysicalPar()->noindent)
-#else
-                       if (newpar->noindent)
-#endif
+                       if (newpar->params.noindent())
                                parindent.erase();
                        else
                                parindent = textclasslist
@@ -749,7 +643,7 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const
                
        }
        
-       LyXFont labelfont = GetFont(bview->buffer(), row->par(), -2);
+       LyXFont const labelfont = GetFont(bview->buffer(), row->par(), -2);
        switch (layout.margintype) {
        case MARGIN_DYNAMIC:
                if (!layout.leftmargin.empty()) {
@@ -837,35 +731,14 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const
        }
        break;
        }
-       if ((workWidth(bview) > 0) &&
-           (row->par()->pextra_type == LyXParagraph::PEXTRA_INDENT))
-       {
-               if (!row->par()->pextra_widthp.empty()) {
-                       x += workWidth(bview) *
-                               atoi(row->par()->pextra_widthp.c_str()) / 100;
-               } else if (!row->par()->pextra_width.empty()) {
-                       int xx = VSpace(row->par()->pextra_width).inPixels(bview);
-                       if (xx > workWidth(bview))
-                               xx = workWidth(bview) * 80 / 100;
-                       x += xx;
-               } else { // should not happen
-                       LyXFont font(LyXFont::ALL_SANE);
-                       x += lyxfont::width("XXXXXX", font);
-               }
-       }
        
        int align; // wrong type
-#ifndef NEW_INSETS
-       if (row->par()->FirstPhysicalPar()->align == LYX_ALIGN_LAYOUT)
-               align = layout.align;
-       else
-               align = row->par()->FirstPhysicalPar()->align;
-#else
-       if (row->par()->align == LYX_ALIGN_LAYOUT)
+
+       if (row->par()->params.align() == LYX_ALIGN_LAYOUT)
                align = layout.align;
        else
-               align = row->par()->align;
-#endif 
+               align = row->par()->params.align();
+
        // set the correct parindent
        if (row->pos() == 0) {
                if ((layout.labeltype == LABEL_NO_LABEL 
@@ -874,11 +747,8 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const
                     || (layout.labeltype == LABEL_STATIC
                         && layout.latextype == LATEX_ENVIRONMENT
                         && ! row->par()->IsFirstInSequence()))
-#ifndef NEW_INSETS
-                   && row->par() == row->par()->FirstPhysicalPar()
-#endif
                    && align == LYX_ALIGN_BLOCK
-                   && !row->par()->noindent
+                   && !row->par()->params.noindent()
                    && (row->par()->layout ||
                        bview->buffer()->params.paragraph_separation ==
                        BufferParams::PARSEP_INDENT))
@@ -913,11 +783,6 @@ int LyXText::RightMargin(Buffer const * buf, Row const * row) const
                                       .TextClass(buf->params.textclass)
                                       .defaultfont());
 
-#ifndef NEW_INSETS
-       if (row->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)  {
-               x += LYX_PAPER_MARGIN / 2;
-       }
-#endif
        // this is the way, LyX handles the LaTeX-Environments.
        // I have had this idea very late, so it seems to be a
        // later added hack and this is true
@@ -926,27 +791,15 @@ int LyXText::RightMargin(Buffer const * buf, Row const * row) const
                
                LyXParagraph * newpar = row->par();
                
-#ifndef NEW_INSETS
-               do {
-                       newpar = newpar->FirstPhysicalPar()->Previous();
-                       if (newpar) 
-                               newpar = newpar->FirstPhysicalPar();
-               } while (newpar && newpar->GetDepth() >= row->par()->GetDepth()
-                        && newpar->footnoteflag == row->par()->footnoteflag);
-#else
                do {
-                       newpar = newpar->Previous();
+                       newpar = newpar->previous();
                } while (newpar
                         && newpar->GetDepth() >= row->par()->GetDepth());
-#endif
                
                // make a corresponding row. Needed to call LeftMargin()
                
                // check wether it is a sufficent paragraph
                if (newpar
-#ifndef NEW_INSETS
-                   && newpar->footnoteflag == row->par()->footnoteflag
-#endif
                    && textclasslist.Style(buf->params.textclass,
                                           newpar->GetLayout())
                       .isEnvironment()) {
@@ -959,11 +812,7 @@ int LyXText::RightMargin(Buffer const * buf, Row const * row) const
                        // is used to clear impossible depths after changing
                        // a layout. Since there is always a redo,
                        // LeftMargin() is always called
-#ifndef NEW_INSETS
-                       row->par()->FirstPhysicalPar()->depth = 0;
-#else
-                       row->par()->depth = 0;
-#endif
+                       row->par()->params.depth(0);
                }
        }
        
@@ -976,14 +825,14 @@ int LyXText::RightMargin(Buffer const * buf, Row const * row) const
 }
 
 
-int LyXText::LabelEnd (BufferView * bview, Row const * row) const
+int LyXText::LabelEnd(BufferView * bview, Row const * row) const
 {
        if (textclasslist.Style(bview->buffer()->params.textclass,
                                row->par()->GetLayout()).margintype
            == MARGIN_MANUAL) {
                Row tmprow;
                tmprow = *row;
-               tmprow.pos(row->par()->Last());
+               tmprow.pos(row->par()->size());
                return LeftMargin(bview, &tmprow);  /* just the beginning 
                                                of the main body */
        } else
@@ -993,100 +842,35 @@ int LyXText::LabelEnd (BufferView * bview, Row const * row) const
 }
 
 
-#ifndef NEW_TABULAR
-/* table stuff -- begin*/
-int LyXText::NumberOfCell(LyXParagraph * par,
-                         LyXParagraph::size_type pos) const
-{
-   int cell = 0;
-   LyXParagraph::size_type tmp_pos = 0;
-   while (tmp_pos < pos) {
-      if (par->IsNewline(tmp_pos))
-        ++cell;
-      ++tmp_pos;
-   }
-   return cell;
-}
-
-
-int LyXText::WidthOfCell(BufferView * bview, LyXParagraph * par,
-                        LyXParagraph::size_type & pos) const
-{
-   int w = 0;
-   while (pos < par->Last() && !par->IsNewline(pos)) {
-      w += SingleWidth(bview, par, pos);
-      ++pos;
-   }
-   if (par->IsNewline(pos))
-      ++pos;
-   return w;
-}
-
-
-bool LyXText::HitInTable(BufferView * bview, Row * row, int x) const
-{
-       float tmpx;
-       float fill_separator, fill_hfill, fill_label_hfill;
-       if (!row->par()->table)
-               return false;
-       PrepareToPrint(bview, row, tmpx, fill_separator,
-                      fill_hfill, fill_label_hfill, false);
-       return (x > tmpx && x < tmpx + row->par()->table->WidthOfTable());
-}
-
-
-bool LyXText::MouseHitInTable(BufferView * bview, int x, long y) const
-{
-       Row * row = GetRowNearY(y);
-        return HitInTable(bview, row, x);
-}
-
-
-/* table stuff -- end*/
-#endif
-
-
 // get the next breakpoint in a given paragraph
 LyXParagraph::size_type
 LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const
 {
        LyXParagraph * par = row->par();
-       LyXParagraph::size_type pos = row->pos();
 
        if (width < 0)
-               return par->Last();
-#ifndef NEW_TABULAR
-       /* table stuff -- begin*/ 
-       if (par->table) {
-               while (pos < par->size()
-                      && (!par->IsNewline(pos) 
-                          || !par->table->IsFirstCell(NumberOfCell(par, pos + 1)))) {
-                       if (par->GetChar(pos) == LyXParagraph::META_INSET &&
-                           par->GetInset(pos) && par->GetInset(pos)->display()){
-                               par->GetInset(pos)->display(false);
-                       }
-                       ++pos;
-               }
-               return pos;
-       }
-       /* table stuff -- end*/ 
-#endif 
+               return par->size();
+
+       LyXParagraph::size_type const pos = row->pos();
+
+
        // position of the last possible breakpoint 
        // -1 isn't a suitable value, but a flag
        LyXParagraph::size_type last_separator = -1;
        width -= RightMargin(bview->buffer(), row);
        
-       LyXParagraph::size_type main_body = BeginningOfMainBody(bview->buffer(), par);
+       LyXParagraph::size_type const main_body =
+               BeginningOfMainBody(bview->buffer(), par);
        LyXLayout const & layout =
                textclasslist.Style(bview->buffer()->params.textclass, par->GetLayout());
        LyXParagraph::size_type i = pos;
 
        if (layout.margintype == MARGIN_RIGHT_ADDRESS_BOX) {
                /* special code for right address boxes, only newlines count */
-               while (i < par->Last()) {
+               while (i < par->size()) {
                        if (par->IsNewline(i)) {
                                last_separator = i;
-                               i = par->Last() - 1; // this means break
+                               i = par->size() - 1; // this means break
                                //x = width;
                        } else if (par->GetChar(i) == LyXParagraph::META_INSET &&
                                   par->GetInset(i) && par->GetInset(i)->display()){
@@ -1097,13 +881,13 @@ LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const
        } else {
                // Last position is an invariant
                LyXParagraph::size_type const last = 
-                       par->Last();
+                       par->size();
                // this is the usual handling
                int x = LeftMargin(bview, row);
                bool doitonetime = true;
                while (doitonetime || ((x < width) && (i < last))) {
                        doitonetime = false;
-                       char c = par->GetChar(i);
+                       char const c = par->GetChar(i);
                        if (IsNewlineChar(c)) {
                                last_separator = i;
                                x = width; // this means break
@@ -1115,8 +899,8 @@ LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const
                                // non-display
                                if (par->GetInset(i)->display() &&
                                    (layout.isCommand() ||
-                                    ((layout.labeltype == LABEL_MANUAL) &&
-                                     (i < BeginningOfMainBody(bview->buffer(), par))))) {
+                                    (layout.labeltype == LABEL_MANUAL
+                                     && i < BeginningOfMainBody(bview->buffer(), par)))) {
                                        // display istn't allowd
                                        par->GetInset(i)->display(false);
                                        x += SingleWidth(bview, par, i, c);
@@ -1180,45 +964,17 @@ LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const
 int LyXText::Fill(BufferView * bview, Row * row, int paper_width) const
 {
        if (paper_width < 0)
-               return 0;
+               return 20;
 
-       int w, fill;
+       int w;
        // get the pure distance
-       LyXParagraph::size_type last = RowLastPrintable(row);
-#ifndef NEW_TABULAR
-       /* table stuff -- begin */
-       if (row->par()->table) {
-               // for tables FILL does calculate the widthes of each cell in 
-               // the row
-               LyXParagraph::size_type pos = row->pos();
-               int cell = NumberOfCell(row->par(), pos);
-               w = 0;
-               do {
-                       row->par()->table->SetWidthOfCell(cell,
-                                                       WidthOfCell(bview,
-                                                                   row->par(),
-                                                                   pos));
-                       ++cell;
-               } while (pos <= last && !row->par()->table->IsFirstCell(cell));
-               // don't forget the very last table cell without characters
-               if (cell == row->par()->table->GetNumberOfCells() - 1)
-                       row->par()->table->SetWidthOfCell(cell,
-                                                       WidthOfCell(bview,
-                                                                   row->par(),
-                                                                   pos));
-               
-               return 0; /* width of table cannot be returned since
-                          * we cannot guarantee its correct value at
-                          * this point. */ 
-       }
-       /* table stuff -- end*/ 
-#endif
+       LyXParagraph::size_type const last = RowLastPrintable(row);
        
        // special handling of the right address boxes
        if (textclasslist.Style(bview->buffer()->params.textclass,
                                row->par()->GetLayout()).margintype
            == MARGIN_RIGHT_ADDRESS_BOX) {
-               int tmpfill = row->fill();
+               int const tmpfill = row->fill();
                row->fill(0); // the minfill in MarginLeft()
                w = LeftMargin(bview, row);
                row->fill(tmpfill);
@@ -1227,7 +983,7 @@ int LyXText::Fill(BufferView * bview, Row * row, int paper_width) const
        
        LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass,
                                                       row->par()->GetLayout());
-       LyXParagraph::size_type main_body = 
+       LyXParagraph::size_type const main_body = 
                BeginningOfMainBody(bview->buffer(), row->par());
        LyXParagraph::size_type i = row->pos();
 
@@ -1247,12 +1003,19 @@ int LyXText::Fill(BufferView * bview, Row * row, int paper_width) const
                w += lyxfont::width(layout.labelsep, GetFont(bview->buffer(), row->par(), -2));
                if (last >= 0 && row->par()->IsLineSeparator(last))
                        w -= SingleWidth(bview, row->par(), last);
-               int left_margin = LabelEnd(bview, row);
+               int const left_margin = LabelEnd(bview, row);
                if (w < left_margin)
                        w = left_margin;
        }
        
-       fill = paper_width - w - RightMargin(bview->buffer(), row);
+       int const fill = paper_width - w - RightMargin(bview->buffer(), row);
+#ifdef WITH_WARNINGS
+#warning Please fix me (Jug!)
+#endif
+#if 0
+       if (fill < 0)
+               return 0;
+#endif
        return fill;
 }
 
@@ -1260,7 +1023,7 @@ int LyXText::Fill(BufferView * bview, Row * row, int paper_width) const
 // returns the minimum space a manual label needs on the screen in pixel
 int LyXText::LabelFill(BufferView * bview, Row const * row) const
 {
-       LyXParagraph::size_type last = BeginningOfMainBody(bview->buffer(), row->par())-1;
+       LyXParagraph::size_type last = BeginningOfMainBody(bview->buffer(), row->par()) - 1;
        // -1 because a label ends either with a space that is in the label, 
        // or with the beginning of a footnote that is outside the label.
 
@@ -1283,8 +1046,8 @@ int LyXText::LabelFill(BufferView * bview, Row const * row) const
        }
        
        int fill = 0;
-       if (!row->par()->labelwidthstring.empty()) {
-               fill = max(lyxfont::width(row->par()->labelwidthstring,
+       if (!row->par()->params.labelWidthString().empty()) {
+               fill = max(lyxfont::width(row->par()->params.labelWidthString(),
                                          GetFont(bview->buffer(), row->par(), -2)) - w,
                           0);
        }
@@ -1297,8 +1060,9 @@ int LyXText::LabelFill(BufferView * bview, Row const * row) const
 // on the very last column doesnt count
 int LyXText::NumberOfSeparators(Buffer const * buf, Row const * row) const
 {
-       int last = RowLast(row);
-       int p = max(row->pos(), BeginningOfMainBody(buf, row->par()));
+       LyXParagraph::size_type const last = RowLast(row);
+       LyXParagraph::size_type p =
+               max(row->pos(), BeginningOfMainBody(buf, row->par()));
        int n = 0;
        for (; p < last; ++p) {
                if (row->par()->IsSeparator(p)) {
@@ -1314,8 +1078,8 @@ int LyXText::NumberOfSeparators(Buffer const * buf, Row const * row) const
 // ignored. This is *MUCH* more usefull than not to ignore!
 int LyXText::NumberOfHfills(Buffer const * buf, Row const * row) const
 {
-       int last = RowLast(row);
-       int first = row->pos();
+       LyXParagraph::size_type const last = RowLast(row);
+       LyXParagraph::size_type first = row->pos();
        if (first) { /* hfill *DO* count at the beginning 
                      * of paragraphs! */
                while(first <= last && row->par()->IsHfill(first))
@@ -1396,7 +1160,8 @@ bool LyXText::HfillExpansion(Buffer const * buf, Row const * row_ptr,
 void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
 {
     /* get the maximum ascent and the maximum descent */
-   int asc = 0, desc = 0, pos = 0;
+   int asc = 0;
+   int desc = 0;
    float layoutasc = 0;
    float layoutdesc = 0;
    float tmptop = 0;
@@ -1405,7 +1170,7 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
 
    /* this must not happen before the currentrow for clear reasons.
       so the trick is just to set the current row onto this row */
-   long unused_y;
+   int unused_y;
    GetRow(row_ptr->par(), row_ptr->pos(), unused_y);
 
    /* ok , let us initialize the maxasc and maxdesc value. 
@@ -1415,27 +1180,22 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
 
    /* Correction: only the fontsize count. The other properties
       are taken from the layoutfont. Nicer on the screen :) */
-#ifndef NEW_INSETS   
-   LyXParagraph * par = row_ptr->par()->LastPhysicalPar();
-   LyXParagraph * firstpar = row_ptr->par()->FirstPhysicalPar();
-#else
    LyXParagraph * par = row_ptr->par();
    LyXParagraph * firstpar = row_ptr->par();
-#endif
    
    LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass,
                                                  firstpar->GetLayout());
-   
-   LyXFont font = GetFont(bview->buffer(), par, par->Last() - 1);
-   LyXFont::FONT_SIZE size = font.size();
+
+   LyXFont font = GetFont(bview->buffer(), par, par->size() - 1);
+   LyXFont::FONT_SIZE const size = font.size();
    font = GetFont(bview->buffer(), par, -1);
    font.setSize(size);
 
    LyXFont labelfont = GetFont(bview->buffer(), par, -2);
 
    float spacing_val = 1.0;
-   if (!row_ptr->par()->spacing.isDefault()) {
-          spacing_val = row_ptr->par()->spacing.getValue();
+   if (!row_ptr->par()->params.spacing().isDefault()) {
+          spacing_val = row_ptr->par()->params.spacing().getValue();
    } else {
           spacing_val = bview->buffer()->params.spacing.getValue();
    }
@@ -1447,17 +1207,17 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
    int maxdesc = int(lyxfont::maxDescent(font) *
                    layout.spacing.getValue() *
                    spacing_val);
-   int pos_end = RowLast(row_ptr);
+   int const pos_end = RowLast(row_ptr);
    int labeladdon = 0;
    int maxwidth = 0;
 
    // Check if any insets are larger
-   for (pos = row_ptr->pos(); pos <= pos_end; ++pos) {
+   for (int pos = row_ptr->pos(); pos <= pos_end; ++pos) {
           if (row_ptr->par()->GetChar(pos) == LyXParagraph::META_INSET) {
                   tmpfont = GetFont(bview->buffer(), row_ptr->par(), pos);
                   tmpinset = row_ptr->par()->GetInset(pos);
                   if (tmpinset) {
-                          tmpinset->update(bview, tmpfont);
+//                        tmpinset->update(bview, tmpfont);
                           asc = tmpinset->ascent(bview, tmpfont);
                           desc = tmpinset->descent(bview, tmpfont);
                           maxwidth += tmpinset->width(bview, tmpfont);
@@ -1472,7 +1232,7 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
    // Check if any custom fonts are larger (Asger)
    // This is not completely correct, but we can live with the small,
    // cosmetic error for now.
-   LyXFont::FONT_SIZE maxsize =
+   LyXFont::FONT_SIZE const maxsize =
           row_ptr->par()->HighestFontInRange(row_ptr->pos(),
                                              pos_end);
    if (maxsize > font.size()) {
@@ -1486,65 +1246,55 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
                maxdesc = desc;
    }
 
-#ifndef NEW_TABULAR
-   /* table stuff -- begin*/
-   if (row_ptr->par()->table){
-     // stretch the rows a bit
-      maxasc += 1;
-      maxdesc += 1;
-   }
-   /* table stuff -- end*/
-#endif
-   
    // This is nicer with box insets:
    ++maxasc;
    ++maxdesc;
 
    row_ptr->ascent_of_text(maxasc);
    
-   /* is it a top line? */ 
+   // is it a top line?
    if (!row_ptr->pos() && (row_ptr->par() == firstpar)) {
       
-      /* some parksips VERY EASY IMPLEMENTATION */ 
+          // some parksips VERY EASY IMPLEMENTATION
       if (bview->buffer()->params.paragraph_separation ==
          BufferParams::PARSEP_SKIP) {
         if (layout.isParagraph()
             && firstpar->GetDepth() == 0
-            && firstpar->Previous())
+            && firstpar->previous())
            maxasc += bview->buffer()->params.getDefSkip().inPixels(bview);
-        else if (firstpar->Previous()
+        else if (firstpar->previous()
                  && textclasslist.Style(bview->buffer()->params.textclass,
-                          firstpar->Previous()->GetLayout()).isParagraph()
-                 && firstpar->Previous()->GetDepth() == 0)
+                          firstpar->previous()->GetLayout()).isParagraph()
+                 && firstpar->previous()->GetDepth() == 0)
           // is it right to use defskip here too? (AS)
           maxasc += bview->buffer()->params.getDefSkip().inPixels(bview);
       }
       
-      /* the paper margins */ 
-      if (!row_ptr->par()->previous && bv_owner)
+      // the paper margins
+      if (!row_ptr->par()->previous() && bv_owner)
         maxasc += LYX_PAPER_MARGIN;
       
-      /* add the vertical spaces, that the user added */
-      if (firstpar->added_space_top.kind() != VSpace::NONE)
-        maxasc += int(firstpar->added_space_top.inPixels(bview));
+      // add the vertical spaces, that the user added
+      if (firstpar->params.spaceTop().kind() != VSpace::NONE)
+        maxasc += int(firstpar->params.spaceTop().inPixels(bview));
       
-      /* do not forget the DTP-lines! 
-       * there height depends on the font of the nearest character */
-      if (firstpar->line_top)
+      // do not forget the DTP-lines!
+      // there height depends on the font of the nearest character
+      if (firstpar->params.lineTop())
         maxasc += 2 * lyxfont::ascent('x', GetFont(bview->buffer(),
                                                    firstpar, 0));
       
-      /* and now the pagebreaks */ 
-      if (firstpar->pagebreak_top)
+      // and now the pagebreaks
+      if (firstpar->params.pagebreakTop())
         maxasc += 3 * DefaultHeight();
       
-      /*  this is special code for the chapter, since the label of this
-       * layout is printed in an extra row */ 
+      // This is special code for the chapter, since the label of this
+      // layout is printed in an extra row
       if (layout.labeltype == LABEL_COUNTER_CHAPTER
          && bview->buffer()->params.secnumdepth >= 0) {
              float spacing_val = 1.0;
-             if (!row_ptr->par()->spacing.isDefault()) {
-                     spacing_val = row_ptr->par()->spacing.getValue();
+             if (!row_ptr->par()->params.spacing().isDefault()) {
+                     spacing_val = row_ptr->par()->params.spacing().getValue();
              } else {
                      spacing_val = bview->buffer()->params.spacing.getValue();
              }
@@ -1557,15 +1307,15 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
                            spacing_val);
       }
       
-      /* special code for the top label */ 
+      // special code for the top label
       if ((layout.labeltype == LABEL_TOP_ENVIRONMENT
           || layout.labeltype == LABEL_BIBLIO
           || layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)
          && row_ptr->par()->IsFirstInSequence()
          && !row_ptr->par()->GetLabelstring().empty()) {
              float spacing_val = 1.0;
-             if (!row_ptr->par()->spacing.isDefault()) {
-                     spacing_val = row_ptr->par()->spacing.getValue();
+             if (!row_ptr->par()->params.spacing().isDefault()) {
+                     spacing_val = row_ptr->par()->params.spacing().getValue();
              } else {
                      spacing_val = bview->buffer()->params.spacing.getValue();
              }
@@ -1581,11 +1331,11 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
                      + layout.labelbottomsep *  DefaultHeight());
       }
    
-      /* and now the layout spaces, for example before and after a section, 
-       * or between the items of a itemize or enumerate environment */ 
+      // and now the layout spaces, for example before and after a section, 
+      // or between the items of a itemize or enumerate environment
       
-      if (!firstpar->pagebreak_top) {
-        LyXParagraph * prev = row_ptr->par()->Previous();
+      if (!firstpar->params.pagebreakTop()) {
+        LyXParagraph * prev = row_ptr->par()->previous();
         if (prev)
            prev = row_ptr->par()->DepthHook(row_ptr->par()->GetDepth());
         if (prev && prev->GetLayout() == firstpar->GetLayout()
@@ -1605,7 +1355,7 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
            if (tmptop > 0)
               layoutasc = (tmptop * DefaultHeight());
         }
-        else if (row_ptr->par()->line_top){
+        else if (row_ptr->par()->params.lineTop()) {
            tmptop = layout.topsep;
            
            if (tmptop > 0)
@@ -1618,52 +1368,49 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
                                         prev->GetLayout()).parsep * DefaultHeight());
         }
         else {
-               if (firstpar->Previous()
-                   && firstpar->Previous()->GetDepth() == 0
-                   && firstpar->Previous()->GetLayout() != firstpar->GetLayout()) {
-                  /* avoid parsep */ 
+               if (firstpar->previous()
+                   && firstpar->previous()->GetDepth() == 0
+                   && firstpar->previous()->GetLayout() != firstpar->GetLayout()) {
+                       // avoid parsep
                }
-           else if (firstpar->Previous()){
+           else if (firstpar->previous()){
               maxasc += int(layout.parsep * DefaultHeight());
            }
         }
       }
    }
    
-   /* is it a bottom line? */ 
-   if (
-#ifndef NEW_INSETS
-          row_ptr->par()->ParFromPos(RowLast(row_ptr) + 1) == par
-#else
-          row_ptr->par() == par
-#endif
-       && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par())) {     
+   // is it a bottom line?
+   if (row_ptr->par() == par
+       && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par())) {
          
-         /* the paper margins */ 
-         if (!par->next && bv_owner)
+          // the paper margins
+         if (!par->next() && bv_owner)
            maxdesc += LYX_PAPER_MARGIN;
-       
-         /* add the vertical spaces, that the user added */
-         if (firstpar->added_space_bottom.kind() != VSpace::NONE)
-                 maxdesc += int(firstpar->added_space_bottom.inPixels(bview));
          
-         /* do not forget the DTP-lines! 
-          * there height depends on the font of the nearest character */
-         if (firstpar->line_bottom)
-                 maxdesc += 2 * lyxfont::ascent('x', GetFont(bview->buffer(),
-                                                             par, par->Last() - 1));
+         // add the vertical spaces, that the user added
+         if (firstpar->params.spaceBottom().kind() != VSpace::NONE)
+                 maxdesc += int(firstpar->params.spaceBottom().inPixels(bview));
          
-         /* and now the pagebreaks */
-         if (firstpar->pagebreak_bottom)
+         // do not forget the DTP-lines!
+         // there height depends on the font of the nearest character
+         if (firstpar->params.lineBottom())
+                 maxdesc += 2 * lyxfont::ascent('x',
+                                                GetFont(bview->buffer(),
+                                                        par, par->size() - 1));
+         
+         // and now the pagebreaks
+         if (firstpar->params.pagebreakBottom())
            maxdesc += 3 * DefaultHeight();
          
-         /* and now the layout spaces, for example before and after a section, 
-          * or between the items of a itemize or enumerate environment */
-         if (!firstpar->pagebreak_bottom && row_ptr->par()->Next()) {
-            LyXParagraph * nextpar = row_ptr->par()->Next();
+         // and now the layout spaces, for example before and after
+         // a section, or between the items of a itemize or enumerate
+         // environment
+         if (!firstpar->params.pagebreakBottom() && row_ptr->par()->next()) {
+            LyXParagraph * nextpar = row_ptr->par()->next();
             LyXParagraph * comparepar = row_ptr->par();
             float usual = 0;
-            float  unusual = 0;
+            float unusual = 0;
             
             if (comparepar->GetDepth() > nextpar->GetDepth()) {
                usual = (textclasslist.Style(bview->buffer()->params.textclass, comparepar->GetLayout()).bottomsep * DefaultHeight());
@@ -1688,26 +1435,19 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
          }
        }
    
-   /* incalculate the layout spaces */ 
+   // incalculate the layout spaces
    maxasc += int(layoutasc * 2 / (2 + firstpar->GetDepth()));
    maxdesc += int(layoutdesc * 2 / (2 + firstpar->GetDepth()));
 
-#ifndef NEW_TABULAR
-   /* table stuff -- begin*/
-   if (row_ptr->par()->table){
-      maxasc += row_ptr->par()->table->
-       AdditionalHeight(NumberOfCell(row_ptr->par(), row_ptr->pos()));
-   }
-   /* table stuff -- end*/
-#endif
-   /* calculate the new height of the text */ 
+   // calculate the new height of the text
    height -= row_ptr->height();
    
    row_ptr->height(maxasc + maxdesc + labeladdon);
    row_ptr->baseline(maxasc + labeladdon);
    
    height += row_ptr->height();
-   float x, dummy;
+   float x;
+   float dummy;
    PrepareToPrint(bview, row_ptr, x, dummy, dummy, dummy, false);
    row_ptr->width(int(maxwidth + x));
    if (inset_owner) {
@@ -1730,8 +1470,7 @@ void LyXText::AppendParagraph(BufferView * bview, Row * row) const
    
    // The last character position of a paragraph is an invariant so we can 
    // safely get it here. (Asger)
-   int lastposition = row->par()->Last();
-
+   int const lastposition = row->par()->size();
    do {
       // Get the next breakpoint
       int z = NextBreakPoint(bview, row, workWidth(bview));
@@ -1761,11 +1500,11 @@ void LyXText::BreakAgain(BufferView * bview, Row * row) const
    bool not_ready = true;
    
    do  {
-      /* get the next breakpoint */
+          // get the next breakpoint
        LyXParagraph::size_type z = NextBreakPoint(bview, row, workWidth(bview));
       Row * tmprow = row;
-      
-      if (z < row->par()->Last() ) {
+
+      if (z < row->par()->size()) {
         if (!row->next() || (row->next() && row->next()->par() != row->par())) {
                 // insert a new row
            ++z;
@@ -1808,8 +1547,8 @@ void LyXText::BreakAgainOneRow(BufferView * bview, Row * row)
        // get the next breakpoint
        LyXParagraph::size_type z = NextBreakPoint(bview, row, workWidth(bview));
        Row * tmprow = row;
-       
-       if (z < row->par()->Last() ) {
+
+       if (z < row->par()->size()) {
                if (!row->next()
                    || (row->next() && row->next()->par() != row->par())) {
                        /* insert a new row */ 
@@ -1845,52 +1584,27 @@ void LyXText::BreakAgainOneRow(BufferView * bview, Row * row)
 
 void LyXText::BreakParagraph(BufferView * bview, char keep_layout)
 {
-   LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass,
-                                                 cursor.par()->GetLayout());
-#ifndef NEW_TABULAR   
-   /* table stuff -- begin */
-   if (cursor.par()->table) {
-       // breaking of tables is only allowed at the beginning or the end */
-       if (cursor.pos() && cursor.pos() < cursor.par()->size() &&
-           !cursor.par()->table->ShouldBeVeryLastCell(NumberOfCell(cursor.par(), cursor.pos())))
-              return; // no breaking of tables allowed
-   }
-   /* table stuff -- end */
-#endif
-   // this is only allowed, if the current paragraph is not empty or caption
-   if ((cursor.par()->Last() <= 0
-#ifndef NEW_INSETS
-       && !cursor.par()->IsDummy()
-#endif
-          )
-       && 
-       layout.labeltype!= LABEL_SENSITIVE)
-     return;
+   LyXLayout const & layout =
+          textclasslist.Style(bview->buffer()->params.textclass,
+                              cursor.par()->GetLayout());
 
+   // this is only allowed, if the current paragraph is not empty or caption
+   if ((cursor.par()->size() <= 0)
+       && layout.labeltype!= LABEL_SENSITIVE)
+          return;
+   
    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
-          ); 
-
-#ifndef NEW_TABULAR
-   /* table stuff -- begin */
-   if (cursor.par()->table) {
-       int cell = NumberOfCell(cursor.par(), cursor.pos());
-       if (cursor.par()->table->ShouldBeVeryLastCell(cell))
-           SetCursor(bview, cursor.par(), cursor.par()->size());
-   }
-   /* table stuff -- end */
-#endif
-   // please break always behind a space
-   if (cursor.pos() < cursor.par()->Last()
+          cursor.par()->previous(), 
+          cursor.par()->next()); 
+
+   // Always break behind a space
+   //
+   // It is better to erase the space (Dekel)
+   if (cursor.pos() < cursor.par()->size()
        && cursor.par()->IsLineSeparator(cursor.pos()))
-     cursor.pos(cursor.pos() + 1);
-   
+          cursor.par()->Erase(cursor.pos());
+           // cursor.pos(cursor.pos() + 1);
+
    // break the paragraph
    if (keep_layout)
      keep_layout = 2;
@@ -1898,33 +1612,23 @@ void LyXText::BreakParagraph(BufferView * bview, char keep_layout)
      keep_layout = layout.isEnvironment();
    cursor.par()->BreakParagraph(bview->buffer()->params, cursor.pos(),
                                keep_layout);
-#ifndef NEW_TABULAR
-   /* table stuff -- begin */
-   if (cursor.par()->table){
-     // the table should stay with the contents
-     if (!cursor.pos()){
-       cursor.par()->Next()->table = cursor.par()->table;
-       cursor.par()->table = 0;
-     }
-   }
-   /* table stuff -- end */
-#endif
+
    // well this is the caption hack since one caption is really enough
    if (layout.labeltype == LABEL_SENSITIVE) {
      if (!cursor.pos())
             // set to standard-layout
-            cursor.par()->SetLayout(bview->buffer()->params, 0);
+            cursor.par()->SetLayout(0);
      else
             // set to standard-layout
-            cursor.par()->Next()->SetLayout(bview->buffer()->params, 0);
+            cursor.par()->next()->SetLayout(0);
    }
    
    /* if the cursor is at the beginning of a row without prior newline, 
     * move one row up! 
     * This touches only the screen-update. Otherwise we would may have
     * an empty row on the screen */
-   if (cursor.pos() && !cursor.row()->par()->IsNewline(cursor.row()->pos() - 1) &&
-       cursor.row()->pos() == cursor.pos()) {
+   if (cursor.pos() && !cursor.row()->par()->IsNewline(cursor.row()->pos() - 1)
+       && cursor.row()->pos() == cursor.pos()) {
           CursorLeft(bview);
    } 
    
@@ -1946,23 +1650,19 @@ void LyXText::BreakParagraph(BufferView * bview, char keep_layout)
    cursor.row()->fill(Fill(bview, cursor.row(), workWidth(bview)));
 
    SetHeightOfRow(bview, cursor.row());
+
+   while (cursor.par()->next()->size()
+         && cursor.par()->next()->IsNewline(0))
+          cursor.par()->next()->Erase(0);
    
-   while (
-#ifndef NEW_TABULAR
-          !cursor.par()->Next()->table &&
-#endif
-          cursor.par()->Next()->Last()
-         && cursor.par()->Next()->IsNewline(0))
-          cursor.par()->Next()->Erase(0);
-   
-   InsertParagraph(bview, cursor.par()->Next(), cursor.row());
+   InsertParagraph(bview, cursor.par()->next(), cursor.row());
 
    UpdateCounters(bview, cursor.row()->previous());
    
    /* This check is necessary. Otherwise the new empty paragraph will
     * be deleted automatically. And it is more friendly for the user! */ 
    if (cursor.pos())
-          SetCursor(bview, cursor.par()->Next(), 0);
+          SetCursor(bview, cursor.par()->next(), 0);
    else
           SetCursor(bview, cursor.par(), 0);
    
@@ -1973,782 +1673,79 @@ void LyXText::BreakParagraph(BufferView * bview, char keep_layout)
 }
 
 
-#ifndef NEW_INSETS
-void LyXText::OpenFootnote(BufferView * bview)
-{
-   LyXParagraph * endpar,* tmppar;
-   Row * row;
-   
-   LyXParagraph * par = cursor.par()->ParFromPos(cursor.pos());
-   
-   /* if there is no footnote in this paragraph, just return. */ 
-   if (!par->next
-       || par->next->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE)
-     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(cursor.pos() + 1);
-   }
-   
-   /* now the cursor is at the beginning of the physical par */
-   SetCursor(bview, cursor.par(),
-            cursor.pos() + cursor.par()->ParFromPos(cursor.pos())->size());
-   
-   /* the cursor must be exactly before the footnote */ 
-   par = cursor.par()->ParFromPos(cursor.pos());
-   
-   status = LyXText::NEED_MORE_REFRESH;
-   refresh_row = cursor.row();
-   refresh_y = cursor.y() - cursor.row()->baseline();
-   
-   tmppar = cursor.par();
-   endpar = cursor.par()->Next();
-   row = cursor.row();
-   
-   tmppar->OpenFootnote(cursor.pos());
-   RemoveParagraph(row);
-   /* set the dimensions of the cursor row */
-   row->fill(Fill(bview, row, workWidth(bview)));
-   SetHeightOfRow(bview, row);
-   // CHECK See comment on top of text.C
-   tmppar = tmppar->Next();
-   
-   while (tmppar != endpar) {
-      if (tmppar) {
-        InsertParagraph(bview, tmppar, row);
-        while (row->next() && row->next()->par() == tmppar)
-          row = row->next();
-        tmppar = tmppar->Next();
-      }
-   }
-   SetCursor(bview, par->next, 0);
-   sel_cursor = cursor;
-}
-#endif
-
-
-#ifndef NEW_TABULAR
-/* table stuff -- begin*/
-
-void LyXText::TableFeatures(BufferView * bview, int feature, string const & val) const
+// Just a macro to make some thing easier. 
+void LyXText::RedoParagraph(BufferView * bview) const
 {
-       if (!cursor.par()->table)
-               return; /* this should never happen */
-  
-       int actCell = NumberOfCell(cursor.par(), cursor.pos());
-       SetUndo(bview->buffer(), Undo::FINISH, 
-               cursor.par()->ParFromPos(cursor.pos())->previous, 
-               cursor.par()->ParFromPos(cursor.pos())->next); 
-       
-       switch (feature){
-       case LyXTable::SET_PWIDTH:
-               cursor.par()->table->SetPWidth(actCell, val);
-               break;
-       case LyXTable::SET_SPECIAL_COLUMN:
-       case LyXTable::SET_SPECIAL_MULTI:
-               cursor.par()->table->SetAlignSpecial(actCell, val, feature);
-               break;
-       default:
-               break;
-       }
-       RedoParagraph(bview);
+       ClearSelection(bview);
+       RedoParagraphs(bview, cursor, cursor.par()->next());
+       SetCursorIntern(bview, cursor.par(), cursor.pos());
 }
 
 
-void LyXText::TableFeatures(BufferView * bview, int feature) const
+/* insert a character, moves all the following breaks in the 
+ * same Paragraph one to the right and make a rebreak */
+void LyXText::InsertChar(BufferView * bview, char c)
 {
-       int setLines = 0;
-       int setAlign = LYX_ALIGN_LEFT;
-       int lineSet;
-       bool what;
-    
-    if (!cursor.par()->table)
-        return; /* this should never happen */
-  
-    int actCell = NumberOfCell(cursor.par(), cursor.pos());
-    SetUndo(bview->buffer(), Undo::FINISH, 
-            cursor.par()->ParFromPos(cursor.pos())->previous, 
-            cursor.par()->ParFromPos(cursor.pos())->next); 
-
-    switch (feature){
-      case LyXTable::ALIGN_LEFT:
-          setAlign= LYX_ALIGN_LEFT;
-          break;
-      case LyXTable::ALIGN_RIGHT:
-          setAlign= LYX_ALIGN_RIGHT;
-          break;
-      case LyXTable::ALIGN_CENTER:
-          setAlign= LYX_ALIGN_CENTER;
-          break;
-      default:
-          break;
-    }
-    switch (feature){
-      case LyXTable::APPEND_ROW: {
-             LyXParagraph::size_type pos = cursor.pos();
-
-             /* move to the next row */
-          int cell_org = actCell;
-          int cell = cell_org;
-
-          // if there is a ContRow following this row I have to add
-          // the row after the ContRow's
-          if ((pos < cursor.par()->Last()) &&
-              cursor.par()->table->RowHasContRow(cell_org)) {
-              while((pos < cursor.par()->Last()) &&
-                    !cursor.par()->table->IsContRow(cell)) {
-                  while (pos < cursor.par()->Last() &&
-                         !cursor.par()->IsNewline(pos))
-                      ++pos;
-                  if (pos < cursor.par()->Last())
-                      ++pos;
-                  ++cell;
-              }
-              while((pos < cursor.par()->Last()) &&
-                    cursor.par()->table->IsContRow(cell)) {
-                  while (pos < cursor.par()->Last() &&
-                         !cursor.par()->IsNewline(pos))
-                      ++pos;
-                  if (pos < cursor.par()->Last())
-                      ++pos;
-                  ++cell;
-              }
-              cell_org = --cell;
-              if (pos < cursor.par()->Last())
-                  --pos;
-          }
-          while (pos < cursor.par()->Last() && 
-                 (cell == cell_org || !cursor.par()->table->IsFirstCell(cell))){
-              while (pos < cursor.par()->Last() && !cursor.par()->IsNewline(pos))
-                  ++pos;
-              if (pos < cursor.par()->Last())
-                  ++pos;
-              ++cell;
-          }
-               
-          /* insert the new cells */ 
-          int number = cursor.par()->table->NumberOfCellsInRow(cell_org);
-         Language const * lang = cursor.par()->getParLanguage(bview->buffer()->params);
-         LyXFont font(LyXFont::ALL_INHERIT,lang);
-          for (int i = 0; i < number; ++i) {
-              cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE, font);
-         }
-               
-          /* append the row into the table */
-          cursor.par()->table->AppendRow(cell_org);
-          RedoParagraph(bview);
-          return;
-      }
-      case LyXTable::APPEND_CONT_ROW: {
-             LyXParagraph::size_type pos = cursor.pos();
-          /* move to the next row */
-          int cell_org = actCell;
-          int cell = cell_org;
-
-          // if there is already a controw but not for this cell
-          // the AppendContRow sets only the right values but does
-          // not actually add a row
-          if (cursor.par()->table->RowHasContRow(cell_org) &&
-              (cursor.par()->table->CellHasContRow(cell_org)<0)) {
-              cursor.par()->table->AppendContRow(cell_org);
-              RedoParagraph(bview);
-              return;
-          }
-          while (pos < cursor.par()->Last() && 
-                 (cell == cell_org
-                  || !cursor.par()->table->IsFirstCell(cell))){
-              while (pos < cursor.par()->Last() && !cursor.par()->IsNewline(pos))
-                  ++pos;
-              if (pos < cursor.par()->Last())
-                  ++pos;
-              ++cell;
-          }
-               
-          /* insert the new cells */ 
-          int number = cursor.par()->table->NumberOfCellsInRow(cell_org);
-         Language const * lang = cursor.par()->getParLanguage(bview->buffer()->params);
-         LyXFont font(LyXFont::ALL_INHERIT,lang);
-          for (int i = 0; i < number; ++i) {
-              cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE, font);
-         }
+       SetUndo(bview->buffer(), Undo::INSERT,
+               cursor.par()->previous(),
+               cursor.par()->next());
 
-          /* append the row into the table */
-          cursor.par()->table->AppendContRow(cell_org);
-          RedoParagraph(bview);
-          return;
-      }
-      case LyXTable::APPEND_COLUMN: {
-             LyXParagraph::size_type pos = 0;
-          int cell_org = actCell;
-          int cell = 0;
-         Language const * lang = cursor.par()->getParLanguage(bview->buffer()->params);
-         LyXFont font(LyXFont::ALL_INHERIT,lang);
-          do{
-              if (pos && (cursor.par()->IsNewline(pos-1))){
-                  if (cursor.par()->table->AppendCellAfterCell(cell_org, cell)) {
-                      cursor.par()->InsertChar(pos,
-                                              LyXParagraph::META_NEWLINE,
-                                              font);
-                      if (pos <= cursor.pos())
-                          cursor.pos(cursor.pos() + 1);
-                      ++pos;
-                  }
-                  ++cell;
-              }
-              ++pos;
-          } while (pos <= cursor.par()->Last());
-          /* remember that the very last cell doesn't end with a newline.
-             This saves one byte memory per table ;-) */
-          if (cursor.par()->table->AppendCellAfterCell(cell_org, cell)) {
-                 LyXParagraph::size_type last = cursor.par()->Last();
-                 cursor.par()->InsertChar(last,
-                                          LyXParagraph::META_NEWLINE, font);
-         }
-               
-          /* append the column into the table */ 
-          cursor.par()->table->AppendColumn(cell_org);
-               
-          RedoParagraph(bview);
-          return;
-      }
-      case LyXTable::DELETE_ROW:
-          if (bview->the_locking_inset)
-              bview->unlockInset(bview->the_locking_inset);
-          RemoveTableRow(cursor);
-          RedoParagraph(bview);
-          return;
-       
-      case LyXTable::DELETE_COLUMN: {
-             LyXParagraph::size_type pos = 0;
-          int cell_org = actCell;
-          int cell = 0;
-          if (bview->the_locking_inset)
-              bview->unlockInset(bview->the_locking_inset);
-          do {
-              if (!pos || (cursor.par()->IsNewline(pos-1))){
-                  if (cursor.par()->table->DeleteCellIfColumnIsDeleted(cell, cell_org)){
-                      // delete one cell
-                      while (pos < cursor.par()->Last() && !cursor.par()->IsNewline(pos))
-                          cursor.par()->Erase(pos);
-                      if (pos < cursor.par()->Last())
-                          cursor.par()->Erase(pos);
-                      else 
-                          cursor.par()->Erase(pos - 1); // the missing newline at the end of a table
-                      --pos; // because of pos++ below
-                  }   
-                  ++cell;
-              }
-              ++pos;
-          } while (pos <= cursor.par()->Last());
-               
-          /* delete the column from the table */ 
-          cursor.par()->table->DeleteColumn(cell_org);
-               
-          /* set the cursor to the beginning of the table, where else? */ 
-          cursor.pos(0);
-          RedoParagraph(bview);
-          return;
-      }
-      case LyXTable::TOGGLE_LINE_TOP:
-          lineSet = !cursor.par()->table->TopLine(actCell);
-          if (!selection){
-              cursor.par()->table->SetTopLine(actCell, lineSet);
-          } else {
-                 LyXParagraph::size_type i;
-                 int n = -1, m = -2;
-              for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i){
-                  if ((n = NumberOfCell(sel_start_cursor.par(), i)) != m) {
-                      cursor.par()->table->SetTopLine(n, lineSet);
-                      m = n;
-                  }
-              }
-          }
-          RedoParagraph(bview);
-          return;
-    
-      case LyXTable::TOGGLE_LINE_BOTTOM:
-          lineSet = !cursor.par()->table->BottomLine(actCell);
-          if (!selection){
-              cursor.par()->table->SetBottomLine(actCell, lineSet);
-          } else {
-                 LyXParagraph::size_type i;
-                 int n = -1, m = -2;
-              for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i) {
-                  if ((n = NumberOfCell(sel_start_cursor.par(), i)) != m) {
-                      cursor.par()->table->SetBottomLine(n, lineSet);
-                      m = n;
-                  }
-              }
-          }
-          RedoParagraph(bview);
-          return;
-               
-      case LyXTable::TOGGLE_LINE_LEFT:
-          lineSet = !cursor.par()->table->LeftLine(actCell);
-          if (!selection){
-              cursor.par()->table->SetLeftLine(actCell, lineSet);
-          } else {
-                 LyXParagraph::size_type i;
-                 int n = -1, m = -2;
-              for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i){
-                  if ((n= NumberOfCell(sel_start_cursor.par(), i)) != m) {
-                      cursor.par()->table->SetLeftLine(n, lineSet);
-                      m = n;
-                  }
-              }
-          }
-          RedoParagraph(bview);
-          return;
-
-      case LyXTable::TOGGLE_LINE_RIGHT:
-          lineSet = !cursor.par()->table->RightLine(actCell);
-          if (!selection){
-              cursor.par()->table->SetRightLine(actCell, lineSet);
-          } else {
-                 int n = -1, m = -2;
-                 LyXParagraph::size_type i = sel_start_cursor.pos();
-              for (; i <= sel_end_cursor.pos(); ++i) {
-                  if ((n= NumberOfCell(sel_start_cursor.par(), i)) != m) {
-                      cursor.par()->table->SetRightLine(n, lineSet);
-                      m = n;
-                  }
-              }
-          }
-          RedoParagraph(bview);
-          return;
-    
-      case LyXTable::ALIGN_LEFT:
-      case LyXTable::ALIGN_RIGHT:
-      case LyXTable::ALIGN_CENTER:
-          if (!selection){
-              cursor.par()->table->SetAlignment(actCell, setAlign);
-          } else {
-              int n = -1, m = -2;
-             LyXParagraph::size_type i = sel_start_cursor.pos();
-              for (; i <= sel_end_cursor.pos(); ++i) {
-                  if ((n= NumberOfCell(sel_start_cursor.par(), i)) != m) {
-                      cursor.par()->table->SetAlignment(n, setAlign);
-                      m = n;
-                  }
-              }
-          }
-          RedoParagraph(bview);
-          return;
-               
-      case LyXTable::DELETE_TABLE:
-          SetCursorIntern(bview, cursor.par(), 0);
-          delete cursor.par()->table;
-          cursor.par()->table = 0;
-          // temporary: Should put table in simple_cut_buffer (with before and after
-          // dummy-paragraph !! 
-          // not necessar anymore with UNDO :)
-          for (LyXParagraph::size_type i = 
-                      cursor.par()->size() - 1; i >= 0; --i)
-             cursor.par()->Erase(i);
-          RedoParagraph(bview);
-          return;
-               
-      case LyXTable::MULTICOLUMN: {
-          int number = 0;
-          // check wether we are completly in a multicol
-          int multicol = cursor.par()->table->IsMultiColumn(actCell);
-          if (multicol && selection && sel_start_cursor.row() == sel_end_cursor.row()) {
-             multicol = NumberOfCell(sel_start_cursor.par(), sel_start_cursor.pos())
-                  == NumberOfCell(sel_end_cursor.par(), sel_end_cursor.pos());
-          }
-
-          if (multicol){
-             int newlines = cursor.par()->table->UnsetMultiColumn(actCell);
-             LyXParagraph::size_type pos = cursor.pos();
-             while (pos < cursor.par()->Last() && !cursor.par()->IsNewline(pos))
-                  ++pos;
-             for (; newlines; --newlines)
-                  cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE);
-             RedoParagraph(bview);
-             return;
-          }
-          else {
-             // selection must be in one row (or no selection)
-             if (!selection){
-                  cursor.par()->table->SetMultiColumn(NumberOfCell(cursor.par(),
-                                                                 cursor.pos()),
-                                                    1);
-                  RedoParagraph(bview);
-                  return;
-             }
-             else {
-                  if (sel_start_cursor.row() == sel_end_cursor.row()){
-                      LyXParagraph::size_type i;
-                      number = 1;
-                      for (i = sel_start_cursor.pos();
-                          i < sel_end_cursor.pos(); ++i){
-                          if (sel_start_cursor.par()->IsNewline(i)){
-                              sel_start_cursor.par()->Erase(i);
-                              // check for double-blanks
-                              if ((i && !sel_start_cursor.par()->IsLineSeparator(i-1))
-                                  &&
-                                  (i < sel_start_cursor.par()->Last() 
-                                   && !sel_start_cursor.par()->IsLineSeparator(i)))
-                                  sel_start_cursor.par()->InsertChar(i, ' ');
-                              else {
-                                  sel_end_cursor.pos(sel_end_cursor.pos() - 1);
-                                  --i;
-                              }
-                              ++number;
-                          }
-                      }
-                      cursor.par()->table->
-                         SetMultiColumn(NumberOfCell(sel_start_cursor.par(),
-                                                     sel_start_cursor.pos()),
-                                        number);
-                      cursor.pos(sel_start_cursor.pos());
-                      RedoParagraph(bview);
-                      return;
-                  }
-                  else {
-                      WriteAlert(_("Impossible Operation!"), 
-                                 _("Multicolumns can only be horizontally."), 
-                                 _("Sorry."));
-                  }
-             }
-          }
-         break;
-      }
-      case LyXTable::SET_ALL_LINES:
-          setLines = 1;
-      case LyXTable::UNSET_ALL_LINES:
-          if (!selection){
-              cursor.par()->table->SetAllLines(NumberOfCell(cursor.par(),
-                                                          cursor.pos()),
-                                             setLines);
-          } else {
-                 LyXParagraph::size_type i;
-                 int n = -1, m = -2;
-              for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i) {
-                  if ((n= NumberOfCell(sel_start_cursor.par(), i)) != m) {
-                      cursor.par()->table->SetAllLines(n, setLines);
-                      m = n;
-                  }
-              }
-          }
-          RedoParagraph(bview);
-          return;
-      case LyXTable::SET_LONGTABLE:
-          cursor.par()->table->SetLongTable(true);
-          return;
-      case LyXTable::UNSET_LONGTABLE:
-          cursor.par()->table->SetLongTable(false);
-          return;
-      case LyXTable::SET_ROTATE_TABLE:
-          cursor.par()->table->SetRotateTable(true);
-          return;
-      case LyXTable::UNSET_ROTATE_TABLE:
-          cursor.par()->table->SetRotateTable(false);
-          return;
-      case LyXTable::SET_ROTATE_CELL:
-          if (!selection){
-              cursor.par()->table->SetRotateCell(actCell, true);
-          } else {
-                 LyXParagraph::size_type i;
-                 int n = -1, m = -2;
-              for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i){
-                  if ((n = NumberOfCell(sel_start_cursor.par(), i)) != m) {
-                      cursor.par()->table->SetRotateCell(n, true);
-                      m = n;
-                  }
-              }
-          }
-          return;
-      case LyXTable::UNSET_ROTATE_CELL:
-          if (!selection){
-              cursor.par()->table->SetRotateCell(actCell, false);
-          } else {
-                 int n = -1, m = -2;
-                 LyXParagraph::size_type i = sel_start_cursor.pos();
-              for (; i <= sel_end_cursor.pos(); ++i) {
-                  if ((n= NumberOfCell(sel_start_cursor.par(), i)) != m) {
-                      cursor.par()->table->SetRotateCell(n, false);
-                      m = n;
-                  }
-              }
-          }
-          return;
-      case LyXTable::SET_LINEBREAKS:
-          what = !cursor.par()->table->Linebreaks(cursor.par()->table->FirstVirtualCell(actCell));
-          if (!selection){
-              cursor.par()->table->SetLinebreaks(actCell, what);
-          } else {
-                 LyXParagraph::size_type i;
-                 int n = -1, m = -2;
-              for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i) {
-                  if ((n = NumberOfCell(sel_start_cursor.par(), i)) != m) {
-                      cursor.par()->table->SetLinebreaks(n, what);
-                      m = n;
-                  }
-              }
-          }
-          return;
-      case LyXTable::SET_LTFIRSTHEAD:
-          cursor.par()->table->SetLTHead(actCell, true);
-          return;
-      case LyXTable::SET_LTHEAD:
-          cursor.par()->table->SetLTHead(actCell, false);
-          return;
-      case LyXTable::SET_LTFOOT:
-          cursor.par()->table->SetLTFoot(actCell, false);
-          return;
-      case LyXTable::SET_LTLASTFOOT:
-          cursor.par()->table->SetLTFoot(actCell, true);
-          return;
-      case LyXTable::SET_LTNEWPAGE:
-          what = !cursor.par()->table->LTNewPage(actCell);
-          cursor.par()->table->SetLTNewPage(actCell, what);
-          return;
-    }
-}
-       
+       // When the free-spacing option is set for the current layout,
+       // disable the double-space checking
 
-void LyXText::InsertCharInTable(BufferView * bview, char c)
-{
-       Row * row = 0;
-       Row * tmprow = 0;
-       long y;
-       bool jumped_over_space;
-       
-       /* first check, if there will be two blanks together or a blank at 
-        * the beginning of a paragraph. 
-        * I decided to handle blanks like normal characters, the main 
-        * difference are the special checks when calculating the row.fill
-        * (blank does not count at the end of a row) and the check here */ 
-       
-       LyXFont realtmpfont = real_current_font;
-       LyXFont rawtmpfont = current_font; /* store the current font.
-                                           * This is because of the use
-                                           * of cursor movements. The moving
-                                           * cursor would refresh the 
-                                           * current font */
+       bool const freeSpacing = 
+               textclasslist.Style(bview->buffer()->params.textclass,
+                              cursor.row()->par()->GetLayout()).free_spacing;
 
-       // Get the font that is used to calculate the baselineskip
-       LyXParagraph::size_type const lastpos = 
-               cursor.par()->Last();
-       LyXFont rawparfont = cursor.par()->GetFontSettings(bview->buffer()->params,
-                                                          lastpos - 1);
-
-       jumped_over_space = false;
-       if (IsLineSeparatorChar(c)) {
-               if ((cursor.pos() > 0 && 
-                    cursor.par()->IsLineSeparator(cursor.pos() - 1))
-                   || (cursor.pos() > 0 && cursor.par()->IsNewline(cursor.pos() - 1))
-                   || (cursor.pos() == 0
-#ifndef NEW_INSETS
-                       && !(cursor.par()->Previous()
-                         && cursor.par()->Previous()->footnoteflag
-                         == LyXParagraph::OPEN_FOOTNOTE)
-#endif
-                           ))
-                       return;
-       } else if (IsNewlineChar(c)) {
-            if (!IsEmptyTableCell()) {
-                TableFeatures(bview, LyXTable::APPEND_CONT_ROW);
-                CursorDown(bview);
-            }
-         return;
-       }
-   
-       row = cursor.row();
-       y = cursor.y() - row->baseline();
-       if (c != LyXParagraph::META_INSET)      /* in this case LyXText::InsertInset 
-                                        * already inserted the character */
-               cursor.par()->InsertChar(cursor.pos(), c);
-       SetCharFont(bview->buffer(), cursor.par(), cursor.pos(), rawtmpfont);
 
-       if (!jumped_over_space) {
-               /* refresh the positions */
-               tmprow = row;
-               while (tmprow->next() && tmprow->next()->par() == row->par()) {
-                       tmprow = tmprow->next();
-                       tmprow->pos(tmprow->pos() + 1);
+       if (lyxrc.auto_number) {
+               static string const number_operators = "+-/*";
+               static string const number_unary_operators = "+-";
+               static string const number_seperators = ".,:";
+
+               if (current_font.number() == LyXFont::ON) {
+                       if (!isdigit(c) && !contains(number_operators, c) &&
+                           !(contains(number_seperators, c) &&
+                             cursor.pos() >= 1 &&
+                             cursor.pos() < cursor.par()->size() &&
+                             GetFont(bview->buffer(),
+                                     cursor.par(),
+                                     cursor.pos()).number() == LyXFont::ON &&
+                             GetFont(bview->buffer(),
+                                     cursor.par(),
+                                     cursor.pos()-1).number() == LyXFont::ON)
+                           )
+                               Number(bview); // Set current_font.number to OFF
+               } else if (isdigit(c) &&
+                          real_current_font.isVisibleRightToLeft()) {
+                       Number(bview); // Set current_font.number to ON
+
+                       if (cursor.pos() > 0) {
+                               char const c = cursor.par()->GetChar(cursor.pos() - 1);
+                               if (contains(number_unary_operators, c) &&
+                                   (cursor.pos() == 1 ||
+                                    cursor.par()->IsSeparator(cursor.pos() - 2) ||
+                                    cursor.par()->IsNewline(cursor.pos() - 2) )
+                                  ) {
+                                       SetCharFont(bview->buffer(),
+                                                   cursor.par(),
+                                                   cursor.pos() - 1,
+                                                   current_font);
+                               } else if (contains(number_seperators, c) &&
+                                          cursor.pos() >= 2 &&
+                                          GetFont(bview->buffer(),
+                                                  cursor.par(),
+                                                  cursor.pos()-2).number() == LyXFont::ON) {
+                                       SetCharFont(bview->buffer(),
+                                                   cursor.par(),
+                                                   cursor.pos() - 1,
+                                                   current_font);
+                               }
+                       }
                }
        }
 
-       cursor.pos(cursor.pos() + 1);
-
-       CheckParagraphInTable(bview, cursor.par(), cursor.pos());
-       
-       current_font = rawtmpfont;
-       real_current_font = realtmpfont;
-       
-       /* check, whether the last character's font has changed. */
-       if (cursor.pos() && cursor.pos() == cursor.par()->Last()
-           && rawparfont != rawtmpfont)
-               RedoHeightOfParagraph(bview, cursor);
-}
 
-
-void LyXText::CheckParagraphInTable(BufferView * bview, LyXParagraph * par,
-                                   LyXParagraph::size_type pos)
-{
-       
-       if (par->GetChar(pos) == LyXParagraph::META_INSET &&
-           par->GetInset(pos) && par->GetInset(pos)->display()){
-         par->GetInset(pos)->display(false);
-       }
-
-       long y;
-       Row * row = GetRow(par, pos, y);
-       
-       int tmpheight = row->height();
-       SetHeightOfRow(bview, row);
-
-       LyXParagraph::size_type tmp_pos = pos;
-       /* update the table information */
-       while (tmp_pos && !par->IsNewline(tmp_pos - 1))
-               --tmp_pos;
-       if (par->table->SetWidthOfCell(NumberOfCell(par, pos),
-                                      WidthOfCell(bview, par, tmp_pos))) {
-               LyXCursor tmpcursor = cursor;
-               SetCursorIntern(bview, par, pos, false);
-               /* make a complete redraw */
-               RedoDrawingOfParagraph(bview, cursor);
-               cursor = tmpcursor;
-       }
-       else {
-               /* redraw only the row */
-               LyXCursor tmpcursor = cursor;
-               SetCursorIntern(bview, par, pos);
-               //CHECK See comment on top of text.C
-               refresh_y = y;
-               refresh_x = cursor.x();
-               refresh_row = row;
-               refresh_pos = cursor.pos();
-               cursor = tmpcursor;
-               
-               if (tmpheight == row->height())
-                       status = LyXText::NEED_VERY_LITTLE_REFRESH;
-               else
-                       status = LyXText::NEED_MORE_REFRESH;
-       }
-        SetCursorIntern(bview, cursor.par(), cursor.pos(), false,
-                       cursor.boundary());
-}
-
-
-void LyXText::BackspaceInTable(BufferView * bview)
-{
-       Row * tmprow, * row;
-       long y;
-       
-       LyXFont rawtmpfont = current_font;
-       LyXFont realtmpfont = real_current_font;
-
-       // Get the font that is used to calculate the baselineskip
-       int const lastpos = cursor.par()->Last();
-       LyXFont rawparfont = cursor.par()->GetFontSettings(bview->buffer()->params,
-                                                          lastpos - 1);
-       
-       if (cursor.pos() == 0) {
-               /* no pasting of table paragraphs */
-               
-               CursorLeft(bview);
-       } else {
-               /* this is the code for a normal backspace, not pasting
-                * any paragraphs */ 
-               SetUndo(bview->buffer(), Undo::DELETE, 
-                       cursor.par()->ParFromPos(cursor.pos())->previous, 
-                       cursor.par()->ParFromPos(cursor.pos())->next); 
-         
-               CursorLeftIntern(bview);
-               
-               /* some insets are undeletable here */
-               if (cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET) {
-                       if (!cursor.par()->GetInset(cursor.pos())->Deletable())
-                               return;
-               }
-               
-               row = cursor.row();
-               y = cursor.y() - row->baseline();
-               
-               /* some special code when deleting a newline. */
-               if (cursor.par()->IsNewline(cursor.pos())) {
-                       /* nothing :-) */
-                       return;
-               } else {
-                       cursor.par()->Erase(cursor.pos());
-                       
-                       /* refresh the positions */
-                       tmprow = row;
-                       while (tmprow->next()
-                              && tmprow->next()->par() == row->par()) {
-                               tmprow = tmprow->next();
-                               tmprow->pos(tmprow->pos() - 1);
-                       }
-               }
-      
-               CheckParagraphInTable(bview, cursor.par(), cursor.pos());
-      
-               /* check, wether the last characters font has changed. */ 
-               if (cursor.pos() && cursor.pos() == cursor.par()->Last()
-                   && rawparfont != rawtmpfont)
-                       RedoHeightOfParagraph(bview, cursor);
-
-               /* restore the current font 
-                * That is what a user expects! */
-               current_font = rawtmpfont;
-               real_current_font = realtmpfont;
-       }
-       SetCursorIntern(bview, cursor.par(), cursor.pos(), true,
-                       cursor.boundary());
-       if (IsBoundary(bview->buffer(), cursor.par(), cursor.pos()) != cursor.boundary())
-               SetCursor(bview, cursor.par(), cursor.pos(), false, !cursor.boundary());
-}
-
-/* table stuff -- end*/
-#endif
-
-
-// Just a macro to make some thing easier. 
-void LyXText::RedoParagraph(BufferView * bview) const
-{
-       ClearSelection();
-       RedoParagraphs(bview, cursor, cursor.par()->Next());
-       SetCursorIntern(bview, cursor.par(), cursor.pos());
-}
-
-
-/* insert a character, moves all the following breaks in the 
- * same Paragraph one to the right and make a rebreak */
-void LyXText::InsertChar(BufferView * bview, char c)
-{
-       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
-               );
-
-       // When the free-spacing option is set for the current layout,
-       // disable the double-space checking
-
-       bool freeSpacing = 
-               textclasslist.Style(bview->buffer()->params.textclass,
-                              cursor.row()->par()->GetLayout()).free_spacing;
-
-#ifndef NEW_TABULAR
-       /* table stuff -- begin*/
-       if (cursor.par()->table) {
-               InsertCharInTable(bview, c);
-               charInserted();
-               return;
-       }
-       /* table stuff -- end*/
-#endif
        /* First check, if there will be two blanks together or a blank at 
          the beginning of a paragraph. 
          I decided to handle blanks like normal characters, the main 
@@ -2768,9 +1765,10 @@ void LyXText::InsertChar(BufferView * bview, char c)
                                     * current font */
 
        // Get the font that is used to calculate the baselineskip
-       LyXParagraph::size_type lastpos = cursor.par()->Last();
-       LyXFont rawparfont = cursor.par()->GetFontSettings(bview->buffer()->params,
-                                                          lastpos - 1);
+       LyXParagraph::size_type const lastpos = cursor.par()->size();
+       LyXFont rawparfont =
+               cursor.par()->GetFontSettings(bview->buffer()->params,
+                                             lastpos - 1);
 
        bool jumped_over_space = false;
    
@@ -2779,26 +1777,20 @@ void LyXText::InsertChar(BufferView * bview, char c)
                     && cursor.par()->IsLineSeparator(cursor.pos() - 1))
                    || (cursor.pos() > 0
                        && cursor.par()->IsNewline(cursor.pos() - 1))
-                   || (cursor.pos() == 0
-#ifndef NEW_INSETS
-                       && !(cursor.par()->Previous()
-                            && cursor.par()->Previous()->footnoteflag
-                            == LyXParagraph::OPEN_FOOTNOTE)
-#endif
-                           )) {
-                       if (cursor.pos() == 0 )
-                               bview->owner()->getMiniBuffer()->Set(_("You cannot insert a space at the beginning of a paragraph.  Please read the Tutorial."));
-                       else
-                               bview->owner()->getMiniBuffer()->Set(_("You cannot type two spaces this way.  Please read the Tutorial."));
+                   || (cursor.pos() == 0)) {
+                       static bool sent_space_message = false;
+                       if (!sent_space_message) {
+                               if (cursor.pos() == 0) 
+                                       bview->owner()->message(_("You cannot insert a space at the beginning of a paragraph.  Please read the Tutorial."));
+                               else
+                                       bview->owner()->message(_("You cannot type two spaces this way.  Please read the Tutorial."));
+                               sent_space_message = true;
+                       }
                        charInserted();
                        return;
                }
        } else if (IsNewlineChar(c)) {
-#ifndef NEW_INSETS
-               if (cursor.par()->FirstPhysicalPar() == cursor.par()
-#else
                if (cursor.par() == cursor.par()
-#endif
                    && cursor.pos() <= BeginningOfMainBody(bview->buffer(), cursor.par())) {
                        charInserted();
                        return;
@@ -2806,11 +1798,11 @@ void LyXText::InsertChar(BufferView * bview, char c)
                /* No newline at first position 
                 * of a paragraph or behind labels. 
                 * TeX does not allow that. */
-               
-               if (cursor.pos() < cursor.par()->Last() &&
+
+               if (cursor.pos() < cursor.par()->size() &&
                    cursor.par()->IsLineSeparator(cursor.pos()))
                        // newline always after a blank!
-                       CursorRightIntern(bview);
+                       CursorRight(bview);
                cursor.row()->fill(-1);        // to force a new break
        }
    
@@ -2823,7 +1815,7 @@ void LyXText::InsertChar(BufferView * bview, char c)
 
        // get the cursor row fist
        Row * row = cursor.row();
-       long y = cursor.y() - row->baseline();
+       int y = cursor.y() - row->baseline();
        if (c != LyXParagraph::META_INSET) /* Here case LyXText::InsertInset 
                                            * already insertet the character */
                cursor.par()->InsertChar(cursor.pos(), c);
@@ -2846,7 +1838,7 @@ void LyXText::InsertChar(BufferView * bview, char c)
                LyXParagraph::size_type z = NextBreakPoint(bview,
                                                           row->previous(),
                                                           workWidth(bview));
-               if ( z >= row->pos()) {
+               if (z >= row->pos()) {
                        row->pos(z + 1);
                        
                        // set the dimensions of the row above
@@ -2874,8 +1866,8 @@ void LyXText::InsertChar(BufferView * bview, char c)
                        else
                                need_break_row = 0;
             
-                       // check, wether the last characters font has changed. 
-                       if (cursor.pos() && cursor.pos() == cursor.par()->Last()
+                       // check, wether the last characters font has changed.
+                       if (cursor.pos() && cursor.pos() == cursor.par()->size()
                            && rawparfont != rawtmpfont)
                                RedoHeightOfParagraph(bview, cursor);
                        
@@ -2889,7 +1881,7 @@ void LyXText::InsertChar(BufferView * bview, char c)
                              * will set fill to -1. Otherwise
                              * we would not get a rebreak! */
                row->fill(Fill(bview, row, workWidth(bview)));
-       if (row->fill() < 0 ) {
+       if (row->fill() < 0) {
                refresh_y = y;
                refresh_row = row; 
                refresh_x = cursor.x();
@@ -2908,6 +1900,10 @@ void LyXText::InsertChar(BufferView * bview, char c)
 
                SetCursor(bview, cursor.par(), cursor.pos() + 1, false,
                          cursor.boundary());
+               if (IsBoundary(bview->buffer(), cursor.par(), cursor.pos())
+                   != cursor.boundary())
+                       SetCursor(bview, cursor.par(), cursor.pos(), false,
+                         !cursor.boundary());
                if (row->next() && row->next()->par() == row->par())
                        need_break_row = row->next();
                else
@@ -2918,7 +1914,7 @@ void LyXText::InsertChar(BufferView * bview, char c)
                refresh_row = row;
                refresh_pos = cursor.pos();
                
-               int tmpheight = row->height();
+               int const tmpheight = row->height();
                SetHeightOfRow(bview, row);
                if (tmpheight == row->height())
                        status = LyXText::NEED_VERY_LITTLE_REFRESH;
@@ -2932,7 +1928,7 @@ void LyXText::InsertChar(BufferView * bview, char c)
        }
 
        // check, wether the last characters font has changed.
-       if (cursor.pos() && cursor.pos() == cursor.par()->Last()
+       if (cursor.pos() && cursor.pos() == cursor.par()->size()
            && rawparfont != rawtmpfont) {
                RedoHeightOfParagraph(bview, cursor);
        } else {
@@ -2977,22 +1973,13 @@ void LyXText::PrepareToPrint(BufferView * bview,
        fill_separator = 0;
        fill_label_hfill = 0;
 
-        bool is_rtl = row->par()->isRightToLeftPar(bview->buffer()->params);
-#ifndef NEW_INSETS
-
+        bool const is_rtl =
+               row->par()->isRightToLeftPar(bview->buffer()->params);
        if (is_rtl) {
-               x = RightMargin(bview->buffer(), row);
-               if (row->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
-                       LyXFont font(LyXFont::ALL_SANE);
-                       font.setSize(LyXFont::SIZE_SMALL);
-                       x += lyxfont::width("Mwide-figM", font);
-               }
+               x = (workWidth(bview) > 0)
+                       ? RightMargin(bview->buffer(), row) : 0;
        } else
-#endif
-               if (workWidth(bview) > 0)
-               x = LeftMargin(bview, row);
-       else
-               x = 0;
+               x = (workWidth(bview) > 0) ? LeftMargin(bview, row) : 0;
        
        // is there a manual margin with a manual label
        if (textclasslist.Style(bview->buffer()->params.textclass,
@@ -3008,41 +1995,26 @@ void LyXText::PrepareToPrint(BufferView * bview,
        }
                
        // are there any hfills in the row?
-       float nh = NumberOfHfills(bview->buffer(), row);
-
-#ifndef NEW_TABULAR
-/* table stuff -- begin*/
-       if (row->par()->table) {
-          w = workWidth(bview) - row->par()->table->WidthOfTable()
-          - x - RightMargin(bview->buffer(), row);
-          nh = 0; /* ignore hfills in tables */ 
-       }
-/* table stuff -- end*/
-#endif
+       float const nh = NumberOfHfills(bview->buffer(), row);
+
        if (nh)
-         fill_hfill = w /nh;
+         fill_hfill = w / nh;
        else  {
                // is it block, flushleft or flushright? 
                // set x how you need it
        int align;
-#ifndef NEW_INSETS
-       if (row->par()->FirstPhysicalPar()->align == LYX_ALIGN_LAYOUT)
+       if (row->par()->params.align() == LYX_ALIGN_LAYOUT)
          align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->GetLayout()).align;
        else
-         align = row->par()->FirstPhysicalPar()->align;
-#else
-       if (row->par()->align == LYX_ALIGN_LAYOUT)
-         align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->GetLayout()).align;
-       else
-         align = row->par()->align;
-#endif
+         align = row->par()->params.align();
           
        // center displayed insets 
        Inset * inset;
           if (row->par()->GetChar(row->pos()) == LyXParagraph::META_INSET
               && (inset=row->par()->GetInset(row->pos()))
               && (inset->display())) // || (inset->scroll() < 0)))
-            align = LYX_ALIGN_CENTER;
+            align = (inset->LyxCode() == Inset::MATHMACRO_CODE)
+                    ? LYX_ALIGN_BLOCK : LYX_ALIGN_CENTER;
 
           switch (align) {
            case LYX_ALIGN_BLOCK:
@@ -3101,25 +2073,23 @@ void LyXText::CursorRightOneWord(BufferView * bview) const
        LyXCursor tmpcursor = cursor;
        // CHECK See comment on top of text.C
 
-       if (tmpcursor.pos() == tmpcursor.par()->Last()
-           && tmpcursor.par()->Next()) {
-                       tmpcursor.par(tmpcursor.par()->Next());
+       if (tmpcursor.pos() == tmpcursor.par()->size()
+           && tmpcursor.par()->next()) {
+                       tmpcursor.par(tmpcursor.par()->next());
                        tmpcursor.pos(0);
        } else {
                int steps = 0;
 
                // Skip through initial nonword stuff.
-               while ( tmpcursor.pos() < tmpcursor.par()->Last() &&
-                       ! tmpcursor.par()->IsWord( tmpcursor.pos() ) ) 
-               {
+               while (tmpcursor.pos() < tmpcursor.par()->size() &&
+                      ! tmpcursor.par()->IsWord( tmpcursor.pos())) {
                  //    printf("Current pos1 %d", tmpcursor.pos()) ;
                        tmpcursor.pos(tmpcursor.pos() + 1);
                        ++steps;
                }
                // Advance through word.
-               while ( tmpcursor.pos() < tmpcursor.par()->Last() &&
-                       tmpcursor.par()->IsWord( tmpcursor.pos() ) )
-               {
+               while (tmpcursor.pos() < tmpcursor.par()->size() &&
+                       tmpcursor.par()->IsWord( tmpcursor.pos())) {
                  //     printf("Current pos2 %d", tmpcursor.pos()) ;
                        tmpcursor.pos(tmpcursor.pos() + 1);
                        ++steps;
@@ -3131,52 +2101,19 @@ void LyXText::CursorRightOneWord(BufferView * bview) const
 
 void LyXText::CursorTab(BufferView * bview) const
 {
-#ifndef NEW_TABULAR
-    if (cursor.par()->table) {
-        int cell = NumberOfCell(cursor.par(), cursor.pos());
-        while(cursor.par()->table->IsContRow(cell)) {
-            CursorUp(bview);
-            cell = NumberOfCell(cursor.par(), cursor.pos());
-        }
-        if (cursor.par()->table->ShouldBeVeryLastCell(cell))
-            TableFeatures(bview, LyXTable::APPEND_ROW);
-    }
-#endif
     LyXCursor tmpcursor = cursor;
-    while (tmpcursor.pos() < tmpcursor.par()->Last()
+    while (tmpcursor.pos() < tmpcursor.par()->size()
            && !tmpcursor.par()->IsNewline(tmpcursor.pos()))
         tmpcursor.pos(tmpcursor.pos() + 1);
-   
-    if (tmpcursor.pos() == tmpcursor.par()->Last()){
-        if (tmpcursor.par()->Next()) {
-            tmpcursor.par(tmpcursor.par()->Next());
+
+    if (tmpcursor.pos() == tmpcursor.par()->size()){
+        if (tmpcursor.par()->next()) {
+            tmpcursor.par(tmpcursor.par()->next());
             tmpcursor.pos(0);
         }
     } else
         tmpcursor.pos(tmpcursor.pos() + 1);
     SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
-#ifndef NEW_TABULAR
-    if (cursor.par()->table) {
-        int cell = NumberOfCell(cursor.par(), cursor.pos());
-        while (cursor.par()->table->IsContRow(cell) &&
-               !cursor.par()->table->ShouldBeVeryLastCell(cell)) {
-            tmpcursor = cursor;
-            while (tmpcursor.pos() < tmpcursor.par()->Last()
-                   && !tmpcursor.par()->IsNewline(tmpcursor.pos()))
-                tmpcursor.pos(tmpcursor.pos() + 1);
-   
-            if (tmpcursor.pos() == tmpcursor.par()->Last()){
-                if (tmpcursor.par()->Next()) {
-                    tmpcursor.par(tmpcursor.par()->Next());
-                    tmpcursor.pos(0);
-                }
-            } else
-                tmpcursor.pos(tmpcursor.pos() + 1);
-            SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
-            cell = NumberOfCell(cursor.par(), cursor.pos());
-        }
-    }
-#endif
 }
 
 
@@ -3191,23 +2128,17 @@ void LyXText::CursorLeftOneWord(BufferView * bview)  const
               && (tmpcursor.par()->IsSeparator(tmpcursor.pos() - 1) 
                   || tmpcursor.par()->IsKomma(tmpcursor.pos() - 1))
               && !(tmpcursor.par()->IsHfill(tmpcursor.pos() - 1)
-#ifndef NEW_INSETS
-                   || tmpcursor.par()->IsFloat(tmpcursor.pos() - 1)
-#endif
                    || tmpcursor.par()->IsInset(tmpcursor.pos() - 1)))
                tmpcursor.pos(tmpcursor.pos() - 1);
 
        if (tmpcursor.pos()
            && (tmpcursor.par()->IsInset(tmpcursor.pos() - 1)
-#ifndef NEW_INSETS
-               || tmpcursor.par()->IsFloat(tmpcursor.pos() - 1)
-#endif
                || tmpcursor.par()->IsHfill(tmpcursor.pos() - 1))) {
                tmpcursor.pos(tmpcursor.pos() - 1);
        } else if (!tmpcursor.pos()) {
-               if (tmpcursor.par()->Previous()){
-                       tmpcursor.par(tmpcursor.par()->Previous());
-                       tmpcursor.pos(tmpcursor.par()->Last());
+               if (tmpcursor.par()->previous()){
+                       tmpcursor.par(tmpcursor.par()->previous());
+                       tmpcursor.pos(tmpcursor.par()->size());
                }
        } else {                // Here, tmpcursor != 0 
                while (tmpcursor.pos() > 0 &&
@@ -3223,22 +2154,22 @@ void LyXText::CursorLeftOneWord(BufferView * bview)  const
 void LyXText::SelectWord(BufferView * bview) 
 {
        // Move cursor to the beginning, when not already there.
-       if ( cursor.pos()
-            && !cursor.par()->IsSeparator(cursor.pos()-1)
-            && !cursor.par()->IsKomma(cursor.pos()-1) )
+       if (cursor.pos()
+           && !cursor.par()->IsSeparator(cursor.pos()-1)
+           && !cursor.par()->IsKomma(cursor.pos()-1) )
                CursorLeftOneWord(bview);
 
        // set the sel cursor
        sel_cursor = cursor;
 
-       while ( cursor.pos() < cursor.par()->Last()
-                       && !cursor.par()->IsSeparator(cursor.pos())
-                       && !cursor.par()->IsKomma(cursor.pos()) )
+       while (cursor.pos() < cursor.par()->size()
+              && !cursor.par()->IsSeparator(cursor.pos())
+              && !cursor.par()->IsKomma(cursor.pos()) )
                cursor.pos(cursor.pos() + 1);
        SetCursor(bview, cursor.par(), cursor.pos() );
        
        // finally set the selection
-       SetSelection();
+       SetSelection(bview);
 }
 
 
@@ -3249,11 +2180,11 @@ void LyXText::SelectWord(BufferView * bview)
 bool LyXText::SelectWordWhenUnderCursor(BufferView * bview) 
 {
        if (!selection &&
-           cursor.pos() > 0 && cursor.pos() < cursor.par()->Last()
+           cursor.pos() > 0 && cursor.pos() < cursor.par()->size()
            && !cursor.par()->IsSeparator(cursor.pos())
            && !cursor.par()->IsKomma(cursor.pos())
            && !cursor.par()->IsSeparator(cursor.pos() -1)
-           && !cursor.par()->IsKomma(cursor.pos() -1) ) {
+           && !cursor.par()->IsKomma(cursor.pos() -1)) {
                SelectWord(bview);
                return true;
        }
@@ -3263,27 +2194,29 @@ bool LyXText::SelectWordWhenUnderCursor(BufferView * bview)
 
 // This function is only used by the spellchecker for NextWord().
 // It doesn't handle LYX_ACCENTs and probably never will.
-char * LyXText::SelectNextWord(BufferView * bview, float & value)
+string const LyXText::SelectNextWord(BufferView * bview,
+                                    float & value) const
 {
        LyXParagraph * tmppar = cursor.par();
        
        // If this is not the very first word, skip rest of
        // current word because we are probably in the middle
        // of a word if there is text here.
-       if (cursor.pos() || cursor.par()->previous) {
-               while (cursor.pos() < cursor.par()->Last()
+       if (cursor.pos() || cursor.par()->previous()) {
+               while (cursor.pos() < cursor.par()->size()
                       && cursor.par()->IsLetter(cursor.pos()))
                        cursor.pos(cursor.pos() + 1);
        }
+       
        // Now, skip until we have real text (will jump paragraphs)
-       while ((cursor.par()->Last() > cursor.pos()
+       while ((cursor.par()->size() > cursor.pos()
                && (!cursor.par()->IsLetter(cursor.pos())
                    || cursor.par()->getFont(bview->buffer()->params, cursor.pos())
                    .latex() == LyXFont::ON))
-              || (cursor.par()->Last() == cursor.pos() 
-                  && cursor.par()->Next())){
-               if (cursor.pos() == cursor.par()->Last()) {
-                       cursor.par(cursor.par()->Next());
+              || (cursor.par()->size() == cursor.pos()
+                  && cursor.par()->next())){
+               if (cursor.pos() == cursor.par()->size()) {
+                       cursor.par(cursor.par()->next());
                        cursor.pos(0);
                } else
                        cursor.pos(cursor.pos() + 1);
@@ -3298,41 +2231,27 @@ char * LyXText::SelectNextWord(BufferView * bview, float & value)
        // Start the selection from here
        sel_cursor = cursor;
 
-#ifdef HAVE_SSTREAM
        std::ostringstream latex;
-#else
-       ostrstream latex;
-#endif
+
        // and find the end of the word 
        // (optional hyphens are part of a word)
-       while (cursor.pos() < cursor.par()->Last()
+       while (cursor.pos() < cursor.par()->size()
               && (cursor.par()->IsLetter(cursor.pos())) 
                   || (cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET
                       && cursor.par()->GetInset(cursor.pos()) != 0
                       && cursor.par()->GetInset(cursor.pos())->Latex(bview->buffer(), latex, false, false) == 0
-#ifdef HAVE_SSTREAM
                       && latex.str() == "\\-"
-#else
-                      && latex.str() // protect against null pointers         
-                      && string(latex.str(), 3) == "\\-" // this is not nice at all
-#endif
                           ))
                cursor.pos(cursor.pos() + 1);
 
-#ifndef HAVE_SSTREAM
-       delete [] latex.str();
-#endif
        // Finally, we copy the word to a string and return it
-       char * str = 0;
-
+       string str;
        if (sel_cursor.pos() < cursor.pos()) {
-               str = new char [cursor.pos() - sel_cursor.pos() + 2];
-               LyXParagraph::size_type i, j;
-               for (i = sel_cursor.pos(), j = 0; i < cursor.pos(); ++i) {
+               LyXParagraph::size_type i;
+               for (i = sel_cursor.pos(); i < cursor.pos(); ++i) {
                        if (cursor.par()->GetChar(i) != LyXParagraph::META_INSET)
-                               str[j++] = cursor.par()->GetChar(i);
+                               str += cursor.par()->GetChar(i);
                }
-               str[j] = '\0';
        }
        return str;
 }
@@ -3347,40 +2266,29 @@ void LyXText::SelectSelectedWord(BufferView * bview)
        // set the sel cursor
        sel_cursor = cursor;
 
-#ifdef HAVE_SSTREAM
        std::ostringstream latex;
-#else
-       ostrstream latex;
-#endif
        
        // now find the end of the word
-       while (cursor.pos() < cursor.par()->Last()
+       while (cursor.pos() < cursor.par()->size()
               && (cursor.par()->IsLetter(cursor.pos())
                   || (cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET
                       && cursor.par()->GetInset(cursor.pos()) != 0
                       && cursor.par()->GetInset(cursor.pos())->Latex(bview->buffer(), latex, false, false) == 0
-#ifdef HAVE_SSTREAM
                       && latex.str() == "\\-"
-#else
-                      && string(latex.str(), 3) == "\\-"
-#endif
                           )))
                cursor.pos(cursor.pos() + 1);
        
-#ifndef HAVE_SSTREAM
-       delete [] latex.str();
-#endif
        SetCursor(bview, cursor.par(), cursor.pos());
        
        // finally set the selection
-       SetSelection();
+       SetSelection(bview);
 }
 
 
 /* -------> Delete from cursor up to the end of the current or next word. */
 void LyXText::DeleteWordForward(BufferView * bview)
 {
-       if (!cursor.par()->Last())
+       if (!cursor.par()->size())
                CursorRight(bview);
        else {
                LyXCursor tmpcursor = cursor;
@@ -3390,7 +2298,7 @@ void LyXText::DeleteWordForward(BufferView * bview)
                SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
                sel_cursor = cursor;
                cursor = tmpcursor;
-               SetSelection(); 
+               SetSelection(bview); 
                
                /* -----> Great, CutSelection() gets rid of multiple spaces. */
                CutSelection(bview);
@@ -3401,7 +2309,7 @@ void LyXText::DeleteWordForward(BufferView * bview)
 /* -------> Delete from cursor to start of current or prior word. */
 void LyXText::DeleteWordBackward(BufferView * bview)
 {
-       if (!cursor.par()->Last())
+       if (!cursor.par()->size())
               CursorLeft(bview);
        else {
               LyXCursor tmpcursor = cursor;
@@ -3411,7 +2319,7 @@ void LyXText::DeleteWordBackward(BufferView * bview)
               SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
               sel_cursor = cursor;
               cursor = tmpcursor;
-              SetSelection();
+              SetSelection(bview);
               CutSelection(bview);
        }
 }
@@ -3420,7 +2328,7 @@ void LyXText::DeleteWordBackward(BufferView * bview)
 /* -------> Kill to end of line. */
 void LyXText::DeleteLineForward(BufferView * bview)
 {
-       if (!cursor.par()->Last())
+       if (!cursor.par()->size())
                // Paragraph is empty, so we just go to the right
                CursorRight(bview);
        else {
@@ -3433,7 +2341,7 @@ void LyXText::DeleteLineForward(BufferView * bview)
                SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
                sel_cursor = cursor;
                cursor = tmpcursor;
-               SetSelection();
+               SetSelection(bview);
                // What is this test for ??? (JMarc)
                if (!selection) {
                        DeleteWordForward(bview);
@@ -3453,20 +2361,13 @@ void LyXText::DeleteLineForward(BufferView * bview)
 // version did. (JMarc) 
 void LyXText::ChangeWordCase(BufferView * bview, LyXText::TextCase action) 
 {
-#ifndef NEW_INSETS
-       LyXParagraph * tmppar = cursor.par()->ParFromPos(cursor.pos());
-#else
        LyXParagraph * tmppar = cursor.par();
-#endif
 
-       SetUndo(bview->buffer(),Undo::FINISH, tmppar->previous, tmppar->next); 
+       SetUndo(bview->buffer(),Undo::FINISH,
+               tmppar->previous(), tmppar->next()); 
 
-#ifndef NEW_INSETS
-       LyXParagraph::size_type tmppos = 
-               cursor.par()->PositionInParFromPos(cursor.pos());
-#else
        LyXParagraph::size_type tmppos = cursor.pos();
-#endif
+
        while (tmppos < tmppar->size()) {
                unsigned char c = tmppar->GetChar(tmppos);
                if (IsKommaChar(c) || IsLineSeparatorChar(c))
@@ -3495,17 +2396,48 @@ void LyXText::ChangeWordCase(BufferView * bview, LyXText::TextCase action)
 }
 
 
+void LyXText::TransposeChars(BufferView const & bview)
+{
+       LyXParagraph * tmppar = cursor.par();
+
+       SetUndo(bview.buffer(), Undo::FINISH,
+               tmppar->previous(), tmppar->next()); 
+
+       LyXParagraph::size_type tmppos = cursor.pos();
+
+       // First decide if it is possible to transpose at all
+
+       // We are at the beginning of a paragraph.
+       if (tmppos == 0) return;
+
+       // We are at the end of a paragraph.
+       if (tmppos == tmppar->size() - 1) return;
+
+       unsigned char c1 = tmppar->GetChar(tmppos);
+       unsigned char c2 = tmppar->GetChar(tmppos - 1);
+
+       if (c1 != LyXParagraph::META_INSET
+           && c2 != LyXParagraph::META_INSET) {
+               tmppar->SetChar(tmppos, c2);
+               tmppar->SetChar(tmppos - 1, c1);
+       }
+       // We should have an implementation that handles insets
+       // as well, but that will have to come later. (Lgb)
+       CheckParagraph(const_cast<BufferView*>(&bview), tmppar, tmppos);
+}
+
+
 void LyXText::Delete(BufferView * bview)
 {
        // this is a very easy implementation
 
        LyXCursor old_cursor = cursor;
-       int old_cur_par_id = old_cursor.par()->id();
-       int old_cur_par_prev_id = old_cursor.par()->previous ?
-               old_cursor.par()->previous->id() : 0;
+       int const old_cur_par_id = old_cursor.par()->id();
+       int const old_cur_par_prev_id = old_cursor.par()->previous() ?
+               old_cursor.par()->previous()->id() : 0;
        
        // just move to the right
-       CursorRightIntern(bview);
+       CursorRight(bview);
 
        // CHECK Look at the comment here.
        // This check is not very good...
@@ -3513,7 +2445,7 @@ void LyXText::Delete(BufferView * bview)
        // and that can very well delete the par or par->previous in
        // old_cursor. Will a solution where we compare paragraph id's
        //work better?
-       if ((cursor.par()->previous ? cursor.par()->previous->id() : 0)
+       if ((cursor.par()->previous() ? cursor.par()->previous()->id() : 0)
            == old_cur_par_prev_id
            && cursor.par()->id() != old_cur_par_id)
                return; // delete-empty-paragraph-mechanism has done it
@@ -3523,14 +2455,8 @@ void LyXText::Delete(BufferView * bview)
                LyXCursor tmpcursor = cursor;
                cursor = old_cursor; // to make sure undo gets the right cursor position
                SetUndo(bview->buffer(), Undo::DELETE,
-#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()->previous(), 
+                       cursor.par()->next()); 
                cursor = tmpcursor;
                Backspace(bview);
        }
@@ -3539,66 +2465,41 @@ void LyXText::Delete(BufferView * bview)
 
 void LyXText::Backspace(BufferView * bview)
 {
-#ifndef NEW_TABULAR
-       /* table stuff -- begin */
-       if (cursor.par()->table) {
-               BackspaceInTable(bview);
-               return;
-       }
-       /* table stuff -- end */
-#endif
-       // LyXFont rawtmpfont = current_font;
-       // LyXFont realtmpfont = real_current_font;
-       //    We don't need the above variables as calling to SetCursor() with third
-       //    argument eqaul to false, will not change current_font & real_current_font
-       
        // Get the font that is used to calculate the baselineskip
-       LyXParagraph::size_type lastpos = cursor.par()->Last();
-       LyXFont rawparfont = cursor.par()->GetFontSettings(bview->buffer()->params,
-                                                        lastpos - 1);
+       LyXParagraph::size_type lastpos = cursor.par()->size();
+       LyXFont rawparfont =
+               cursor.par()->GetFontSettings(bview->buffer()->params,
+                                             lastpos - 1);
 
        if (cursor.pos() == 0) {
-               // The cursor is at the beginning of a paragraph, so the the backspace
-               // will collapse two paragraphs into one.
+               // The cursor is at the beginning of a paragraph,
+               // so the the backspace will collapse two paragraphs into one.
                
                // we may paste some paragraphs
       
                // is it an empty paragraph?
       
                if ((lastpos == 0
-                    || (lastpos == 1 && cursor.par()->IsSeparator(0)))
-#ifndef NEW_INSETS
-                   && !(cursor.par()->Next() 
-                        && cursor.par()->footnoteflag == LyXParagraph::NO_FOOTNOTE
-                        && cursor.par()->Next()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
-#endif
-                       ) {
+                    || (lastpos == 1 && cursor.par()->IsSeparator(0)))) {
                        // This is an empty paragraph and we delete it just by moving the cursor one step
                        // left and let the DeleteEmptyParagraphMechanism handle the actual deletion
                        // of the paragraph.
                        
-                       if (cursor.par()->previous) {
-#ifndef NEW_INSETS
-                               LyXParagraph * tmppar = cursor.par()->previous->FirstPhysicalPar();
-#else
-                               LyXParagraph * tmppar = cursor.par()->previous;
-#endif
+                       if (cursor.par()->previous()) {
+                               LyXParagraph * tmppar = cursor.par()->previous();
                                if (cursor.par()->GetLayout() == tmppar->GetLayout()
-#ifndef NEW_INSETS
-                                   && cursor.par()->footnoteflag == tmppar->footnoteflag
-#endif
                                    && cursor.par()->GetAlign() == tmppar->GetAlign()) {
-                                       // Inherit botom DTD from the paragraph below.
+                                       // Inherit bottom DTD from the paragraph below.
                                        // (the one we are deleting)
-                                       tmppar->line_bottom = cursor.par()->line_bottom;
-                                       tmppar->added_space_bottom = cursor.par()->added_space_bottom;
-                                       tmppar->pagebreak_bottom = cursor.par()->pagebreak_bottom;
+                                       tmppar->params.lineBottom(cursor.par()->params.lineBottom());
+                                       tmppar->params.spaceBottom(cursor.par()->params.spaceBottom());
+                                       tmppar->params.pagebreakBottom(cursor.par()->params.pagebreakBottom());
                                }
                                
-                               CursorLeftIntern(bview);
+                               CursorLeft(bview);
                     
                                // the layout things can change the height of a row !
-                               int tmpheight = cursor.row()->height();
+                               int const tmpheight = cursor.row()->height();
                                SetHeightOfRow(bview, cursor.row());
                                if (cursor.row()->height() != tmpheight) {
                                        refresh_y = cursor.y() - cursor.row()->baseline();
@@ -3609,19 +2510,11 @@ void LyXText::Backspace(BufferView * bview)
                        }
                }
 
-#ifndef NEW_INSETS
-               if (cursor.par()->ParFromPos(cursor.pos())->previous){
+               if (cursor.par()->previous()) {
                        SetUndo(bview->buffer(), Undo::DELETE,
-                               cursor.par()->ParFromPos(cursor.pos())->previous->previous,
-                               cursor.par()->ParFromPos(cursor.pos())->next);
+                               cursor.par()->previous()->previous(),
+                               cursor.par()->next());
                }
-#else
-               if (cursor.par()->previous) {
-                       SetUndo(bview->buffer(), Undo::DELETE,
-                               cursor.par()->previous->previous,
-                               cursor.par()->next);
-               }
-#endif
                
                LyXParagraph * tmppar = cursor.par();
                Row * tmprow = cursor.row();
@@ -3630,10 +2523,11 @@ void LyXText::Backspace(BufferView * bview)
                // not a good idea since it triggers the auto-delete
                // mechanism. So we do a CursorLeftIntern()-lite,
                // without the dreaded mechanism. (JMarc)
-               if (cursor.par()->Previous()) { 
+               if (cursor.par()->previous()) { 
                        // steps into the above paragraph.
-                       SetCursorIntern(bview, cursor.par()->Previous(), 
-                                       cursor.par()->Previous()->Last(), false);
+                       SetCursorIntern(bview, cursor.par()->previous(),
+                                       cursor.par()->previous()->size(),
+                                       false);
                }
 
                /* Pasting is not allowed, if the paragraphs have different
@@ -3649,14 +2543,6 @@ void LyXText::Backspace(BufferView * bview)
                if (cursor.par() != tmppar
                    && (cursor.par()->GetLayout() == tmppar->GetLayout()
                        || tmppar->GetLayout() == 0 /*standard*/)
-#ifndef NEW_INSETS
-                   && cursor.par()->footnoteflag == tmppar->footnoteflag
-#endif
-#ifndef NEW_TABULAR
-                   /* table stuff -- begin*/
-                   && !cursor.par()->table /* no pasting of tables */ 
-                   /* table stuff -- end*/
-#endif
                    && cursor.par()->GetAlign() == tmppar->GetAlign()) {
 
                        RemoveParagraph(tmprow);
@@ -3695,14 +2581,8 @@ void LyXText::Backspace(BufferView * bview)
                /* this is the code for a normal backspace, not pasting
                 * any paragraphs */ 
                SetUndo(bview->buffer(), Undo::DELETE,
-#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()->previous(),
+                       cursor.par()->next()); 
                // We used to do CursorLeftIntern() here, but it is
                // not a good idea since it triggers the auto-delete
                // mechanism. So we do a CursorLeftIntern()-lite,
@@ -3725,7 +2605,7 @@ void LyXText::Backspace(BufferView * bview)
                }
                
                Row * row = cursor.row();
-               long y = cursor.y() - row->baseline();
+               int y = cursor.y() - row->baseline();
                LyXParagraph::size_type z;
                /* remember that a space at the end of a row doesnt count
                 * when calculating the fill */ 
@@ -3748,9 +2628,12 @@ void LyXText::Backspace(BufferView * bview)
                        }
                        if (cursor.par()->IsLineSeparator(cursor.pos() - 1))
                                cursor.pos(cursor.pos() - 1);
-                       
-                       if (cursor.pos() < cursor.par()->Last() && !cursor.par()->IsSeparator(cursor.pos())) {
+
+                       if (cursor.pos() < cursor.par()->size()
+                           && !cursor.par()->IsSeparator(cursor.pos())) {
                                cursor.par()->InsertChar(cursor.pos(), ' ');
+                               SetCharFont(bview->buffer(), cursor.par(), 
+                                           cursor.pos(), current_font);
                                // refresh the positions
                                tmprow = row;
                                while (tmprow->next() && tmprow->next()->par() == row->par()) {
@@ -3770,7 +2653,7 @@ void LyXText::Backspace(BufferView * bview)
                        }
 
                        // delete newlines at the beginning of paragraphs
-                       while (cursor.par()->Last() &&
+                       while (cursor.par()->size() &&
                               cursor.par()->IsNewline(cursor.pos()) &&
                               cursor.pos() == BeginningOfMainBody(bview->buffer(),
                                                                   cursor.par())) {
@@ -3789,13 +2672,13 @@ void LyXText::Backspace(BufferView * bview)
                if (row->previous() && row->previous()->par() == row->par()) {
                        z = NextBreakPoint(bview, row->previous(),
                                           workWidth(bview));
-                       if ( z >= row->pos()) {
+                       if (z >= row->pos()) {
                                row->pos(z + 1);
                                
                                Row * tmprow = row->previous();
                                
                                // maybe the current row is now empty
-                               if (row->pos() >= row->par()->Last()) {
+                               if (row->pos() >= row->par()->size()) {
                                        // remove it
                                        RemoveRow(row);
                                        need_break_row = 0;
@@ -3823,7 +2706,7 @@ void LyXText::Backspace(BufferView * bview)
                                // check, whether the last character's font has changed.
                                if (rawparfont !=
                                    cursor.par()->GetFontSettings(bview->buffer()->params,
-                                                                 cursor.par()->Last() - 1))
+                                                                 cursor.par()->size() - 1))
                                        RedoHeightOfParagraph(bview, cursor);
                                return;
                        }
@@ -3831,14 +2714,14 @@ void LyXText::Backspace(BufferView * bview)
                
                // break the cursor row again
                if (row->next() && row->next()->par() == row->par() &&
-                   (RowLast(row) == row->par()->Last() - 1 ||
+                   (RowLast(row) == row->par()->size() - 1 ||
                     NextBreakPoint(bview, row, workWidth(bview)) != RowLast(row))) {
                        
                        /* it can happen that a paragraph loses one row
                         * without a real breakup. This is when a word
                         * is to long to be broken. Well, I don t care this 
-                        * hack ;-) */ 
-                       if (RowLast(row) == row->par()->Last() - 1)
+                        * hack ;-) */
+                       if (RowLast(row) == row->par()->size() - 1)
                                RemoveRow(row->next());
                        
                        refresh_y = y;
@@ -3846,14 +2729,23 @@ void LyXText::Backspace(BufferView * bview)
                        status = LyXText::NEED_MORE_REFRESH;
                        
                        BreakAgainOneRow(bview, row);
+                       // will the cursor be in another row now?
+                       if (row->next() && row->next()->par() == row->par() &&
+                           RowLast(row) <= cursor.pos()) {
+                               row = row->next();
+                               BreakAgainOneRow(bview, row);
+                       }
+
                        SetCursor(bview, cursor.par(), cursor.pos(), false, cursor.boundary());
-                       // cursor MUST be in row now
-                       
-                       need_break_row = row->next();
+
+                       if (row->next() && row->next()->par() == row->par())
+                               need_break_row = row->next();
+                       else
+                               need_break_row = 0;
                } else  {
                        // set the dimensions of the row
                        row->fill(Fill(bview, row, workWidth(bview)));
-                       int tmpheight = row->height();
+                       int const tmpheight = row->height();
                        SetHeightOfRow(bview, row);
                        if (tmpheight == row->height())
                                status = LyXText::NEED_VERY_LITTLE_REFRESH;
@@ -3868,14 +2760,16 @@ void LyXText::Backspace(BufferView * bview)
        // current_font = rawtmpfont;
        // real_current_font = realtmpfont;
 
-       lastpos = cursor.par()->Last();
-       if (cursor.pos() == lastpos) {
-               if (IsBoundary(bview->buffer(), cursor.par(), cursor.pos()) != cursor.boundary())
-                       SetCursor(bview, cursor.par(), cursor.pos(), false, !cursor.boundary());
+       if (IsBoundary(bview->buffer(), cursor.par(), cursor.pos())
+           != cursor.boundary())
+               SetCursor(bview, cursor.par(), cursor.pos(), false,
+                         !cursor.boundary());
+
+       lastpos = cursor.par()->size();
+       if (cursor.pos() == lastpos)
                SetCurrentFont(bview);
-       }
        
-       // check, wether the last characters font has changed.
+       // check, whether the last characters font has changed.
        if (rawparfont != 
            cursor.par()->GetFontSettings(bview->buffer()->params, lastpos - 1)) {
                RedoHeightOfParagraph(bview, cursor);
@@ -3890,19 +2784,20 @@ void LyXText::Backspace(BufferView * bview)
 
 
 void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
-                           Row * row_ptr, long y, bool cleared)
+                           Row * row_ptr, int y, bool cleared)
 {
-       /* returns a printed row */
+       // returns a printed row
        Painter & pain = bview->painter();
        
-       bool is_rtl = row_ptr->par()->isRightToLeftPar(bview->buffer()->params);
-       LyXParagraph::size_type last = RowLastPrintable(row_ptr);
+       bool const is_rtl =
+               row_ptr->par()->isRightToLeftPar(bview->buffer()->params);
+       
+       LyXParagraph::size_type const last = RowLastPrintable(row_ptr);
+
+       LyXParagraph::size_type vpos;
+       LyXParagraph::size_type pos;
 
-       LyXParagraph::size_type vpos, pos;
-       float x;
        float tmpx;
-       int y_top;
-       int y_bottom;
 
        LyXFont font(LyXFont::ALL_SANE);
        int maxdesc;
@@ -3912,6 +2807,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                return;
        }
 
+       float x;
        float fill_separator;
        float fill_hfill;
        float fill_label_hfill;
@@ -3923,44 +2819,56 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
        x += x_offset;
        
        // clear the area where we want to paint/print
-       int ww = bview->workWidth();
+       int const ww = bview->workWidth();
 
        bool clear_area = true;
        Inset * inset = 0;
 
-       if ((last == row_ptr->pos()) &&
-           (row_ptr->par()->GetChar(row_ptr->pos()) == LyXParagraph::META_INSET) &&
-           (inset = row_ptr->par()->GetInset(row_ptr->pos()))) {
+       if (!bview->screen()->forceClear() && last == row_ptr->pos()
+           && row_ptr->par()->GetChar(row_ptr->pos()) == LyXParagraph::META_INSET
+           && (inset = row_ptr->par()->GetInset(row_ptr->pos()))) {
                clear_area = inset->doClearArea();
        }
-       if (cleared) { // we don't need to clear it's already done!!!
+       // we don't need to clear it's already done!!!
+       if (cleared) {
                clear_area = true;
        } else if (clear_area) {
-               int w = (inset_owner ? inset_owner->width(bview, font) : ww);
-               pain.fillRectangle(x_offset, y_offset, w, row_ptr->height());
+#ifdef WITH_WARNINGS
+#warning Should be fixed with a lyxinset::clear_width(bv, font) function! (Jug)
+#warning Should we not fix this in the Painter, please have a look Lars! (Jug)
+#endif
+               int const y = y_offset < 0 ? 0 : y_offset;
+               int const h = y_offset < 0 ?
+                       row_ptr->height() + y_offset : row_ptr->height();
+               int const w = inset_owner ?
+                       inset_owner->width(bview, font) - 2 : ww;
+               int const x = x_offset;
+               pain.fillRectangle(x, y, w, h);
        } else if (inset != 0) {
                int h = row_ptr->baseline() - inset->ascent(bview, font);
                if (h > 0) {
-                       int w = (inset_owner ?
+                       int const w = (inset_owner ?
                                 inset_owner->width(bview, font) : ww);
                        pain.fillRectangle(x_offset, y_offset, w, h);
                }
                h += inset->ascent(bview, font) + inset->descent(bview, font);
                if ((row_ptr->height() - h) > 0) {
-                       int w = (inset_owner ?
+                       int const w = (inset_owner ?
                                 inset_owner->width(bview, font) : ww);
-                       pain.fillRectangle(x_offset,y_offset+h, w, row_ptr->height()-h);
+                       pain.fillRectangle(x_offset, y_offset + h,
+                                          w, row_ptr->height() - h);
                }
                if (!inset_owner && !inset->display() && !inset->needFullRow())
                {
-                       int w = inset->width(bview, font) + int(x);
+                       int const w = inset->width(bview, font) + int(x);
                        pain.fillRectangle(w, y_offset, ww - w, row_ptr->height());
                }
        }
        
        if (selection) {
-               int w = (inset_owner ? inset_owner->width(bview, font) : ww);
-               /* selection code */
+               int const w = (inset_owner ?
+                              inset_owner->width(bview, font) : ww);
+               // selection code
                if (bidi_same_direction) {
                        if (sel_start_cursor.row() == row_ptr &&
                            sel_end_cursor.row() == row_ptr) {
@@ -4000,104 +2908,71 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                                                           sel_end_cursor.x(),
                                                           row_ptr->height(),
                                                           LColor::selection);
-                       } else if (y > long(sel_start_cursor.y())
-                                  && y < long(sel_end_cursor.y())) {
+                       } else if (y > sel_start_cursor.y()
+                                  && y < sel_end_cursor.y()) {
                                pain.fillRectangle(x_offset, y_offset, w,
                                                   row_ptr->height(),
                                                   LColor::selection);
                        }
-               } else if ( sel_start_cursor.row() != row_ptr &&
+               } else if (sel_start_cursor.row() != row_ptr &&
                            sel_end_cursor.row() != row_ptr &&
-                           y > long(sel_start_cursor.y())
-                           && y < long(sel_end_cursor.y())) {
+                           y > sel_start_cursor.y()
+                           && y < sel_end_cursor.y()) {
                        pain.fillRectangle(x_offset, y_offset, w,
                                           row_ptr->height(),
                                           LColor::selection);
                } else if (sel_start_cursor.row() == row_ptr ||
                           sel_end_cursor.row() == row_ptr) {
                        float tmpx = x;
-#ifndef NEW_TABULAR
-                       int cell = 0;
-                       if (row_ptr->par()->table) {
-                               cell = NumberOfCell(row_ptr->par(), row_ptr->pos());
-                               tmpx += row_ptr->par()->table->GetBeginningOfTextInCell(cell);
-                       }
-#endif
-                       if ( (sel_start_cursor.row() != row_ptr && !is_rtl) ||
+                       if ((sel_start_cursor.row() != row_ptr && !is_rtl) ||
                             (sel_end_cursor.row() != row_ptr && is_rtl))
                                pain.fillRectangle(x_offset, y_offset,
                                                   int(tmpx),
                                                   row_ptr->height(),
                                                   LColor::selection);
-#ifndef NEW_TABULAR
-                       if (row_ptr->par()->table) {
-                               float x_old = x;
-                               for (vpos = row_ptr->pos(); vpos <= last; ++vpos)  {
-                                       pos = vis2log(vpos);
-                                       float old_tmpx = tmpx;
-                                       if (row_ptr->par()->IsNewline(pos)) {
-                                               tmpx = x_old + row_ptr->par()->table->WidthOfColumn(cell);
-                                               x_old = tmpx;
-                                               ++cell;
-                                               tmpx += row_ptr->par()->table->GetBeginningOfTextInCell(cell);
-                                       } else {
-                                               tmpx += SingleWidth(bview, row_ptr->par(), pos);
-                                       }
-                                       if ( (sel_start_cursor.row() != row_ptr ||
-                                             sel_start_cursor.pos() <= pos) &&
-                                            (sel_end_cursor.row() != row_ptr ||
-                                             pos < sel_end_cursor.pos()) )
-                                               pain.fillRectangle(x_offset + int(old_tmpx),
-                                                                  y_offset,
-                                                                  int(tmpx - old_tmpx + 1),
-                                                                  row_ptr->height(),
-                                                                  LColor::selection);
+                       LyXParagraph::size_type main_body =
+                               BeginningOfMainBody(bview->buffer(),
+                                                   row_ptr->par());
+                       
+                       for (vpos = row_ptr->pos(); vpos <= last; ++vpos)  {
+                               pos = vis2log(vpos);
+                               float const old_tmpx = tmpx;
+                               if (main_body > 0 && pos == main_body-1) {
+                                       tmpx += fill_label_hfill +
+                                               lyxfont::width(textclasslist.Style(bview->buffer()->params.textclass,
+                                                                                  row_ptr->par()->GetLayout()).labelsep,
+                                                              GetFont(bview->buffer(),row_ptr->par(), -2));
+                                       if (row_ptr->par()->IsLineSeparator(main_body-1))
+                                               tmpx -= SingleWidth(bview, row_ptr->par(), main_body-1);
                                }
-                       } else {
-#endif
-                               LyXParagraph::size_type main_body =
-                                       BeginningOfMainBody(bview->buffer(),
-                                                           row_ptr->par());
-
-                               for (vpos = row_ptr->pos(); vpos <= last; ++vpos)  {
-                                       pos = vis2log(vpos);
-                                       float old_tmpx = tmpx;
-                                       if (main_body > 0 && pos == main_body-1) {
-                                               tmpx += fill_label_hfill +
-                                                       lyxfont::width(textclasslist.Style(bview->buffer()->params.textclass,
-                                                                                          row_ptr->par()->GetLayout()).labelsep,
-                                                                      GetFont(bview->buffer(),row_ptr->par(), -2));
-                                               if (row_ptr->par()->IsLineSeparator(main_body-1))
-                                                       tmpx -= SingleWidth(bview, row_ptr->par(), main_body-1);
-                                       }
-                                       if (HfillExpansion(bview->buffer(), row_ptr, pos)) {
-                                               tmpx += SingleWidth(bview, row_ptr->par(), pos);
-                                               if (pos >= main_body)
-                                                       tmpx += fill_hfill;
-                                               else 
-                                                       tmpx += fill_label_hfill;
-                                       }
-                                       else if (row_ptr->par()->IsSeparator(pos)) {
-                                               tmpx += SingleWidth(bview, row_ptr->par(), pos);
-                                               if (pos >= main_body)
-                                                       tmpx += fill_separator;
-                                       } else
-                                               tmpx += SingleWidth(bview, row_ptr->par(), pos);
-
-                                       if ( (sel_start_cursor.row() != row_ptr ||
-                                             sel_start_cursor.pos() <= pos) &&
-                                            (sel_end_cursor.row() != row_ptr ||
-                                             pos < sel_end_cursor.pos()) )
-                                               pain.fillRectangle(x_offset + int(old_tmpx),
-                                                                  y_offset,
-                                                                  int(tmpx - old_tmpx + 1),
-                                                                  row_ptr->height(),
-                                                                  LColor::selection);
+                               if (HfillExpansion(bview->buffer(), row_ptr, pos)) {
+                                       tmpx += SingleWidth(bview, row_ptr->par(), pos);
+                                       if (pos >= main_body)
+                                               tmpx += fill_hfill;
+                                       else 
+                                               tmpx += fill_label_hfill;
                                }
-#ifndef NEW_TABULAR
+                               else if (row_ptr->par()->IsSeparator(pos)) {
+                                       tmpx += SingleWidth(bview, row_ptr->par(), pos);
+                                       if (pos >= main_body)
+                                               tmpx += fill_separator;
+                               } else
+                                       tmpx += SingleWidth(bview, row_ptr->par(), pos);
+                               
+                               if ((sel_start_cursor.row() != row_ptr ||
+                                     sel_start_cursor.pos() <= pos) &&
+                                    (sel_end_cursor.row() != row_ptr ||
+                                     pos < sel_end_cursor.pos()) )
+                                       // Here we do not use x_offset as x_offset was
+                                       // added to x.
+                                       pain.fillRectangle(int(old_tmpx),
+                                                          y_offset,
+                                                          int(tmpx - old_tmpx + 1),
+                                                          row_ptr->height(),
+                                                          LColor::selection);
                        }
-#endif
-                       if ( (sel_start_cursor.row() != row_ptr && is_rtl) ||
+
+                       if ((sel_start_cursor.row() != row_ptr && is_rtl) ||
                             (sel_end_cursor.row() != row_ptr && !is_rtl) )
                                pain.fillRectangle(x_offset + int(tmpx),
                                                   y_offset,
@@ -4108,132 +2983,11 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
        }
 
        int box_x = 0;
-#ifndef NEW_INSETS
-       if (row_ptr->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
-               LyXFont font(LyXFont::ALL_SANE);
-               font.setSize(LyXFont::SIZE_FOOTNOTE);
-               font.setColor(LColor::footnote);
-               
-               box_x = LYX_PAPER_MARGIN + lyxfont::width(" wide-tab ", font);
-               if (row_ptr->previous() &&
-                   row_ptr->previous()->par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE){
-                       string fs;
-                       switch (row_ptr->par()->footnotekind) {
-                       case LyXParagraph::MARGIN:
-                               fs = " margin";
-                               break;
-                       case LyXParagraph::FIG:
-                               fs = " fig";
-                               break;
-                       case LyXParagraph::TAB:
-                               fs = " tab";
-                               break;
-                       case LyXParagraph::WIDE_FIG:
-                               fs = " wide-fig";
-                               break;
-                       case LyXParagraph::WIDE_TAB:
-                               fs = " wide-tab";
-                               break;
-                       case LyXParagraph::ALGORITHM:
-                               fs = " alg";
-                               break;
-                       case LyXParagraph::FOOTNOTE:
-                               fs = " foot";
-                               break;
-                       }
-                       
-                       pain.fillRectangle(LYX_PAPER_MARGIN,
-                                          y_offset + 1,
-                                          box_x - LYX_PAPER_MARGIN,
-                                          int(lyxfont::maxAscent(font)
-                                              + lyxfont::maxDescent(font)),
-                                          LColor::footnotebg);
-                       
-                       pain.line(LYX_PAPER_MARGIN, y_offset,
-                                 workWidth(bview) - LYX_PAPER_MARGIN, y_offset,
-                                 LColor::footnoteframe);
-                       
-                       pain.text(LYX_PAPER_MARGIN,
-                                 y_offset + int(lyxfont::maxAscent(font)) + 1,
-                                 fs, font);
-                       
-                       pain.line(LYX_PAPER_MARGIN, y_offset,
-                                 LYX_PAPER_MARGIN,
-                                 y_offset + int(lyxfont::maxAscent(font)
-                                              + lyxfont::maxDescent(font)),
-                                 LColor::footnoteframe);
-                       
-                       pain.line(LYX_PAPER_MARGIN,
-                                 y_offset + int(lyxfont::maxAscent(font)
-                                              + lyxfont::maxDescent(font)) + 1,
-                                 box_x,
-                                 y_offset + int(lyxfont::maxAscent(font)
-                                              + lyxfont::maxDescent(font)) + 1,
-                                 LColor::footnoteframe);
-                       
-               }
-               
-               /* draw the open floats in a red box */
-               pain.line(box_x, y_offset,
-                         box_x, y_offset + row_ptr->height(),
-                         LColor::footnoteframe);
-               
-               pain.line(workWidth(bview) - LYX_PAPER_MARGIN,
-                         y_offset,
-                         workWidth(bview) - LYX_PAPER_MARGIN,
-                         y_offset + row_ptr->height(),
-                         LColor::footnoteframe);
 
-
-               // Draw appendix lines
-               LyXParagraph * p = row_ptr->par()->PreviousBeforeFootnote()->FirstPhysicalPar();
-               if (p->appendix){
-                       pain.line(1, y_offset,
-                                 1, y_offset + row_ptr->height(),
-                                 LColor::appendixline);
-                       pain.line(workWidth(bview) - 2, y_offset,
-                                 workWidth(bview) - 2,
-                                 y_offset + row_ptr->height(),
-                                 LColor::appendixline);
-               }
-
-               // Draw minipage line
-               bool minipage = p->pextra_type == LyXParagraph::PEXTRA_MINIPAGE;
-               if (minipage)
-                       pain.line(LYX_PAPER_MARGIN/5, y_offset,
-                                 LYX_PAPER_MARGIN/5, 
-                                 y_offset + row_ptr->height() - 1,
-                                 LColor::minipageline);
-
-               // Draw depth lines
-               int depth = p->GetDepth();
-               for (int i = 1; i <= depth; ++i) {
-                       int line_x = (LYX_PAPER_MARGIN / 5) * (i + minipage);
-                       pain.line(line_x, y_offset, line_x,
-                                 y_offset + row_ptr->height() - 1,
-                                 LColor::depthbar);
-               }
-       } else if (row_ptr->previous() &&
-                  row_ptr->previous()->par()->footnoteflag
-                  == LyXParagraph::OPEN_FOOTNOTE) {
-               LyXFont font(LyXFont::ALL_SANE);
-               font.setSize(LyXFont::SIZE_FOOTNOTE);
-               
-               int box_x = LYX_PAPER_MARGIN;
-               box_x += lyxfont::width(" wide-tab ", font);
-               
-               pain.line(box_x, y_offset,
-                         workWidth(bview) - LYX_PAPER_MARGIN,
-                         y_offset, LColor::footnote);
-       }
-#endif
        // Draw appendix lines
-#ifndef NEW_INSETS
-       LyXParagraph * firstpar = row_ptr->par()->FirstPhysicalPar();
-#else
        LyXParagraph * firstpar = row_ptr->par();
-#endif
-       if (firstpar->appendix){
+
+       if (firstpar->params.appendix()) {
                pain.line(1, y_offset,
                          1, y_offset + row_ptr->height(),
                          LColor::appendixline);
@@ -4242,42 +2996,19 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                          LColor::appendixline);
        }
 
-       // Draw minipage line
-       bool minipage = firstpar->pextra_type == LyXParagraph::PEXTRA_MINIPAGE;
-       if (minipage)
-               pain.line(LYX_PAPER_MARGIN/5 + box_x, y_offset,
-                         LYX_PAPER_MARGIN/5 + box_x, 
-                         y_offset + row_ptr->height() - 1,
-                         LColor::minipageline);
-
        // Draw depth lines
-       int depth = firstpar->GetDepth();
+       int const depth = firstpar->GetDepth();
        if (depth > 0) {
                int next_depth = 0;
                int prev_depth = 0;
                if (row_ptr->next())
-#ifndef NEW_INSETS
-                       if (row_ptr->par()->footnoteflag ==
-                           row_ptr->next()->par()->footnoteflag)
                                next_depth = row_ptr->next()->par()->GetDepth();
-                       else if (row_ptr->par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE)
-                               next_depth = depth;
-#else
-                               next_depth = row_ptr->next()->par()->GetDepth();
-#endif
                if (row_ptr->previous())
-#ifndef NEW_INSETS
-                       if (row_ptr->par()->footnoteflag ==
-                           row_ptr->previous()->par()->footnoteflag)
                                prev_depth = row_ptr->previous()->par()->GetDepth();
-                       else if (row_ptr->par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE)
-                               prev_depth = depth;
-#else
-                               prev_depth = row_ptr->previous()->par()->GetDepth();
-#endif
 
                for (int i = 1; i <= depth; ++i) {
-                       int line_x = (LYX_PAPER_MARGIN / 5) * (i + minipage) + box_x;
+                       int const line_x = (LYX_PAPER_MARGIN / 5) *
+                               i + box_x + x_offset;
                        pain.line(line_x, y_offset, line_x,
                                  y_offset + row_ptr->height() - 1 - (i - next_depth - 1) * 3,
                                  LColor::depthbar);
@@ -4298,27 +3029,30 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                textclasslist.Style(bview->buffer()->params.textclass,
                                    row_ptr->par()->GetLayout());
 
-       y_top = 0;
-       y_bottom = row_ptr->height();
+       int y_top = 0;
+       int y_bottom = row_ptr->height();
        
-       /* is it a first row? */ 
+       // is it a first row?
        if (!row_ptr->pos() && (row_ptr->par() == firstpar)) {
                
-               /* start of appendix? */
-               if (row_ptr->par()->start_of_appendix){
+               // start of appendix?
+               if (row_ptr->par()->params.startOfAppendix()) {
                        pain.line(1, y_offset,
                                  ww - 2, y_offset,
                                  LColor::appendixline);
                }
                
-               /* think about the margins */ 
+               // think about the margins
                if (!row_ptr->previous() && bv_owner)
                        y_top += LYX_PAPER_MARGIN;
                
-               if (row_ptr->par()->pagebreak_top){ /* draw a top pagebreak  */
+               // draw a top pagebreak
+               if (row_ptr->par()->params.pagebreakTop()) {
                        LyXFont pb_font;
                        pb_font.setColor(LColor::pagebreak).decSize();
-                       int w = 0, a = 0, d = 0;
+                       int w = 0;
+                       int a = 0;
+                       int d = 0;
                        pain.line(0, y_offset + y_top + 2*DefaultHeight(),
                                  ww, 
                                  y_offset + y_top + 2 * DefaultHeight(),
@@ -4339,8 +3073,8 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                        y_top += 3 * DefaultHeight();
                }
                
-               if (row_ptr->par()->added_space_top.kind() == VSpace::VFILL) {
-                       /* draw a vfill top  */
+               if (row_ptr->par()->params.spaceTop().kind() == VSpace::VFILL) {
+                       // draw a vfill top
                        pain.line(0, y_offset + 2 + y_top,
                                  LYX_PAPER_MARGIN, y_offset + 2 + y_top,
                                  LColor::vfillline);
@@ -4358,31 +3092,34 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                        y_top += 3 * DefaultHeight();
                }
                
-               /* think about user added space */ 
-               y_top += int(row_ptr->par()->added_space_top.inPixels(bview));
+               // think about user added space
+               y_top += int(row_ptr->par()->params.spaceTop().inPixels(bview));
                
-               /* think about the parskip */ 
-               /* some parskips VERY EASY IMPLEMENTATION */ 
+               // think about the parskip
+               // some parskips VERY EASY IMPLEMENTATION
                if (bview->buffer()->params.paragraph_separation == BufferParams::PARSEP_SKIP) {
                        if (layout.latextype == LATEX_PARAGRAPH
                            && firstpar->GetDepth() == 0
-                           && firstpar->Previous())
+                           && firstpar->previous())
                                y_top += bview->buffer()->params.getDefSkip().inPixels(bview);
-                       else if (firstpar->Previous()
+                       else if (firstpar->previous()
                                 && textclasslist.Style(bview->buffer()->params.textclass,
-                                                       firstpar->Previous()->GetLayout()).latextype == LATEX_PARAGRAPH
-                                && firstpar->Previous()->GetDepth() == 0)
+                                                       firstpar->previous()->GetLayout()).latextype == LATEX_PARAGRAPH
+                                && firstpar->previous()->GetDepth() == 0)
                                // is it right to use defskip here, too? (AS) 
                                y_top += bview->buffer()->params.getDefSkip().inPixels(bview);
                }
                
-               if (row_ptr->par()->line_top) {      /* draw a top line  */
+               if (row_ptr->par()->params.lineTop()) {
+                       // draw a top line
                        y_top +=  lyxfont::ascent('x',
                                                  GetFont(bview->buffer(),
                                                          row_ptr->par(), 0));
-                       
-                       pain.line(0, y_offset + y_top,
-                                 ww, y_offset + y_top,
+                       int const w = (inset_owner ?
+                                      inset_owner->width(bview, font) : ww);
+                       int const xp = static_cast<int>(inset_owner ? x : 0);
+                       pain.line(xp, y_offset + y_top,
+                                 w, y_offset + y_top,
                                  LColor::topline,
                                  Painter::line_solid,
                                  Painter::line_thick);
@@ -4391,7 +3128,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                                                              row_ptr->par(), 0));
                }
                
-               /* should we print a label? */ 
+               // should we print a label?
                if (layout.labeltype >= LABEL_STATIC
                    && (layout.labeltype != LABEL_STATIC
                        || layout.latextype != LATEX_ENVIRONMENT
@@ -4399,15 +3136,19 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                        font = GetFont(bview->buffer(), row_ptr->par(), -2);
                        if (!row_ptr->par()->GetLabelstring().empty()) {
                                tmpx = x;
-                               string tmpstring = row_ptr->par()->GetLabelstring();
+                               string const tmpstring =
+                                       row_ptr->par()->GetLabelstring();
                                
                                if (layout.labeltype == LABEL_COUNTER_CHAPTER) {
                                        if (bview->buffer()->params.secnumdepth >= 0) {
-                                               /* this is special code for the chapter layout. This is printed in
-                                                * an extra row and has a pagebreak at the top. */
+                                               // this is special code for
+                                               // the chapter layout. This is
+                                               // printed in an extra row
+                                               // and has a pagebreak at
+                                               // the top.
                                                float spacing_val = 1.0;
-                                               if (!row_ptr->par()->spacing.isDefault()) {
-                                                       spacing_val = row_ptr->par()->spacing.getValue();
+                                               if (!row_ptr->par()->params.spacing().isDefault()) {
+                                                       spacing_val = row_ptr->par()->params.spacing().getValue();
                                                } else {
                                                        spacing_val = bview->buffer()->params.spacing.getValue();
                                                }
@@ -4425,24 +3166,18 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                                        if (is_rtl) {
                                                tmpx = ww - LeftMargin(bview, row_ptr)
                                                        + lyxfont::width(layout.labelsep, font);
-#ifndef NEW_INSETS
-                                               if (row_ptr->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)  {
-                                                       LyXFont font(LyXFont::ALL_SANE);
-                                                       font.setSize(LyXFont::SIZE_SMALL);
-                                                       tmpx += lyxfont::width("Mwide-fixM", font);
-                                               }
-#endif
                                        } else
                                                tmpx = x - lyxfont::width(layout.labelsep, font)
                                                        - lyxfont::width(tmpstring, font);
 
-                                       /* draw it! */
+                                       // draw it!
                                        pain.text(int(tmpx),
                                                  y_offset + row_ptr->baseline(),
                                                  tmpstring, font);
                                }
                        }
-                       /* the labels at the top of an environment. More or less for bibliography */ 
+                       // the labels at the top of an environment.
+                       // More or less for bibliography
                } else if (layout.labeltype == LABEL_TOP_ENVIRONMENT ||
                           layout.labeltype == LABEL_BIBLIO ||
                           layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) {
@@ -4450,10 +3185,11 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                                font = GetFont(bview->buffer(),
                                               row_ptr->par(), -2);
                                if (!row_ptr->par()->GetLabelstring().empty()) {
-                                       string tmpstring = row_ptr->par()->GetLabelstring();
+                                       string const tmpstring =
+                                               row_ptr->par()->GetLabelstring();
                                        float spacing_val = 1.0;
-                                       if (!row_ptr->par()->spacing.isDefault()) {
-                                               spacing_val = row_ptr->par()->spacing.getValue();
+                                       if (!row_ptr->par()->params.spacing().isDefault()) {
+                                               spacing_val = row_ptr->par()->params.spacing().getValue();
                                        } else {
                                                spacing_val = bview->buffer()->params.spacing.getValue();
                                        }
@@ -4491,43 +3227,34 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                }
        }
        
-       /* is it a last row? */
-#ifndef NEW_INSETS
-       LyXParagraph * par = row_ptr->par()->LastPhysicalPar();
-#else
+       // is it a last row?
        LyXParagraph * par = row_ptr->par();
-#endif
-       if (
-#ifndef NEW_INSETS
-               (row_ptr->par()->ParFromPos(last + 1) == par)
-#else
-               (row_ptr->par() == par)
-#endif
-           && (!row_ptr->next() || (row_ptr->next()->par() != row_ptr->par())))
-       {
-               /* think about the margins */ 
+       if (row_ptr->par() == par
+           && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par())) {
+               // think about the margins
                if (!row_ptr->next() && bv_owner)
                        y_bottom -= LYX_PAPER_MARGIN;
                
-               /* draw a bottom pagebreak */ 
-               if (firstpar->pagebreak_bottom) {
+               // draw a bottom pagebreak
+               if (firstpar->params.pagebreakBottom()) {
                        LyXFont pb_font;
                        pb_font.setColor(LColor::pagebreak).decSize();
-                       int w = 0, a = 0, d = 0;
-                       pain.line(0,
-                                 y_offset + y_bottom - 2 * DefaultHeight(), 
-                                 ww, 
-                                 y_offset + y_bottom - 2 * DefaultHeight(),
-                                 LColor::pagebreak,
-                                 Painter::line_onoffdash)
-                               .rectText(0,
-                                         0,
+                       int const y_place = y_offset + y_bottom
+                               - 2 * DefaultHeight();
+                       
+                       int w = 0;
+                       int a = 0;
+                       int d = 0;
+                       pain
+                               .line(0, y_place, ww, y_place,
+                                     LColor::pagebreak,
+                                     Painter::line_onoffdash)
+                               .rectText(0, 0,
                                          _("Page Break (bottom)"),
                                          pb_font,
                                          LColor::background,
                                          LColor::background, false, w, a, d);
-                       pain.rectText((ww - w) / 2,
-                                     y_offset + y_top + 2 * DefaultHeight() + d,
+                       pain.rectText((ww - w) / 2, y_place + d,
                                      _("Page Break (bottom)"),
                                      pb_font,
                                      LColor::background,
@@ -4535,60 +3262,62 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                        y_bottom -= 3 * DefaultHeight();
                }
                
-               if (firstpar->added_space_bottom.kind() == VSpace::VFILL) {
-                       /* draw a vfill bottom  */
-                       pain.line(0, y_offset + y_bottom - 3 * DefaultHeight(),
-                                 LYX_PAPER_MARGIN,
-                                 y_offset + y_bottom - 3 * DefaultHeight(),
+               if (firstpar->params.spaceBottom().kind() == VSpace::VFILL) {
+                       // draw a vfill bottom
+                       int const y_place = y_offset + y_bottom
+                               - 3 * DefaultHeight();
+                       
+                       pain.line(0, y_place,
+                                 LYX_PAPER_MARGIN, y_place,
                                  LColor::vfillline);
                        pain.line(0, y_offset + y_bottom - 2,
                                  LYX_PAPER_MARGIN,
                                  y_offset + y_bottom - 2,
                                  LColor::vfillline);
                        pain.line(LYX_PAPER_MARGIN / 2,
-                                 y_offset + y_bottom - 3 * DefaultHeight(),
+                                 y_place,
                                  LYX_PAPER_MARGIN / 2,
                                  y_offset + y_bottom - 2,
                                  LColor::vfillline);
                        y_bottom -= 3 * DefaultHeight();
                }
                
-               /* think about user added space */ 
-               y_bottom -= int(firstpar->added_space_bottom.inPixels(bview));
-               
-               if (firstpar->line_bottom) {
-                       /* draw a bottom line */
-                       y_bottom -= lyxfont::ascent('x', GetFont(bview->buffer(),
-                                                                par, par->Last() - 1));
-                       pain.line(0, y_offset + y_bottom,
-                                 ww, y_offset + y_bottom,
+               // think about user added space
+               y_bottom -= int(firstpar->params.spaceBottom().inPixels(bview));
+               
+               if (firstpar->params.lineBottom()) {
+                       // draw a bottom line
+                       y_bottom -= lyxfont::ascent('x',
+                                                   GetFont(bview->buffer(),
+                                                           par,
+                                                           par->size() - 1));
+                       int const w = (inset_owner ?
+                                      inset_owner->width(bview, font) : ww);
+                       int const xp = static_cast<int>(inset_owner ? x : 0);
+                       pain.line(xp, y_offset + y_bottom,
+                                 w, y_offset + y_bottom,
                                  LColor::topline, Painter::line_solid,
                                  Painter::line_thick);
-                       y_bottom -= lyxfont::ascent('x', GetFont(bview->buffer(),
-                                                                par, par->Last() - 1));
+                       y_bottom -= lyxfont::ascent('x',
+                                                   GetFont(bview->buffer(),
+                                                           par,
+                                                           par->size() - 1));
                }
 
                // draw an endlabel
-               int endlabel = row_ptr->par()->GetEndLabel(bview->buffer()->params);
+               int const endlabel =
+                       row_ptr->par()->GetEndLabel(bview->buffer()->params);
                switch (endlabel) {
                case END_LABEL_BOX:
                case END_LABEL_FILLED_BOX:
                {
-                       LyXFont font = GetFont(bview->buffer(),
-                                              row_ptr->par(), last);
-                       int size = int(0.75 * lyxfont::maxAscent(font));
-                       int y = (y_offset + row_ptr->baseline()) - size;
+                       LyXFont const font = GetFont(bview->buffer(),
+                                                    row_ptr->par(), last);
+                       int const size = int(0.75 * lyxfont::maxAscent(font));
+                       int const y = (y_offset + row_ptr->baseline()) - size;
                        int x = is_rtl ? LYX_PAPER_MARGIN 
                                : ww - LYX_PAPER_MARGIN - size;
-#ifndef NEW_INSETS
-                       if (row_ptr->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
-                               if (is_rtl) {
-                                       LyXFont font(LyXFont::ALL_SANE);
-                                       font.setSize(LyXFont::SIZE_SMALL);
-                                       x += lyxfont::width("Mwide-figM", font);
-                               } else
-                                       x -= LYX_PAPER_MARGIN/2;
-#endif
+
                        if (row_ptr->fill() <= size)
                                x += (size - row_ptr->fill() + 1) * (is_rtl ? -1 : 1);
                        if (endlabel == END_LABEL_BOX) {
@@ -4608,10 +3337,12 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                case END_LABEL_STATIC:
                {
                        LyXTextClass::LayoutList::size_type layout = row_ptr->par()->GetLayout();
-                       string tmpstring = textclasslist.Style(bview->buffer()->params.textclass,
-                                                        layout).endlabelstring();
+                       string const tmpstring = textclasslist.
+                               Style(bview->buffer()->params.textclass,
+                                     layout).endlabelstring();
                        font = GetFont(bview->buffer(), row_ptr->par(), -2);
-                       int tmpx = is_rtl ? int(x) - lyxfont::width(tmpstring, font)
+                       int const tmpx = is_rtl ?
+                               int(x) - lyxfont::width(tmpstring, font)
                                : ww - RightMargin(bview->buffer(), row_ptr) - row_ptr->fill();
                        pain.text( tmpx, y_offset + row_ptr->baseline(), tmpstring, font);
                        break;
@@ -4621,204 +3352,74 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                }
        }
        
-       /* draw the text in the pixmap */  
+       // draw the text in the pixmap
        
        vpos = row_ptr->pos();
-#ifndef NEW_TABULAR
-       /* table stuff -- begin*/
-       if (row_ptr->par()->table) {
-               bool on_off;
-               int cell = NumberOfCell(row_ptr->par(), row_ptr->pos());
-               float x_old = x;
-               x += row_ptr->par()->table->GetBeginningOfTextInCell(cell);
-               
-               while (vpos <= last)  {
-                       pos = vis2log(vpos);
-                       if (row_ptr->par()->IsNewline(pos)) {
-                               
-                               x = x_old + row_ptr->par()->table->WidthOfColumn(cell);
-                               /* draw the table lines, still very simple */
-                               on_off = !row_ptr->par()->table->TopLine(cell);
-                               if ((!on_off ||
-                                    !row_ptr->par()->table->TopAlreadyDrawed(cell)) &&
-                                   !row_ptr->par()->table->IsContRow(cell))
-                                       pain.line(int(x_old),
-                                                 y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
-                                                 int(x),
-                                                 y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
-                                                 LColor::tableline,
-                                                 on_off ? Painter::line_onoffdash : Painter::line_solid);
-                               
-                               on_off = !row_ptr->par()->table->BottomLine(cell);
-                               if ((!on_off && !row_ptr->par()->table->RowHasContRow(cell)) ||
-                                   row_ptr->par()->table->VeryLastRow(cell))
+
+       LyXParagraph::size_type main_body = 
+               BeginningOfMainBody(bview->buffer(), row_ptr->par());
+       if (main_body > 0 &&
+           (main_body-1 > last || 
+            !row_ptr->par()->IsLineSeparator(main_body - 1)))
+               main_body = 0;
+       
+       while (vpos <= last)  {
+               pos = vis2log(vpos);
+               if (main_body > 0 && pos == main_body - 1) {
+                       x += fill_label_hfill
+                               + lyxfont::width(layout.labelsep,
+                                                GetFont(bview->buffer(),
+                                                        row_ptr->par(), -2))
+                               - SingleWidth(bview,
+                                             row_ptr->par(),
+                                             main_body - 1);
+               }
+               
+               if (row_ptr->par() ->IsHfill(pos)) {
+                       x += 1;
+                       pain.line(int(x),
+                                 y_offset + row_ptr->baseline() - DefaultHeight() / 2,
+                                 int(x),
+                                 y_offset + row_ptr->baseline(),
+                                 LColor::vfillline);
+                       
+                       if (HfillExpansion(bview->buffer(),
+                                          row_ptr, pos)) {
+                               if (pos >= main_body) {
+                                       pain.line(int(x),
+                                                 y_offset + row_ptr->baseline() - DefaultHeight() / 4,
+                                                 int(x + fill_hfill),
+                                                 y_offset + row_ptr->baseline() - DefaultHeight() / 4,
+                                                 LColor::vfillline,
+                                                 Painter::line_onoffdash);
+                                       x += fill_hfill;
+                               } else {
+                                       pain.line(int(x),
+                                                 y_offset + row_ptr->baseline() - DefaultHeight() / 4,
+                                                 int(x + fill_label_hfill),
+                                                 y_offset + row_ptr->baseline() - DefaultHeight() / 4,
+                                                 LColor::vfillline,
+                                                 Painter::line_onoffdash);
                                        
-                                       pain.line(int(x_old),
-                                                 y_offset + y_bottom - 1,
-                                                 int(x),
-                                                 y_offset + y_bottom - 1,
-                                                 LColor::tableline,
-                                                 on_off ? Painter::line_onoffdash : Painter::line_solid);
-                               
-                               on_off = !row_ptr->par()->table->LeftLine(cell);
-                               
-                               pain.line(int(x_old),
-                                         y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
-                                         int(x_old),
-                                         y_offset + y_bottom - 1,
-                                         LColor::tableline,
-                                         on_off ? Painter::line_onoffdash : Painter::line_solid);
-                               
-                               on_off = !row_ptr->par()->table->RightLine(cell);
-                               
-                               pain.line(int(x) - row_ptr->par()->table->AdditionalWidth(cell),
-                                         y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
-                                         int(x) - row_ptr->par()->table->AdditionalWidth(cell),
-                                         y_offset + y_bottom - 1,
-                                         LColor::tableline,
-                                         on_off ? Painter::line_onoffdash : Painter::line_solid);
-                               
-                               x_old = x;
-                               /* take care about the alignment and other spaces */
-                               ++cell;
-                               x += row_ptr->par()->table->GetBeginningOfTextInCell(cell);
-                               if (row_ptr->par()->table->IsFirstCell(cell))
-                                       --cell; // little hack, sorry
-                               ++vpos;
-                       } else if (row_ptr->par()->IsHfill(pos)) {
-                               x += 1;
-                               
+                                       x += fill_label_hfill;
+                               }
                                pain.line(int(x),
                                          y_offset + row_ptr->baseline() - DefaultHeight() / 2,
                                          int(x),
                                          y_offset + row_ptr->baseline(),
                                          LColor::vfillline);
-                               
-                               x += 2;
-                               ++vpos;
-                       } else if (row_ptr->par()->IsSeparator(pos)) {
-                               tmpx = x;
-                               x+= SingleWidth(bview, 
-                                               row_ptr->par(), pos);
-                               ++vpos;
-                       } else
-                               draw(bview, row_ptr, vpos, y_offset, x, clear_area);
-               }
-               
-               /* do not forget the very last cell. This has no NEWLINE so 
-                * ignored by the code above*/ 
-               if (cell == row_ptr->par()->table->GetNumberOfCells() - 1) {
-                       x = x_old + row_ptr->par()->table->WidthOfColumn(cell);
-                       on_off = !row_ptr->par()->table->TopLine(cell);
-                       if ((!on_off ||
-                            !row_ptr->par()->table->TopAlreadyDrawed(cell)) &&
-                           !row_ptr->par()->table->IsContRow(cell))
-                               
-                               pain.line(int(x_old),
-                                         y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
-                                         int(x),
-                                         y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
-                                         LColor::tableline,
-                                         on_off ? Painter::line_onoffdash : Painter::line_solid);
-                       on_off = !row_ptr->par()->table->BottomLine(cell);
-                       if ((!on_off && !row_ptr->par()->table->RowHasContRow(cell)) ||
-                           row_ptr->par()->table->VeryLastRow(cell))
-                               
-                               pain.line(int(x_old),
-                                         y_offset + y_bottom - 1,
-                                         int(x),
-                                         y_offset + y_bottom - 1,
-                                         LColor::tableline,
-                                         on_off ? Painter::line_onoffdash : Painter::line_solid);
-                       
-                       on_off = !row_ptr->par()->table->LeftLine(cell);
-                       
-                       pain.line(int(x_old),
-                                 y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
-                                 int(x_old),
-                                 y_offset + y_bottom - 1,
-                                 LColor::tableline,
-                                 on_off ? Painter::line_onoffdash : Painter::line_solid);
-                       
-                       on_off = !row_ptr->par()->table->RightLine(cell);
-                       
-                       pain.line(int(x) - row_ptr->par()->table->AdditionalWidth(cell),
-                                 y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
-                                 int(x) - row_ptr->par()->table->AdditionalWidth(cell),
-                                 y_offset + y_bottom - 1,
-                                 LColor::tableline,
-                                 on_off ? Painter::line_onoffdash : Painter::line_solid);
-               }
-       } else {
-               /* table stuff -- end*/
-#endif
-               LyXParagraph::size_type main_body = 
-                       BeginningOfMainBody(bview->buffer(), row_ptr->par());
-               if (main_body > 0 &&
-                   (main_body-1 > last || 
-                    !row_ptr->par()->IsLineSeparator(main_body - 1)))
-                       main_body = 0;
-               
-               while (vpos <= last)  {
-                       pos = vis2log(vpos);
-                       if (main_body > 0 && pos == main_body - 1) {
-                               x += fill_label_hfill
-                                       + lyxfont::width(layout.labelsep,
-                                                        GetFont(bview->buffer(),
-                                                                row_ptr->par(), -2))
-                                       - SingleWidth(bview,
-                                                     row_ptr->par(),
-                                                     main_body - 1);
                        }
-                       
-                       if (row_ptr->par() ->IsHfill(pos)) {
-                               x += 1;
-                               pain.line(int(x),
-                                         y_offset + row_ptr->baseline() - DefaultHeight() / 2,
-                                         int(x),
-                                         y_offset + row_ptr->baseline(),
-                                         LColor::vfillline);
-                               
-                               if (HfillExpansion(bview->buffer(),
-                                                  row_ptr, pos)) {
-                                       if (pos >= main_body) {
-                                               pain.line(int(x),
-                                                         y_offset + row_ptr->baseline() - DefaultHeight() / 4,
-                                                         int(x + fill_hfill),
-                                                         y_offset + row_ptr->baseline() - DefaultHeight() / 4,
-                                                         LColor::vfillline,
-                                                         Painter::line_onoffdash);
-                                               x += fill_hfill;
-                                       } else {
-                                               pain.line(int(x),
-                                                         y_offset + row_ptr->baseline() - DefaultHeight() / 4,
-                                                         int(x + fill_label_hfill),
-                                                         y_offset + row_ptr->baseline() - DefaultHeight() / 4,
-                                                         LColor::vfillline,
-                                                         Painter::line_onoffdash);
-                                               
-                                               x += fill_label_hfill;
-                                       }
-                                       pain.line(int(x),
-                                                 y_offset + row_ptr->baseline() - DefaultHeight() / 2,
-                                                 int(x),
-                                                 y_offset + row_ptr->baseline(),
-                                                 LColor::vfillline);
-                               }
-                               x += 2;
-                               ++vpos;
-                       } else if (row_ptr->par()->IsSeparator(pos)) {
-                               x += SingleWidth(bview,
-                                                row_ptr->par(), pos);
-                               if (pos >= main_body)
-                                       x += fill_separator;
-                               ++vpos;
-                       } else
-                               draw(bview, row_ptr, vpos, y_offset, x, clear_area);
-               }
-#ifndef NEW_TABULAR
+                       x += 2;
+                       ++vpos;
+               } else if (row_ptr->par()->IsSeparator(pos)) {
+                       x += SingleWidth(bview,
+                                        row_ptr->par(), pos);
+                       if (pos >= main_body)
+                               x += fill_separator;
+                       ++vpos;
+               } else
+                       draw(bview, row_ptr, vpos, y_offset, x, clear_area);
        }
-#endif
 }
 
 
@@ -4848,129 +3449,80 @@ int LyXText::GetColumnNearX(BufferView * bview, Row * row, int & x,
                                    row->par()->GetLayout());
        bool left_side = false;
 
-#ifndef NEW_TABULAR
-       /* table stuff -- begin */
-       if (row->par()->table) {
-               //the last row doesn't need a newline at the end
-               if (row->next() && row->next()->par() == row->par()
-                   && row->par()->IsNewline(last))
-                       --last;
-               int cell = NumberOfCell(row->par(), row->pos());
-               float cell_x = tmpx + row->par()->table->WidthOfColumn(cell);
-               tmpx += row->par()->table->GetBeginningOfTextInCell(cell);
-               float last_tmpx = tmpx;
-               while (vc <= last && tmpx <= x) {
-                      c = vis2log(vc);
-                      last_tmpx = tmpx;
-                      if (row->par()->IsNewline(c)) {
-                              if (cell_x <= x){
-                                      ++cell;
-                                      tmpx = cell_x + row->par()->table->GetBeginningOfTextInCell(cell);
-                                      cell_x += row->par()->table->WidthOfColumn(cell);
-                                      ++vc;
-                              } else
-                                      break;
-                      } else {
-                              tmpx += SingleWidth(bview, row->par(), c);
-                              ++vc;
-                      }
-               }
-               if (vc > row->pos() && !row->par()->IsNewline(c) &&
-                   (tmpx + last_tmpx) / 2 > x) {
-                       tmpx = last_tmpx;
-                       left_side = true;
-               }
-       } else {
-               /* table stuff -- end*/
-#endif
-               LyXParagraph::size_type
-                       main_body = BeginningOfMainBody(bview->buffer(), row->par());
-               float last_tmpx = tmpx;
-
-               if (main_body > 0 &&
-                   (main_body-1 > last || 
-                    !row->par()->IsLineSeparator(main_body - 1)))
-                       main_body = 0;
-
-               while (vc <= last && tmpx <= x) {
-                       c = vis2log(vc);
-                       last_tmpx = tmpx;
-                       if (main_body > 0 && c == main_body-1) {
-                               tmpx += fill_label_hfill +
-                                       lyxfont::width(layout.labelsep,
+       LyXParagraph::size_type
+               main_body = BeginningOfMainBody(bview->buffer(), row->par());
+       float last_tmpx = tmpx;
+       
+       if (main_body > 0 &&
+           (main_body-1 > last || 
+            !row->par()->IsLineSeparator(main_body - 1)))
+               main_body = 0;
+       
+       while (vc <= last && tmpx <= x) {
+               c = vis2log(vc);
+               last_tmpx = tmpx;
+               if (main_body > 0 && c == main_body-1) {
+                       tmpx += fill_label_hfill +
+                               lyxfont::width(layout.labelsep,
                                               GetFont(bview->buffer(), row->par(), -2));
-                               if (row->par()->IsLineSeparator(main_body - 1))
-                                       tmpx -= SingleWidth(bview, row->par(), main_body-1);
-                       }
-            
-                       if (HfillExpansion(bview->buffer(), row, c)) {
-                               x += SingleWidth(bview, row->par(), c);
-                               if (c >= main_body)
-                                       tmpx += fill_hfill;
-                               else
-                                       tmpx += fill_label_hfill;
-                       }
-                       else if (row->par()->IsSeparator(c)) {
-                               tmpx += SingleWidth(bview, row->par(), c);
-                               if (c >= main_body)
-                                       tmpx+= fill_separator;
-                       } else
-                               tmpx += SingleWidth(bview, row->par(), c);
-                       ++vc;
+                       if (row->par()->IsLineSeparator(main_body - 1))
+                               tmpx -= SingleWidth(bview, row->par(), main_body-1);
                }
-
-               if (vc > row->pos() && (tmpx + last_tmpx) / 2 > x) {
-                       tmpx = last_tmpx;
-                       left_side = true;
+               
+               if (HfillExpansion(bview->buffer(), row, c)) {
+                       x += SingleWidth(bview, row->par(), c);
+                       if (c >= main_body)
+                               tmpx += fill_hfill;
+                       else
+                               tmpx += fill_label_hfill;
                }
-#ifndef NEW_TABULAR
+               else if (row->par()->IsSeparator(c)) {
+                       tmpx += SingleWidth(bview, row->par(), c);
+                       if (c >= main_body)
+                               tmpx+= fill_separator;
+               } else
+                       tmpx += SingleWidth(bview, row->par(), c);
+               ++vc;
+       }
+       
+       if ((tmpx + last_tmpx) / 2 > x) {
+               tmpx = last_tmpx;
+               left_side = true;
        }
-#endif
 
        if (vc > last + 1)  // This shouldn't happen.
                vc = last + 1;
 
        boundary = false;
-#if 0 // currently unused
-       bool lastrow = (!row->next() || row->next()->par() != row->par());
-       bool rtl = (lastrow)
+       bool const lastrow = lyxrc.rtl_support // This is not needed, but gives
+                                        // some speedup if rtl_support=false
+               && (!row->next() || row->next()->par() != row->par());
+       bool const rtl = (lastrow)
                ? row->par()->isRightToLeftPar(bview->buffer()->params)
-               : false;
-#endif
-       
+               : false; // If lastrow is false, we don't need to compute
+                        // the value of rtl.
+
        if (row->pos() > last)  // Row is empty?
                c = row->pos();
-#warning This is wrong, please have a look Dekel (Jug)
-#if 0
        else if (lastrow &&
-                ( (rtl && vc == row->pos()&& x < tmpx - 5) ||
-                  (!rtl && vc == last + 1 && x > tmpx + 5) ))
+                ( ( rtl &&  left_side && vc == row->pos() && x < tmpx - 5) ||
+                  (!rtl && !left_side && vc == last + 1   && x > tmpx + 5) ))
                c = last + 1;
-#endif
-       else if (vc == row->pos()
-#ifndef NEW_TABULAR
-                || (row->par()->table
-                 && vc <= last && row->par()->IsNewline(vc-1))
-#endif
-               ) {
+       else if (vc == row->pos()) {
                c = vis2log(vc);
                if (bidi_level(c) % 2 == 1)
                        ++c;
        } else {
                c = vis2log(vc - 1);
-               bool rtl = (bidi_level(c) % 2 == 1);
+               bool const rtl = (bidi_level(c) % 2 == 1);
                if (left_side == rtl) {
                        ++c;
                        boundary = IsBoundary(bview->buffer(), row->par(), c);
                }
        }
 
-       if (
-#ifndef NEW_TABULAR
-               !row->par()->table &&
-#endif
-               row->pos() <= last && c > last
-               && row->par()->IsNewline(last)) {
+       if (row->pos() <= last && c > last
+           && row->par()->IsNewline(last)) {
                if (bidi_level(last) % 2 == 0)
                        tmpx -= SingleWidth(bview, row->par(), last);
                else
@@ -4984,156 +3536,13 @@ int LyXText::GetColumnNearX(BufferView * bview, Row * row, int & x,
 }
 
 
-#ifndef NEW_INSETS
-/* turn the selection into a new environment. If there is no selection,
-* create an empty environment */ 
-void LyXText::InsertFootnoteEnvironment(BufferView * bview, 
-                                       LyXParagraph::footnote_kind kind)
-{
-   /* no footnoteenvironment in a footnoteenvironment */ 
-   if (cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
-      WriteAlert(_("Impossible operation"), 
-                _("You can't insert a float in a float!"), 
-                _("Sorry."));
-     return;
-   }
-   /* no marginpars in minipages */
-   if (kind == LyXParagraph::MARGIN 
-      && cursor.par()->pextra_type == LyXParagraph::PEXTRA_MINIPAGE) {
-      WriteAlert(_("Impossible operation"), 
-                _("You can't insert a marginpar in a minipage!"), 
-                _("Sorry."));
-      return;
-   }
-   
-   /* this doesnt make sense, if there is no selection */ 
-   bool dummy_selection = false;
-   if (!selection) {
-      sel_start_cursor = cursor;       /* dummy selection  */
-      sel_end_cursor = cursor;
-      dummy_selection = true;
-   }
-   
-   LyXParagraph * tmppar;
-
-#ifndef NEW_TABULAR
-   if (sel_start_cursor.par()->table || sel_end_cursor.par()->table){
-      WriteAlert(_("Impossible operation"), _("Cannot cut table."), _("Sorry."));
-      return;
-   }
-#endif
-   /* a test to make sure there is not already a footnote
-    * in the selection. */
-   
-   tmppar = sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos());
-   
-   while (tmppar != sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos()) && 
-         tmppar->footnoteflag == LyXParagraph::NO_FOOTNOTE)
-     tmppar = tmppar->next;
-   
-   if (tmppar != sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos())
-       || tmppar->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
-      WriteAlert(_("Impossible operation"), 
-                _("Float would include float!"), 
-                _("Sorry."));
-      return;
-   }
-   
-   /* ok we have a selection. This is always between sel_start_cursor
-    * and sel_end cursor */
-
-   SetUndo(bview->buffer(), Undo::FINISH, 
-          sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos())->previous, 
-          sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos())->next); 
-   
-   if (sel_end_cursor.pos() > 0 
-       && sel_end_cursor.par()->IsLineSeparator(sel_end_cursor.pos() - 1))
-          sel_end_cursor.pos(sel_end_cursor.pos() - 1);
-   /* please break before a space at the end */
-   if (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);
-
-   sel_end_cursor.par()->BreakParagraphConservative(bview->buffer()->params, sel_end_cursor.pos());
-   
-   sel_end_cursor.par(sel_end_cursor.par()->Next());
-   sel_end_cursor.pos(0);
-   
-   // don't forget to insert a dummy layout paragraph if necessary
-   if (sel_start_cursor.par()->GetLayout() != sel_end_cursor.par()->layout){
-     sel_end_cursor.par()->BreakParagraphConservative(bview->buffer()->params, 0);
-     sel_end_cursor.par()->layout = LYX_DUMMY_LAYOUT;
-     sel_end_cursor.par(sel_end_cursor.par()->next);
-   }
-   else
-     sel_end_cursor.par()->layout = LYX_DUMMY_LAYOUT;
-
-   cursor = sel_end_cursor;
-
-   /* please break behind a space, if there is one. The space should
-    * be erased too */ 
-   if (sel_start_cursor.pos() > 0 
-       && sel_start_cursor.par()->IsLineSeparator(sel_start_cursor.pos() - 1))
-     sel_start_cursor.pos(sel_start_cursor.pos() - 1);
-   if (sel_start_cursor.par()->IsLineSeparator(sel_start_cursor.pos())) {
-      sel_start_cursor.par()->Erase(sel_start_cursor.pos());
-   }
-   
-   sel_start_cursor.par()->BreakParagraphConservative(bview->buffer()->params,
-                                                   sel_start_cursor.pos());
-   tmppar = sel_start_cursor.par()->Next();
-   
-   if (dummy_selection) {
-          tmppar->Clear();
-          if (kind == LyXParagraph::TAB
-              || kind == LyXParagraph::FIG 
-               || kind == LyXParagraph::WIDE_TAB
-              || kind == LyXParagraph::WIDE_FIG 
-               || kind == LyXParagraph::ALGORITHM) {
-                  pair<bool, LyXTextClass::size_type> lres =
-                          textclasslist.NumberOfLayout(bview->buffer()->params.textclass,
-                                                       "Caption");
-                  LyXTextClass::size_type lay;
-                  if (lres.first) {
-                          // layout fount
-                          lay = lres.second;
-                  } else {
-                          // layout not found
-                          lay = 0; // use default layout "Standard" (0)
-                  }
-                  tmppar->SetLayout(bview->buffer()->params, lay);
-          }
-   } else {
-     if (sel_start_cursor.pos() > 0) {
-       /* the footnote-environment should begin with a standard layout.
-       * Imagine you insert a footnote within an enumeration, you 
-       * certainly do not want an enumerated footnote! */ 
-       tmppar->Clear();
-     } else {
-       /* this is a exception the user would sometimes expect, I hope */
-       sel_start_cursor.par()->Clear();
-     }
-   }
-   
-   while (tmppar != sel_end_cursor.par()) {
-      tmppar->footnoteflag = LyXParagraph::OPEN_FOOTNOTE;
-      tmppar->footnotekind = kind;
-      tmppar = tmppar->Next();
-   }
-
-   RedoParagraphs(bview, sel_start_cursor, sel_end_cursor.par()->Next());
-   
-   SetCursor(bview, sel_start_cursor.par()->Next(), 0);
-
-   ClearSelection();
-}
-#endif
-
-
 // returns pointer to a specified row
 Row * LyXText::GetRow(LyXParagraph * par,
-                     LyXParagraph::size_type pos, long & y) const
+                     LyXParagraph::size_type pos, int & y) const
 {
+       if (!firstrow)
+               return 0;
+       
        Row * tmprow = firstrow;
        y = 0;