From 26a44eb06bb8cc85c90f016beaa0d0f504ab024c Mon Sep 17 00:00:00 2001
From: Hans Hagen <pragma@wxs.nl>
Date: Thu, 5 Jan 2012 19:27:48 +0100
Subject: beta 2011.12.19 22:53

---
 tex/context/base/anch-bck.mkvi       |  684 ++++++++++++++++
 tex/context/base/anch-pgr.mkiv       | 1434 +++++++---------------------------
 tex/context/base/anch-pos.mkiv       |   37 +-
 tex/context/base/anch-snc.mkiv       |   18 +-
 tex/context/base/anch-tab.mkiv       |  347 ++++++++
 tex/context/base/context-version.pdf |  Bin 4068 -> 4072 bytes
 tex/context/base/context-version.png |  Bin 105482 -> 106437 bytes
 tex/context/base/context.mkiv        |    6 +-
 tex/context/base/m-educat.tex        |   90 +--
 tex/context/base/meta-pag.mkiv       |  231 +++---
 tex/context/base/mult-def.lua        |    4 +
 tex/context/base/page-bck.mkiv       |  120 ++-
 tex/context/base/page-imp.mkiv       |   12 +-
 tex/context/base/page-ini.mkiv       |    2 +-
 tex/context/base/page-lay.mkiv       |   21 +-
 tex/context/base/page-txt.mkvi       |   36 +-
 tex/context/base/status-files.pdf    |  Bin 23983 -> 24044 bytes
 tex/context/base/status-lua.pdf      |  Bin 169717 -> 169719 bytes
 tex/context/base/tabl-tbl.mkiv       |    2 +-
 19 files changed, 1636 insertions(+), 1408 deletions(-)
 create mode 100644 tex/context/base/anch-bck.mkvi
 create mode 100644 tex/context/base/anch-tab.mkiv

(limited to 'tex')

diff --git a/tex/context/base/anch-bck.mkvi b/tex/context/base/anch-bck.mkvi
new file mode 100644
index 000000000..75a7f05a5
--- /dev/null
+++ b/tex/context/base/anch-bck.mkvi
@@ -0,0 +1,684 @@
+%D \module
+%D   [       file=anch-bck, % moved from anch-pgr (1999.08.01)
+%D        version=2011.12.19,
+%D          title=\CONTEXT\ Anchoring Macros,
+%D       subtitle=Backgrounds,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Anchoring Macros / Backgrounds}
+
+%D This module is quite okay but at some point I might add methods
+%D that use attributes although not too much is to be expected,
+%D apart from better anchoring. In fact better anchoring can be
+%D done independent of that.
+
+\unprotect
+
+% This might be overloaded later on:
+
+\defineoverlay[\v!text-2][\positionoverlay{\v!text-2}]
+\defineoverlay[\v!text-1][\positionoverlay{\v!text-1}]
+\defineoverlay[\v!text+1][\positionoverlay{\v!text+1}]
+\defineoverlay[\v!text+2][\positionoverlay{\v!text+2}]
+
+% Paragraph positions:
+
+\newcount\backgrounds_text_n
+
+\def\v_backgrounds_text_current    {pbg:0}
+\def\v_backgrounds_text_next       {pbg:1}
+
+\def\v_backgrounds_anchor_current_b{b:\v_backgrounds_text_current}
+\def\v_backgrounds_anchor_current_e{e:\v_backgrounds_text_current}
+
+\def\v_backgrounds_anchor_next_b   {b:\v_backgrounds_text_next}
+\def\v_backgrounds_anchor_next_e   {e:\v_backgrounds_text_next}
+
+\def\backgrounds_text_initialize_next
+  {\global\advance\backgrounds_text_n\plusone
+   \edef\v_backgrounds_text_current{pbg:\number\backgrounds_text_n}%
+   \xdef\v_backgrounds_text_next   {pbg:\number\numexpr\backgrounds_text_n+\plusone\relax}} % x ?
+
+% todo : \synchonizepositionpage{b:\v_backgrounds_text_current}{s:\v_backgrounds_text_current}%
+
+\ifdefined\totalnoftextbackgrounds
+    % set in tuc
+\else
+    \newcounter\totalnoftextbackgrounds
+\fi
+
+\appendtoks
+    \savecurrentvalue\totalnoftextbackgrounds{\number\backgrounds_text_n}%
+\to \everybye
+
+% actually we can just ask lua to give us the nofpositions (or a least n<>0)
+
+\def\backgrounds_text_initialize
+  {\ifcase\totalnoftextbackgrounds\else
+     \enableparpositions
+   \fi}
+
+\appendtoks
+    % a position can be mid paragraph in which case we're behind
+    % this will change when we move positions to lua
+    \backgrounds_text_initialize
+\to \everystarttext
+
+%D Some MP
+
+\newcount\localpositionnumber % incremented elsewhere
+
+\newcount\MPparcounter
+
+\def\MPself        {\MPvar{self}}
+\def\MPbself       {b:\MPvar{self}}
+\def\MPeself       {e:\MPvar{self}}
+\def\MPwself       {w:\MPvar{self}}
+\def\MPparanchor   {p:\number\MPparcounter}
+\def\MPl       #tag{\MPplus{#tag}20} % slot 2 default 0
+\def\MPr       #tag{\MPplus{#tag}30} % slot 3 default 0
+
+\def\textbackgroundoverlay#tag{\iflocalpositioning\v!local\else\v!text\fi#tag}
+\def\MPanchornumber           {\iflocalpositioning\the\localpositionnumber\else\the\realpageno\fi}
+
+% \definetextbackground[more][state=start,backgroundcolor=red] % location=paragraph
+% \definetextbackground[test][state=start,backgroundcolor=green]
+%
+% \page \placefigure[left]{}{}
+%
+% \starttextbackground[test]
+%   \readfile{ward}{}{}
+%   \starttextbackground[more]
+%     \readfile{ward}{}{}
+%   \stoptextbackground
+%   \readfile{ward}{}{}
+% \stoptextbackground
+%
+% \page \placefigure[right]{}{}
+%
+% \starttextbackground[test]
+%   \readfile{ward}{}{}
+%   \starttextbackground[more]
+%     \readfile{ward}{}{}
+%   \stoptextbackground
+%   \readfile{ward}{}{}
+% \stoptextbackground
+
+\newcount\c_backgrounds_text_level
+
+\installcommandhandler \??td {textbackground} \??td
+
+\appendtoks
+    \setuevalue{\currenttextbackground}{\groupedcommand{\starttextbackground[\currenttextbackground]}{\stoptextbackground}}%
+    \setuevalue{\e!start\currenttextbackground}{\starttextbackground[\currenttextbackground]}%
+    \setuevalue{\e!stop \currenttextbackground}{\stoptextbackground}%
+    \doif{\textbackgroundparameter\c!state}\v!start\checktextbackgrounds
+\to \everydefinetextbackground
+
+\appendtoks
+    \doif{\textbackgroundparameter\c!state}\v!start\checktextbackgrounds
+\to \everysetuptextbackground
+
+\unexpanded\def\starttextbackground
+  {\begingroup
+   \advance\c_backgrounds_text_level\plusone
+   \dodoubleempty\backgrounds_text_start}
+
+\def\backgrounds_text_start[#tag][#settings]%
+  {\checktextbackgrounds
+   \def\currenttextbackground{#tag}%
+   \backgrounds_text_initialize_next
+   \ifsecondargument
+     \setupcurrenttextbackground[#settings]%
+   \fi
+   \doifelse{\textbackgroundparameter\c!state}\v!start
+     \backgrounds_text_preset_yes
+     \backgrounds_text_preset_nop
+   \backgrounds_text_start_indeed}
+
+% todo \backgroundvariable\c!variant
+
+\let\backgrounds_text_start_indeed\relax
+\let\backgrounds_text_stop_indeed \relax
+
+\setvalue{\??td:l:\v!text}%
+  {\let\backgrounds_text_start_indeed\backgrounds_text_start_txt
+   \let\backgrounds_text_stop_indeed \dostoptextbackgroundtxt}
+
+\setvalue{\??td:l:\v!paragraph}%
+  {\ifnum\c_backgrounds_text_level>\plusone
+     \let\backgrounds_text_start_indeed\backgrounds_text_start_txt
+     \let\backgrounds_text_stop_indeed \dostoptextbackgroundtxt
+   \else
+     \let\backgrounds_text_start_indeed\backgrounds_text_start_par
+     \let\backgrounds_text_stop_indeed \dostoptextbackgroundpar
+   \fi}
+
+\setvalue{\??td:l:\v!none}%
+  {\backgrounds_text_preset_nop}
+
+\def\backgrounds_text_preset_nop
+  {\let\backgrounds_text_start_indeed\relax
+   \let\backgrounds_text_stop_indeed \relax}
+
+\def\backgrounds_text_preset_yes
+  {\backgrounds_text_preset_nop
+   \csname\??td:l:\textbackgroundparameter\c!location\endcsname
+   \edef\m_backgrounds_text_frame     {\textbackgroundparameter\c!frame}%
+   \edef\m_backgrounds_text_corner    {\textbackgroundparameter\c!corner}%
+   \edef\m_backgrounds_text_background{\textbackgroundparameter\c!background}%
+   \ifx\m_backgrounds_text_frame\v!on
+     \ifx\m_backgrounds_text_corner\v!round
+       \let\m_backgrounds_text_frame\!!plustwo
+     \else
+       \let\m_backgrounds_text_frame\!!plusone
+     \fi
+   \else
+     \let\m_backgrounds_text_frame\!!zerocount
+   \fi
+   \ifx\m_backgrounds_text_background\v!color
+     \let\m_backgrounds_text_background\!!plusone
+   \else
+     \let\m_backgrounds_text_background\!!zerocount
+   \fi
+   \startpositionoverlay{\textbackgroundoverlay{\textbackgroundparameter\c!level}}%
+     \backgrounds_text_mp_graphic % gets expanded directly
+   \stoppositionoverlay}
+
+\def\backgrounds_text_mp_graphic
+  {\normalexpanded
+     {\setMPpositiongraphicrange % needs to be optimized
+        {\v_backgrounds_anchor_current_b}%
+        {\v_backgrounds_anchor_current_e}%
+        {\textbackgroundparameter\c!method}%
+        {self=\v_backgrounds_text_current,
+         mp=\textbackgroundparameter\c!mp,
+         gridtype=\textbackgroundparameter\c!alternative,
+         filltype=\m_backgrounds_text_background,
+         linetype=\m_backgrounds_text_frame,
+         dashtype=\textbackgroundparameter\c!dash,
+         gridcolor=\textbackgroundparameter\c!framecolor,
+         linecolor=\textbackgroundparameter\c!framecolor,
+         lineoffset=\textbackgroundparameter\c!frameoffset,
+         fillcolor=\textbackgroundparameter\c!backgroundcolor,
+         filloffset=\textbackgroundparameter\c!backgroundoffset,
+         gridwidth=\textbackgroundparameter\c!rulethickness,
+         gridshift=\textbackgroundparameter\c!voffset,
+         linewidth=\textbackgroundparameter\c!rulethickness,
+         lineradius=\textbackgroundparameter\c!radius}}}
+
+\unexpanded\def\stoptextbackground
+  {\backgrounds_text_stop_indeed
+   \carryoverpar\endgroup}
+
+\unexpanded\def\starttextbackgroundmanual
+  {\begingroup
+   \usetextbackgroundstyleandcolor\c!style\c!color
+   \fpos\v_backgrounds_text_current\ignorespaces}
+
+\unexpanded\def\stoptextbackgroundmanual
+  {\tpos\v_backgrounds_text_current
+   \endgroup}
+
+\def\backgrounds_text_start_txt
+  {\ifvmode \dontleavehmode \fi
+   \begingroup
+   \usetextbackgroundstyleandcolor\c!style\c!color
+   \fpos\v_backgrounds_text_current\ignorespaces}
+
+\def\dostoptextbackgroundtxt
+  {\tpos\v_backgrounds_text_current
+   \endgroup}
+
+\newskip\textbackgroundskip
+
+\def\backgrounds_text_start_par
+  {\endgraf % new
+   \textbackgroundparameter\c!before
+   \begingroup
+   \begingroup
+   \resetallattributes % \attribute\linenumberattribute \attributeunsetvalue
+   \noindent
+   \ifgridsnapping
+     \doassignsomeskip\textbackgroundparameter\c!topoffset\to\textbackgroundskip
+     \ifdim\textbackgroundskip>\zeropoint
+       \struttedbox{\hbox{\raise\textbackgroundskip\hbox{\fpos\v_backgrounds_text_current}}}%
+     \else
+      \fpos\v_backgrounds_text_current
+     \fi
+   \else
+     \fpos\v_backgrounds_text_current
+   \fi
+   \endgraf % we need a vertical nobreak - 29/06/2004
+   \endgroup
+   \nobreak
+   \vskip-\lineheight
+   \nobreak
+   \ifgridsnapping \else
+     \doassignsomeskip\textbackgroundparameter\c!topoffset\to\textbackgroundskip
+     \ifdim\textbackgroundskip>\zeropoint
+        \kern\textbackgroundskip\nobreak
+     \fi
+   \fi
+   \dosetleftskipadaption{\textbackgroundparameter\c!leftoffset}%
+   \advance\leftskip\leftskipadaption
+   \dosetleftskipadaption{\textbackgroundparameter\c!rightoffset}%
+   \advance\rightskip\leftskipadaption
+   % new
+   \dosetraggedcommand{\textbackgroundparameter\c!align}%
+   \raggedcommand
+   %
+   \usetextbackgroundstyleandcolor\c!style\c!color
+   \nowhitespace
+   \nobreak % new per 23/04/2006 (else potential break when whitespace)
+   \seteffectivehsize
+   \doinhibitblank %   \blank[\v!disable]% new
+   \par}
+
+\def\dostoptextbackgroundpar
+  {\par
+   \removelastskip % new
+   \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip
+   \ifdim\lastskip>\zeropoint
+     \advance\textbackgroundskip-\lastskip
+   \fi
+   \ifgridsnapping \else \ifdim\textbackgroundskip>\zeropoint
+     \kern\textbackgroundskip\nobreak
+   \fi \fi
+   \nobreak
+   \vskip-\dimexpr\lineheight+\parskip\relax
+   \nobreak
+   \endgroup
+   \begingroup
+   \forgeteverypar % NOT REALLY NEEDED, SAVES HASH/MEM
+   \resetallattributes % \attribute\linenumberattribute \attributeunsetvalue
+   \nobreak \noindent \strut \hfill \kern\zeropoint
+   \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip
+   \ifgridsnapping % experimental, pascal (todo: topoffset in same way)
+     \ifdim\textbackgroundskip>\zeropoint
+       \struttedbox\plusone{\hbox{\lower\textbackgroundskip\hbox{\tpos\v_backgrounds_text_current}}}%
+     \else
+       \tpos\v_backgrounds_text_current
+     \fi
+   \else
+     \tpos\v_backgrounds_text_current
+   \fi
+   \endgraf
+   \endgroup
+   \endgraf % new
+   \textbackgroundparameter\c!after}
+
+\newcount\backgrounds_text_par_pages
+\newdimen\backgrounds_text_par_height
+\newdimen\backgrounds_text_par_width
+
+\def\calculatetextpardimensions
+  {\docalculatetextpardimensions\v_backgrounds_anchor_current_b\v_backgrounds_anchor_current_e\MPparanchor}
+
+\def\calculatenexttextpardimensions
+  {\docalculatetextpardimensions\v_backgrounds_anchor_next_b\v_backgrounds_anchor_next_e\relax}
+
+\def\docalculatetextpardimensions#begin#end#par%
+  {\backgrounds_text_par_pages\numexpr
+      \MPp#end-\MPp#begin%
+   \relax
+   \backgrounds_text_par_height\dimexpr
+     \ifcase\backgrounds_text_par_pages
+       % one page
+       \MPy#begin-\MPy#end%
+     \else
+       % two or more pages
+       \ifnum\backgrounds_text_par_pages>\plustwo
+         \ifnum\backgrounds_text_par_pages<\plusfive
+           % more pages
+           \textheight*\numexpr\backgrounds_text_par_pages+\minusone
+         \else
+           % keep'm small
+           \plusfive\textheight % weird value
+         \fi
+       \else
+         \MPy#begin-\MPy#end-\MPy\textanchor+\MPy\textanchor+\MPh\textanchor
+       \fi
+     \fi
+   \relax
+   \backgrounds_text_par_width\dimexpr
+     \ifcase\backgrounds_text_par_pages
+       % one page
+       \MPx#end-\MPx#begin%
+     \else
+       % two or more pages / maybe also hang
+       \ifx#par\relax
+         \makeupwidth % \textwidth
+       \else
+         \MPw\MPparanchor-\MPl\MPparanchor-\MPr\MPparanchor
+       \fi
+     \fi
+   \relax}
+
+\def\mintextparheight{4\lineheight}
+
+\def\dontsplitnexttextbackground % dangerous but useful
+  {\ifdim\pagetotal>\textheight \else
+     \ifdim\pagegoal=\maxdimen \else
+      \calculatenexttextpardimensions
+      % too tricky
+      % \scratchdimen=\backgrounds_text_par_height
+      % \advance\scratchdimen\pagetotal\relax
+      % \ifdim\scratchdimen>\pagegoal
+      % \page
+      % \fi
+      \ifdim\backgrounds_text_par_height>\zeropoint
+        \ifdim\backgrounds_text_par_height>\mintextparheight\else
+          \page % option
+        \fi
+      \fi
+    \fi
+   \fi}
+
+\def\checktextbackgrounds
+  {\ifproductionrun
+     \enabletextarearegistration
+     \enablehiddenbackground
+   \fi}
+
+\setuptextbackground
+  [\c!mp=mpos:par:columnset,      % buggy: mpos:par:shape
+   \c!method=mpos:par:columnset, %
+   \c!state=\v!start,
+   \c!location=\v!text,
+   \c!leftoffset=\!!zeropoint, % 1em,
+   \c!rightoffset=\textbackgroundparameter\c!leftoffset,
+   \c!topoffset=\!!zeropoint,  % \v!medium,
+   \c!bottomoffset=\textbackgroundparameter\c!topoffset,
+   \c!level=-1,
+   \c!alternative=0,
+   \c!align=,
+   \c!dash=0, % to be internationalized
+   \c!background=\v!color,
+   \c!backgroundcolor=lightgray,
+   \c!backgroundoffset=\!!zeropoint,
+   \c!corner=\v!rectangular,
+   \c!radius=.5\bodyfontsize,
+   \c!voffset=\!!zeropoint,
+   \c!frame=\v!on,
+   \c!framecolor=blue,
+   \c!rulethickness=\linewidth]
+
+%D The \METAPOST\ connection:
+
+%D Some of these macros are pretty clever but too complicated
+%D to be nice. When things are kind of stable I'll clean up
+%D this mess.
+
+\setupMPvariables
+  [mpos:box]
+  [linecolor=blue,
+   linewidth=\linewidth,
+   fillcolor=lightgray,
+   filloffset=\!!zeropoint]
+
+\startMPpositiongraphic{mpos:box}{fillcolor,linecolor,linewidth}
+    initialize_box(\MPpos{\MPvar{self}}) ;
+    def boxfilloptions = withcolor \MPvar{fillcolor} enddef ;
+    def boxlineoptions = withcolor \MPvar{linecolor} enddef ;
+    boxlinewidth  := \MPvar{linewidth} ;
+    boxfilloffset := \MPvar{filloffset} ;
+    draw_box ;
+    anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+\setupMPvariables
+  [mpos:area]
+  [linecolor=blue,
+   linewidth=\linewidth,
+   fillcolor=lightgray,
+   filloffset=\!!zeropoint]
+
+\startMPpositiongraphic{mpos:area}{fillcolor,linecolor,linewidth}
+    initialize_area(\MPpos{b:\MPvar{self}},\MPpos{e:\MPvar{self}}) ;
+    def boxfilloptions = withcolor \MPvar{fillcolor} enddef ;
+    def boxlineoptions = withcolor \MPvar{linecolor} enddef ;
+    boxlinewidth  := \MPvar{linewidth} ;
+    boxfilloffset := \MPvar{filloffset} ;
+    draw_area ;
+    anchor_area(\MPanchor{b:\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+% gridtype = 1 => baseline
+% gridtype = 2 => betweenline
+
+\setupMPvariables
+  [mpos:par]
+  [mp=mpos:par:shape,
+   gridtype=0,
+   linetype=1,
+   filltype=1,
+   dashtype=0, % 1 = dashed, 2 = dashed with background
+  %snaptops=true, % not that nice: true/false
+   gridcolor=red,
+   linecolor=blue,
+   fillcolor=lightgray,
+   filloffset=\!!zeropoint,
+   linewidth=\linewidth,
+   gridwidth=\linewidth,
+   gridshift=\!!zeropoint,
+   lineradius=.5\bodyfontsize,
+   dashtype=1]
+
+\startuseMPgraphic{mpos:par:shape}
+    \iftracepositions show_par \else draw_par \fi ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{mpos:par:setup}
+    boxgridtype   := \MPvar{gridtype} ;
+    boxlinetype   := \MPvar{linetype} ;
+    boxfilltype   := \MPvar{filltype} ;
+    boxdashtype   := \MPvar{dashtype} ;
+    def boxgridoptions = withcolor \MPvar{gridcolor} enddef ;
+    def boxlineoptions = withcolor \MPvar{linecolor} enddef ;
+    def boxfilloptions = withcolor \MPvar{fillcolor} enddef ;
+    boxfilloffset := \MPvar{filloffset} ;
+    boxlinewidth  := \MPvar{linewidth} ;
+    boxgridwidth  := \MPvar{gridwidth} ;
+    boxgridshift  := \MPvar{gridshift} ;
+    boxlineradius := \MPvar{lineradius} ;
+    %snap_multi_par_tops := \MPvar{snaptops} ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{mpos:par:extra}
+    % user stuff, like:
+    % snap_multi_par_tops := false ;
+\stopuseMPgraphic
+
+\startMPpositionmethod{mpos:par} %%%%%%%%%%% will become obsolete
+    \MPparcounter\MPv\MPbself{1}\zerocount\relax
+    \directsetup{mpos:par:variant:\doifpositionelse\MPwself{w}{b}}
+    \MPpositiongraphic{mpos:par}{}%
+\stopMPpositionmethod
+
+\startsetups mpos:par:variant:w
+    \startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
+        initialize_area_par(\MPpos\MPbself,\MPpos\MPeself,\MPpos\MPwself) ;
+        \includeMPgraphic{mpos:par:setup} ;
+        \includeMPgraphic{mpos:par:extra} ;
+        \includeMPgraphic{\MPvar{mp}} ;
+        anchor_par(\MPanchor\MPbself) ;
+    \stopMPpositiongraphic
+\stopsetups
+
+\startsetups mpos:par:variant:b
+    \startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
+        initialize_par(\MPpos\MPbself,\MPpos\MPeself,\MPpos\textanchor,\MPpos\MPparanchor,\MPvv\MPparanchor{0pt,0pt,0pt,0pt,0,0pt}) ;
+        \includeMPgraphic{mpos:par:setup} ;
+        \includeMPgraphic{mpos:par:extra} ;
+        \includeMPgraphic{\MPvar{mp}} ;
+        anchor_par(\MPanchor\MPbself) ;
+    \stopMPpositiongraphic
+\stopsetups
+
+%D The next alternative works in columnsets :
+
+\startuseMPgraphic{mpos:par:columnset}
+    \iftracepositions show_multi_pars \else draw_multi_pars \fi ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{mpos:par:sideline}{linecolor,lineoffset,linewidth}
+    begingroup ; save p ; picture p ;
+    for i=1 upto nofmultipars :
+        p := image ( fill leftboundary multipars[i]
+            shifted (-\MPvar{lineoffset},0)
+            rightenlarged \MPvar{linewidth} withcolor \MPvar{linecolor} ;
+        ) ;
+        setbounds p to multipars[i] ;
+        draw p ;
+    endfor ;
+    endgroup ;
+\stopuseMPgraphic
+
+\startMPpositionmethod{mpos:par:columnset}
+    \MPparcounter\MPv\MPbself{1}\zerocount\relax
+    \startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
+        \includeMPgraphic{mpos:par:setup} ;
+        \includeMPgraphic{mpos:par:extra} ;
+        prepare_multi_pars(\MPpos\MPbself,\MPpos\MPeself,\MPpos\MPwself,\MPpos\MPparanchor,\MPvv\MPparanchor{0pt,0pt,0pt,0pt,0,0pt}) ;
+        relocate_multipars(-\MPxy\MPanchorid) ; % inside layerpos
+        \includeMPgraphic{\MPvar{mp}} ;
+    \stopMPpositiongraphic
+    \MPpositiongraphic{mpos:par}{}%
+\stopMPpositionmethod
+
+%D \starttyping
+%D \setupbackground
+%D   [test]
+%D   [mp=mpos:par:columnset,
+%D    method=mpos:par:columnset]
+%D \stoptyping
+
+%D We need to treat floats in a special way.
+
+\startMPinitializations
+    local_multi_par_area:=\iflocalpositioning true\else false\fi;
+\stopMPinitializations
+
+%D As an example we define a grid background:
+
+\definetextbackground
+  [\v!grid]
+  [\c!state=\v!stop,
+   \c!location=\v!paragraph,
+   \c!frame=\v!off,
+   \c!framecolor=red,
+   \c!background=,
+   \c!alternative=1]
+
+\ifx\basegrid\undefined \else \letvalue\v!grid=\basegrid \fi
+
+%D Whatever
+
+\setupMPvariables
+  [mpos:connect]
+  [linecolor=red,
+   linewidth=1pt]
+
+\setupMPvariables
+  [mpos:encircle]
+  [fillcolor=lightgray,
+   filloffset=\!!zeropoint,
+   linecolor=blue,
+   linewidth=1pt]
+
+% these might become macros in mp-page
+
+\startuseMPgraphic{mpos:common:ec}
+    path pa ; pair ca ; numeric lw ;
+    lw := \MPvar{linewidth} ;
+    initialize_box(\MPpos{\MPvar{self}}) ;
+    pa := pxy ; ca := cxy ; pa := boundingbox pa enlarged 2lw ;
+    pa := llcorner pa ... lrcorner pa ... urcorner pa ... ulcorner pa ... cycle ;
+    drawoptions (withpen pencircle scaled lw withcolor \MPvar{linecolor}) ;
+\stopuseMPgraphic
+
+\startMPpositiongraphic{mpos:encircle}{linecolor,fillcolor,linewidth}
+    \includeMPgraphic{mpos:common:ec}
+    fill pa withcolor \MPvar{fillcolor} ; draw pa ;
+    anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+\startMPpositiongraphic{mpos:connect}{linecolor,linewidth}
+    path pb, pc ; pair cb, cc ;
+    \includeMPgraphic{mpos:common:ec}
+    initialize_box(\MPpos{\MPvar{to}}) ;
+    pb := pxy ; cb := cxy ; pb := boundingbox pb enlarged 2lw ;
+    pb := llcorner pb...lrcorner pb...urcorner pb...ulcorner pb...cycle ;
+    pc := ca {up} .. {down} cb ;
+    cc := (pc intersection_point pa) ;
+    if intersection_found :
+        pc := pc cutbefore cc ;
+        cc := (pc intersection_point pb) ;
+        if intersection_found :
+            pc := pc cutafter cc ;
+            drawarrow pc ; drawarrow reverse pc ;
+        fi ;
+    fi ;
+    anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+\protect \endinput
+
+% todo 1: shift down option
+
+% \startuseMPgraphic{mpos:par:columnset}
+%   \iftracepositions show_multi_pars \else draw_multi_pars \fi ;
+%   path p ; p := boundingbox currentpicture ;
+%   currentpicture := currentpicture shifted (0,-StrutDepth/2) ;
+%   setbounds currentpicture to p ;
+% \stopuseMPgraphic
+
+\definetextbackground[underline]    [location=text,alternative=1,background=,frame=off]
+\definetextbackground[overstrike]   [location=text,alternative=2,background=,frame=off]
+\definetextbackground[exlines]      [location=text,alternative=3,background=,frame=off]
+\definetextbackground[strikethrough][location=text,alternative=4,background=,frame=off]
+
+\definestartstop [underline]
+  [before={\starttextbackground[underline]},
+   after=\stoptextbackground]
+
+\definestartstop
+  [overstrike]
+  [before={\starttextbackground[overstrike]},
+   after=\stoptextbackground]
+
+\definestartstop
+  [exlines]
+  [before={\starttextbackground[exlines]},
+   after=\stoptextbackground]
+
+\definestartstop
+  [strikethrough]
+  [before={\starttextbackground[strikethrough]},
+   after=\stoptextbackground]
+
+\definetextbackground
+  [sideline]
+  [mp=mpos:par:sideline,
+   location=paragraph,
+   framecolor=red,
+   frameoffset=5mm]
+
+\definestartstop [sideline]
+  [before={\starttextbackground[sideline]},
+   after=\stoptextbackground]
+
+\starttext
+    \startunderline     \input tufte \stopunderline      \blank
+    \startoverstrike    \input tufte \stopoverstrike     \blank
+    \startexlines       \input tufte \stopexlines        \blank
+    \startstrikethrough \input tufte \stopstrikethrough  \blank
+    \startsideline      \input tufte \stopsideline       \blank
+\stoptext
diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv
index 4a9bf6ee3..8d5b87893 100644
--- a/tex/context/base/anch-pgr.mkiv
+++ b/tex/context/base/anch-pgr.mkiv
@@ -13,96 +13,198 @@
 
 \writestatus{loading}{ConTeXt Anchoring Macros / Grapics}
 
-%D We can use the commandhandler here.
-
 %D Before we come to graphics support, we have to make sure of
-%D the reference point on the page. The next macro does so and
-%D is hooked into the page building routine.
+%D the reference point on the page. The next macros do so and
+%D are hooked into the page building routine.
 
-%D I will speed up this module when I have a proper torture
-%D test file.
+\unprotect
 
-%D This module will be adapted to \MKIV\ and we will have a
-%D more direct processing in a pre-shipout phase.
+%D Here we implement position actions (was a dummy).
 
-\unprotect
+\unexpanded\def\showanchor#1%
+  {\normalexpanded{\writestatus{#1}
+     {\MPp{#1}\string|\MPx{#1}\string|\MPy{#1}\string|\MPw{#1}\string|\MPh{#1}\string|\MPd{#1}}}}
 
-% in the future, the depth of tail will reflect page depth
+%D A few more low level macros take care of defining and
+%D recalling actions. We could save this information in the
+%D position containers themselves, this would save hash
+%D entries, but at the cost of much more time consuming
+%D expansion. Actions are saved globally!
+%D
+%D The lists can become quite long (also because there can
+%D be lots of parameters passed on) so we provide a hook
+%D to clean up the list afterwards.
 
-\ifx\textheight\undefined \def\textheight{\vsize} \fi
+\newtoks\everypositionaction
+\newtoks\everyinsertpositionaction
+\newtoks\everycleanpositionaction
 
-%D The next macros so some housekeeping.
+\let\POSactionprefix\POSprefix
 
-\def\pageanchor{page:0} % for the moment only one pagesize
-\def\textanchor{text:\the\realpageno}
-\def\headanchor{head:\the\realpageno} % virtual position
-\def\tailanchor{tail:\the\realpageno} % virtual position
+\unexpanded\def\dosetpositionaction#1%
+  {\setgvalue{\POSactionprefix#1::}}
+
+\def\doifpositionaction#1%
+  {\ifcsname\POSactionprefix#1::\endcsname
+     \expandafter\firstofoneargument
+   \else
+     \expandafter\gobbleoneargument
+   \fi}
+
+\def\doifpositionactionelse#1%
+  {\ifcsname\POSactionprefix#1::\endcsname
+     \expandafter\firstoftwoarguments
+   \else
+     \expandafter\secondoftwoarguments
+   \fi}
+
+\def\dopositionaction#1% test saves hash entry in etex
+  {\ifcsname\POSactionprefix#1::\endcsname
+     \positions_action_indeed{#1}%
+   \fi}
+
+\def\positions_action_indeed#1%
+  {\ifcase\MPp{#1}\relax
+     \traceposstring\clap\cyan{<#1>}% shouldn't happen too often
+   \else
+     \begingroup
+     \setbox\scratchbox\hbox
+       {\traceposstring\clap\red{<#1>}%
+        \the\everyinsertpositionaction
+        \the\everypositionaction
+        \csname\POSactionprefix#1::\endcsname
+        \positions_cleanup_action{#1}}%
+     \smashedbox\scratchbox % smashing is really needed else we get problems with too big overlays
+     \endgroup
+   \fi}
+
+%D Here the complication has to do with collecting actions
+%D for later execution. This collection is especially handy
+%D when we want to move actions to a specific layer.
+%D Such series of actions are stored in a macro (the one
+%D with the funny \type {++}) which is cleaned up after each
+%D invocation.
+
+% this can probably be done better
 
-%D Anchors:
+% \def\positions_cleanup_action#1% not in trialtypesetting
+%   {\ifcsname\POSactionprefix#1++\endcsname
+%      \the\everycleanpositionaction
+%      \iflocalpositioning
+%        \letgvalue{\POSactionprefix#1++}\empty
+%      \else
+%        \setxvalue{\POSactionprefix#1++}{\getvalue{\POSactionprefix#1++}}%
+%      \fi
+%    \fi}
+
+\def\positions_cleanup_action#1% not in trialtypesetting
+  {\ifcsname\POSactionprefix#1++\endcsname
+     \the\everycleanpositionaction
+     \iflocalpositioning
+       % erase
+       \expandafter\let\csname\POSactionprefix#1++\endcsname\empty
+     \else
+       % globalize
+       \global\expandafter\let\csname\POSactionprefix#1++\expandafter\endcsname\csname\POSactionprefix#1++\endcsname
+     \fi
+   \fi}
 
-\def\dopresetpositionanchors % also mkii
+\def\handlepositionaction#1\with#2\on#3% ugly
   {\begingroup
-   \!!dimena\ifdim\topskip>\strutht\topskip\else\strutht\fi
-   \!!dimenb\dimexpr\MPy\textanchor+\MPh\textanchor-\!!dimena\relax
-   \!!dimenc\dimexpr\MPy\textanchor+\strutdp\relax
-   \!!dimend\MPx\textanchor
-   \!!dimene\MPw\textanchor
-   \replacepospxywhd\headanchor\realfolio\!!dimend\!!dimenb\!!dimene\!!dimena\strutdp
-   \replacepospxywhd\tailanchor\realfolio\!!dimend\!!dimenc\!!dimene\strutht \strutdp
+   \edef\!!stringa{\ifx\currentpositionoverlay\empty#3\else\currentpositionoverlay::\MPanchoridentifier\fi}%
+   \edef\!!stringc{\POSactionprefix\!!stringa++}%
+   \normalexpanded{\dosetpositionaction{\!!stringa}{\noexpand\getvalue{\!!stringc}}}%
+   \global\let#1\relax
+   \edef\!!stringb{\ifcsname\!!stringc\endcsname\csname\!!stringc\endcsname\fi}% why ...
+   \setxvalue\!!stringc{\!!stringb#1#2}%
    \endgroup}
 
-\def\presetpositionanchors% compatibility hack (still needed?)
-  {\ifpositioning
-     \dopresetpositionanchors
-   \fi}
+%D The next macros do some housekeeping.
+
+\def\pageanchor{page:0} % for the moment only one pagesize
+\def\textanchor{text:\the\realpageno}
 
 %D The first version of this module implemented head and tail
 %D anchors. Currently we stick to just one anchor and derive
-%D the head and tail anchors from this one.
-
-\def\showanchor#1%
-  {\expanded{\writestatus{#1}
-     {\MPp{#1}\string|\MPx{#1}\string|\MPy{#1}\string|%
-      \MPw{#1}\string|\MPh{#1}\string|\MPd{#1}}}}
+%D the head and tail anchors from this one. We set these
+%D anchors before and after each page.
 
-%D We set these anchors before and after each page.
-
-\appendtoks \presetpositionanchors \to \beforeeverypage
-\appendtoks \presetpositionanchors \to \aftereverypage
+% FOR THE MOMENT DISABLED (was downward compatibity issue)
+%
+% \def\headanchor{head:\the\realpageno} % virtual position
+% \def\tailanchor{tail:\the\realpageno} % virtual position
+%
+% \def\presetpositionanchors % is this still needed?
+%   {\ifpositioning
+%      \positions_preset_anchors
+%    \fi}
+%
+% \def\positions_preset_anchors
+%   {\begingroup
+%    \!!dimena\ifdim\topskip>\strutht\topskip\else\strutht\fi
+%    \!!dimenb\dimexpr\MPy\textanchor+\MPh\textanchor-\!!dimena\relax
+%    \!!dimenc\dimexpr\MPy\textanchor+\strutdp\relax
+%    \!!dimend\MPx\textanchor
+%    \!!dimene\MPw\textanchor
+%    \replacepospxywhd\headanchor\realfolio\!!dimend\!!dimenb\!!dimene\!!dimena\strutdp
+%    \replacepospxywhd\tailanchor\realfolio\!!dimend\!!dimenc\!!dimene\strutht \strutdp
+%    \endgroup}
+%
+% \appendtoks \presetpositionanchors \to \beforeeverypage
+% \appendtoks \presetpositionanchors \to \aftereverypage
 
 % todo: change with each page size change .. can be made more efficient
 % as some values are the same .. this one can (at some point) be used
 % to provide correction for imposition
 
-\def\doregisterpageposition#1%
-  {\setbox#1\hbox{\hpos\pageanchor{\box#1}}}
-
-\def\registerpageposition#1% this one is flushed first ! ... can't we avoid this one
+\unexpanded\def\positions_register_page#1% this one is flushed first ! ... can't we avoid this one
   {\ifpositioning\ifcase\realpageno\or
      \ifdim\printpaperheight=\paperheight
        \ifdim\printpaperwidth=\paperwidth
          % not needed,
        \else
-         \doregisterpageposition{#1}%
+         \positions_register_page_indeed{#1}%
        \fi
      \else
-       \doregisterpageposition{#1}%
+       \positions_register_page_indeed{#1}%
      \fi
    \fi\fi}
 
-\unexpanded\def\placepositionanchors % todo : depth pagebox
+\def\positions_register_page_indeed#1%
+  {\setbox#1\hbox{\hpos\pageanchor{\box#1}}}
+
+\unexpanded\def\positions_place_anchors
   {\ifpositioning
-     \setbox\scratchbox\vbox to \textheight
-       {\simpletopskipcorrection
-        \hbox{\strut\dopositionaction\headanchor}%
-        \vfill
-        \hbox{\strut\dopositionaction\tailanchor}}%
-     \dp\scratchbox\zeropoint
-     \wd\scratchbox\makeupwidth % not \zeropoint, else wrong text backgrounds
-     \hpos\textanchor{\box\scratchbox}%
+     \positions_place_anchors_yes
    \else
-     \vskip\textheight
+     \positions_place_anchors_nop
    \fi}
+
+% FOR THE MOMENT DISABLED
+%
+% \def\positions_place_anchors_yes % todo : depth pagebox
+%   {\begingroup
+%    \setbox\scratchbox\vbox to \textheight
+%      {\simpletopskipcorrection
+%       \hbox{\strut\dopositionaction\headanchor}%  ! actions on a virtual position
+%       \vfill
+%       \hbox{\strut\dopositionaction\tailanchor}}% ! actions on a virtual position
+%    \dp\scratchbox\zeropoint
+%    \wd\scratchbox\makeupwidth % not \zeropoint, else wrong text backgrounds
+%    \hpos\textanchor{\box\scratchbox}%
+%    \endgroup}
+
+\def\positions_place_anchors_yes % todo : depth pagebox
+  {\begingroup
+   \setbox\scratchbox\emptyvbox
+   \ht\scratchbox\textheight
+   \dp\scratchbox\zeropoint
+   \wd\scratchbox\makeupwidth
+   \hpos\textanchor{\box\scratchbox}%
+   \endgroup}
+
+\def\positions_place_anchors_nop
+  {\vskip\textheight}
 
 %D \macros
 %D   {positionoverlay,startpositionoverlay}
@@ -169,81 +271,78 @@
 
 \def\positionoverlay  % the test prevents too many redundant positions
   {\ifpositioning     % in (not used) text* position layers
-     \expandafter\positionoverlayindeed
+     \expandafter\positions_overlay_indeed
    \else % also \iftrialtypesetting test here?
      \expandafter\gobbleoneargument
    \fi}
 
-\def\positionoverlayindeed#1% the test prevents too many redundant positions
+% keep this for a while
+%
+% \def\positions_overlay_indeed#1% the test prevents too many redundant positions
+%   {\vbox to \overlayheight
+%      {\doifpositionactionelse{#1::\MPanchoridentifier}%
+%         {\edef\MPanchorid{#1::\MPanchoridentifier:\MPanchornumber}%
+%          \edef\MPanchor##1{\MPpos{\MPanchorid}}%
+%          \the\everyinsertpositionaction
+%          \copyposition{#1::\MPanchoridentifier}{#1::\MPanchoridentifier:\MPanchornumber}%
+%          \hpos
+%            {#1::\MPanchoridentifier:\MPanchornumber}%
+%           % this is ok
+%           %{\hbox to \overlaywidth{\dopositionaction{#1::\MPanchoridentifier}\hss}}}%
+%           % but this one prevents cyclic runs due to
+%           % rounding errors
+%            {\setbox\scratchbox\hbox to \overlaywidth{\dopositionaction{#1::\MPanchoridentifier}\hss}%
+%             \ht\scratchbox\overlayheight
+%             \dp\scratchbox\zeropoint
+%             \box\scratchbox}}%
+%         {\hbox to \overlaywidth{\hss}}%
+%       \vfill}}
+
+\def\positions_overlay_indeed#1%
+  {\doifpositionactionelse{#1::\MPanchoridentifier}%
+     \positions_overlay_yes\positions_overlay_nop{#1}}
+
+\def\positions_overlay_yes#1%
   {\vbox to \overlayheight
-     {\doifpositionactionelse{#1::\MPanchoridentifier}%
-        {\edef\MPanchorid{#1::\MPanchoridentifier:\MPanchornumber}%
-         \edef\MPanchor##1{\MPpos{\MPanchorid}}%
-         \the\everyinsertpositionaction
-         \copyposition{#1::\MPanchoridentifier}{#1::\MPanchoridentifier:\MPanchornumber}%
-         \hpos
-           {#1::\MPanchoridentifier:\MPanchornumber}%
-          % this is ok
-          %{\hbox to \overlaywidth{\dopositionaction{#1::\MPanchoridentifier}\hss}}}%
-          % but this one prevents cyclic runs due to
-          % rounding errors
-           {\setbox\scratchbox\hbox to \overlaywidth{\dopositionaction{#1::\MPanchoridentifier}\hss}%
-            \ht\scratchbox\overlayheight
-            \dp\scratchbox\zeropoint
-            \box\scratchbox}}%
-        {\hbox to \overlaywidth{\hss}}%
+     {\edef\MPanchorid{#1::\MPanchoridentifier:\MPanchornumber}%
+      \edef\MPanchor##1{\MPpos\MPanchorid}%
+      \the\everyinsertpositionaction
+      \copyposition{#1::\MPanchoridentifier}\MPanchorid
+      \hpos \MPanchorid
+       %{\hbox to \overlaywidth{\dopositionaction{#1::\MPanchoridentifier}\hss}}}% oscillation due to rounding issues
+        {\setbox\scratchbox\hbox to \overlaywidth{\dopositionaction{#1::\MPanchoridentifier}\hss}%
+         \ht\scratchbox\overlayheight
+         \dp\scratchbox\zeropoint
+         \box\scratchbox}%
       \vfill}}
 
-\unexpanded\def\startpositionoverlay#1%
-  {\iftrialtypesetting % we don't want redundant entries in the list
-     \@EA\gobbleuntil\@EA\stoppositionoverlay
+% \def\\positions_overlay_nop#1%
+%   {\setbox\scratchbox\emptyvbox
+%    \ht\scratchbox\overlayheight
+%    \wd\scratchbox\overlaywidth
+%    \box\scratchbox}
+
+\let\positions_overlay_nop\gobbleoneargument
+
+\unexpanded\def\startpositionoverlay
+  {\iftrialtypesetting
+     \expandafter\positions_overlay_start_nop
    \else
-     \def\currentpositionoverlay{#1}%
+     \expandafter\positions_overlay_start_yes
    \fi}
 
+\def\positions_overlay_start_nop#1\stoppositionoverlay
+  {}
+
+\def\positions_overlay_start_yes#1%
+  {\def\currentpositionoverlay{#1}}
+
 \unexpanded\def\stoppositionoverlay
   {\let\currentpositionoverlay\empty}
 
 \def\resetpositionoverlay#1%
   {\dosetpositionaction{#1::\MPanchoridentifier::}{}}
 
-%D Here the complication has to do with collecting actions
-%D for later execution. This collection is especially handy
-%D when we want to move actions to a specific layer.
-%D Such series of actions are stored in a macro (the one
-%D with the funny \type {++}) which is cleaned up after each
-%D invocation.
-
-\newtoks\everycleanpositionaction
-\newtoks\everyinsertpositionaction
-
-\def\cleanuppositionaction#1% not in trialtypesetting
-  {\ifcsname\POSactionprefix#1++\endcsname
-     \the\everycleanpositionaction
-     \iflocalpositioning
-       \letgvalue{\POSactionprefix#1++}\empty
-     \else
-       \setxvalue{\POSactionprefix#1++}{\getvalue{\POSactionprefix#1++}}%
-     \fi
-   \fi}
-
-\def\handlepositionaction#1\with#2\on#3%
-  {\bgroup
-   \ifx\currentpositionoverlay\empty
-     \edef\!!stringa{#3}% no layer, just pos itself as anchor
-   \else
-     \edef\!!stringa{\currentpositionoverlay::\MPanchoridentifier}%
-   \fi
-   \edef\!!stringc{\POSactionprefix\!!stringa++}%
-   \expanded{\dosetpositionaction{\!!stringa}{\noexpand\getvalue{\!!stringc}}}%
-   \global\let#1\relax
-   \edef\!!stringb{\executeifdefined\!!stringc\empty}%
-   \setxvalue\!!stringc{\!!stringb#1#2}%
-   \egroup}
-
-%D The indirectness enables us redefine macros for special
-%D purposes, like a cleanup.
-
 \def\handlepositionboxes#1#2#3%
   {\handlepositionaction\dohandlepositionboxes\with{#1}{#2}{#3}\on{#2}}
 
@@ -272,74 +371,81 @@
 \newbox\positiongraphicbox
 
 \def\startMPpositiongraphic % id setups
-  {\dodoublegroupempty\dostartMPpositiongraphic}
+  {\dodoublegroupempty\positions_mp_graphic_start}
 
-\long\def\dostartMPpositiongraphic#1#2#3\stopMPpositiongraphic
-  {\long\setgvalue{MPG:#1}% tag list mpcode
-     {\useMPpositiongraphic{#1}{#2}{#3}}}
+\def\positions_mp_graphic_start#1#2#3\stopMPpositiongraphic % tag list mpcode
+  {\setgvalue{MPG:#1}{\positions_mp_graphic_use{#1}{#2}{#3}}}
 
 \let\stopMPpositiongraphic\relax
 
-\def\prepareMPpositionvariables
-  {\ifcsname\@@meta self\endcsname\else\setvalue{\@@meta self}{\currentposition}\fi
-   \ifcsname\@@meta from\endcsname\else\setvalue{\@@meta from}{\currentposition}\fi}
+\def\positions_mp_graphic_prepare
+  {\ifcsname\@@meta self\endcsname\else\letvalue{\@@meta self}\currentposition\fi
+   \ifcsname\@@meta from\endcsname\else\letvalue{\@@meta from}\currentposition\fi}
 
-\long\def\useMPpositiongraphic#1#2#3%
-  {\bgroup
+\def\positions_mp_graphic_use#1#2#3%
+  {\begingroup
    \prepareMPvariables{#2}%
-   \prepareMPpositionvariables
+   \positions_mp_graphic_prepare
    \enableincludeMPgraphics
    \startMPcode#3\stopMPcode
-   \egroup}
+   \endgroup}
 
-% Now we need a adapted action handler:
+\def\MPpositiongraphic
+  {\dodoublegroupempty\positions_mp_graphic_direct}
+
+% \def\positions_mp_graphic_direct#1#2% tag setups
+%   {\begingroup
+%    \def\@@meta{#1:}%
+%    \setupMPvariables[#2]%
+%    \positions_mp_graphic_prepare
+%    \MPshiftdrawingtrue
+%    \def\positions_mp_graphic_direct{\positions_mp_graphic_nested{#2}}% takes two extra arguments
+%    \setbox\positiongraphicbox\hbox
+%      {\ignorespaces
+%       \ifcsname MPM:#1\endcsname \csname MPM:#1\endcsname \else
+%       \ifcsname MPG:#1\endcsname \csname MPG:#1\endcsname \fi\fi
+%       \removelastspace}%
+%    \smashbox\positiongraphicbox
+%    \box\positiongraphicbox
+%    \endgroup}
+
+\def\positions_mp_graphic_direct#1% tag setups
+  {\ifcsname MPM:#1\endcsname
+     \expandafter\positions_mp_graphic_direct_indeed_mpm
+   \else\ifcsname MPG:#1\endcsname
+     \doubleexpandafter\positions_mp_graphic_direct_indeed_mpg
+   \else
+     \doubleexpandafter\positions_mp_graphic_direct_indeed_nop
+   \fi\fi{#1}}
 
-\def\dopositionaction#1% test saves hash entry in etex
-  {\ifcsname\POSactionprefix#1::\endcsname
-     \dodopositionaction{#1}%
-   \fi}
+\let\positions_mp_graphic_direct_indeed_nop\gobbletwoarguments
 
-\def\dodopositionaction#1%
-  {\ifnum\MPp{#1}>\zerocount % new
-     \bgroup
-     \setbox\scratchbox\hbox
-     \bgroup
-     \traceposstring\clap\red{<#1>}%
-     \the\everyinsertpositionaction
-     \the\everypositionaction
-     \csname\POSactionprefix#1::\endcsname
-     \cleanuppositionaction{#1}%
-     \egroup                % smashed is really needed else
-     \smashedbox\scratchbox % we get problems with too big
-     \egroup                % overlays (s-pre-0x.tex)
-   \else
-     % shouldn't happen too often
-     \traceposstring\clap\cyan{<#1>}%
-   \fi}
+\def\positions_mp_graphic_direct_indeed_mpm
+  {\positions_mp_graphic_direct_indeed{MPM}}
 
-\def\MPpositiongraphic
-  {\dodoublegroupempty\doMPpositiongraphic}
+\def\positions_mp_graphic_direct_indeed_mpg
+  {\positions_mp_graphic_direct_indeed{MPG}}
 
-\def\doMPpositiongraphic#1#2% tag setups
-  {\bgroup
-   \def\@@meta{#1:}%
-   \setupMPvariables[#2]%
-   \prepareMPpositionvariables
+\def\positions_mp_graphic_direct_indeed#1#2#3% what tag setups
+  {\begingroup
+   \def\@@meta{#2:}% will become a commandhandler
+   \setupMPvariables[#3]%
+   \positions_mp_graphic_prepare
    \MPshiftdrawingtrue
-   \def\doMPpositiongraphic##1##2%
-     {{% new, see (techniek)
-       \def\@@meta{##1:}%
-       \setupMPvariables[#2,##2]%
-       \prepareMPpositionvariables
-       % and needed
-       \getvalue{MPG:##1}}}% temp hack
+   \def\positions_mp_graphic_direct{\positions_mp_graphic_nested{#3}}% takes two extra arguments
    \setbox\positiongraphicbox\hbox
-     {\ignorespaces
-      \executeifdefined{MPM:#1}{\executeifdefined{MPG:#1}\donothing}%
-      \removelastspace}%
+     {\ignorespaces\csname#1:#2\endcsname\removelastspace}%
    \smashbox\positiongraphicbox
    \box\positiongraphicbox
-   \egroup}
+   \endgroup}
+
+\def\positions_mp_graphic_nested#1#2#3% nesting used in prikkels / pascal
+  {\begingroup
+   \def\@@meta{#2:}%
+   \setupMPvariables[#1,#3]%
+   \positions_mp_graphic_prepare
+   \getvalue{MPG:#2}%
+   \endgroup}%
 
 \long\def\startMPpositionmethod#1#2\stopMPpositionmethod
   {\long\setgvalue{MPM:#1}{#2}} % todo: var list here
@@ -372,7 +478,7 @@
 
 \def\docleanMPpositiongraphic#1#2#3% pos tag setups
   {\ifnum\MPp{#1}<\realpageno \else
-     \noexpand \dohandleMPpositiongraphic{#1}{#2}{#3}%
+     \noexpand\dohandleMPpositiongraphic{#1}{#2}{#3}%
    \fi}
 
 \appendtoks
@@ -381,7 +487,7 @@
 
 %D Graphics that span two positions (beware, does not cross pages).
 
-\def\setMPpositiongraphicrange
+\unexpanded\def\setMPpositiongraphicrange
   {\doquadruplegroupempty\dosetMPpositiongraphicrange}
 
 \def\dosetMPpositiongraphicrange#1#2#3#4% bpos epos tag vars
@@ -425,622 +531,6 @@
 \appendtoks
     \let\dohandleMPpositiongraphicrange\docleanMPpositiongraphicrange
 \to \everycleanpositionaction
-
-% will be overloaded, and/or code below moved to core-box
-
-\defineoverlay[\v!text-2][\positionoverlay{\v!text-2}]
-\defineoverlay[\v!text-1][\positionoverlay{\v!text-1}]
-\defineoverlay[\v!text+1][\positionoverlay{\v!text+1}]
-\defineoverlay[\v!text+2][\positionoverlay{\v!text+2}]
-
-%D Some of these macros are pretty clever but too complicated
-%D to be nice. When things are kind of stable I'll clean up
-%D this mess.
-
-%D THIS NEEDS A CLEANUP
-
-\setupMPvariables
-  [mpos:box]
-  [linecolor=blue,
-   linewidth=\linewidth,
-   fillcolor=lightgray,
-   filloffset=\!!zeropoint]
-
-\startMPpositiongraphic{mpos:box}{fillcolor,linecolor,linewidth}
-  initialize_box(\MPpos{\MPvar{self}}) ;
-  def boxfilloptions = withcolor \MPvar{fillcolor} enddef ;
-  def boxlineoptions = withcolor \MPvar{linecolor} enddef ;
-  boxlinewidth  := \MPvar{linewidth} ;
-  boxfilloffset := \MPvar{filloffset} ;
-  draw_box ;
-  anchor_box(\MPanchor{\MPvar{self}}) ;
-\stopMPpositiongraphic
-
-\setupMPvariables
-  [mpos:area]
-  [linecolor=blue,
-   linewidth=\linewidth,
-   fillcolor=lightgray,
-   filloffset=\!!zeropoint]
-
-\startMPpositiongraphic{mpos:area}{fillcolor,linecolor,linewidth}
-  initialize_area(\MPpos{b:\MPvar{self}},\MPpos{e:\MPvar{self}}) ;
-  def boxfilloptions = withcolor \MPvar{fillcolor} enddef ;
-  def boxlineoptions = withcolor \MPvar{linecolor} enddef ;
-  boxlinewidth  := \MPvar{linewidth} ;
-  boxfilloffset := \MPvar{filloffset} ;
-  draw_area ;
-  anchor_area(\MPanchor{b:\MPvar{self}}) ;
-\stopMPpositiongraphic
-
-%D This is already cleaned up.
-
-% gridtype = 1 => baseline
-% gridtype = 2 => betweenline
-
-\setupMPvariables
-  [mpos:par]
-  [mp=mpos:par:shape,
-   gridtype=0,
-   linetype=1,
-   filltype=1,
-   dashtype=0, % 1 = dashed, 2 = dashed with background
-  %snaptops=true, % not that nice: true/false
-   gridcolor=red,
-   linecolor=blue,
-   fillcolor=lightgray,
-   filloffset=\!!zeropoint,
-   linewidth=\linewidth,
-   gridwidth=\linewidth,
-   gridshift=\!!zeropoint,
-   lineradius=.5\bodyfontsize,
-   dashtype=1]
-
-\startuseMPgraphic{mpos:par:shape}
-  \iftracepositions show_par \else draw_par \fi ;
-\stopuseMPgraphic
-
-\startuseMPgraphic{mpos:par:setup}
-   boxgridtype   := \MPvar{gridtype} ;
-   boxlinetype   := \MPvar{linetype} ;
-   boxfilltype   := \MPvar{filltype} ;
-   boxdashtype   := \MPvar{dashtype} ;
-   def boxgridoptions = withcolor \MPvar{gridcolor} enddef ;
-   def boxlineoptions = withcolor \MPvar{linecolor} enddef ;
-   def boxfilloptions = withcolor \MPvar{fillcolor} enddef ;
-   boxfilloffset := \MPvar{filloffset} ;
-   boxlinewidth  := \MPvar{linewidth} ;
-   boxgridwidth  := \MPvar{gridwidth} ;
-   boxgridshift  := \MPvar{gridshift} ;
-   boxlineradius := \MPvar{lineradius} ;
-  %snap_multi_par_tops := \MPvar{snaptops} ;
-\stopuseMPgraphic
-
-\startuseMPgraphic{mpos:par:extra}
-  % user stuff, like:
-  % snap_multi_par_tops := false ;
-\stopuseMPgraphic
-
-\ifx\MPparcounter\undefined \newcounter\MPparcounter \fi
-
-\def\MPself     {\MPvar{self}}
-\def\MPbself    {b:\MPself}
-\def\MPeself    {e:\MPself}
-\def\MPwself    {w:\MPself}
-\def\MPparanchor{p:\MPparcounter}
-
-\def\MPl#1{\MPplus{#1}20}
-\def\MPr#1{\MPplus{#1}30}
-
-\startMPpositionmethod{mpos:par} %%%%%%%%%%% will become obsolete
-  \edef\MPparcounter{\MPv\MPbself{1}{0}}%
-  \doifpositionelse\MPwself
-    {\startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
-       initialize_area_par(\MPpos\MPbself,
-                           \MPpos\MPeself,
-                           \MPpos\MPwself) ;
-       \includeMPgraphic{mpos:par:setup} ;
-       \includeMPgraphic{mpos:par:extra} ;
-       \includeMPgraphic{\MPvar{mp}} ;
-       anchor_par(\MPanchor\MPbself) ;
-     \stopMPpositiongraphic}
-    {\startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
-       initialize_par(\MPpos\MPbself,
-                      \MPpos\MPeself,
-                      \MPpos\textanchor,
-                      \MPpos\MPparanchor,
-                      \MPvv \MPparanchor{0pt,0pt,0pt,0pt,0,0pt}) ;
-       \includeMPgraphic{mpos:par:setup} ;
-       \includeMPgraphic{mpos:par:extra} ;
-       \includeMPgraphic{\MPvar{mp}} ;
-       anchor_par(\MPanchor\MPbself) ;
-     \stopMPpositiongraphic}%
-  \MPpositiongraphic{mpos:par}{}%
-\stopMPpositionmethod
-
-%D The next alternative works in columnsets :
-
-%  \iftracepositions show\else draw\fi_multi_pars ;
-
-\startuseMPgraphic{mpos:par:columnset}
-  \iftracepositions show_multi_pars \else draw_multi_pars \fi ;
-\stopuseMPgraphic
-
-\startuseMPgraphic{mpos:par:sideline}{linecolor,lineoffset,linewidth}
-    begingroup ; save p ; picture p ;
-    for i=1 upto nofmultipars :
-        p := image ( fill leftboundary multipars[i]
-            shifted (-\MPvar{lineoffset},0)
-            rightenlarged \MPvar{linewidth} withcolor \MPvar{linecolor} ;
-        ) ;
-        setbounds p to multipars[i] ;
-        draw p ;
-    endfor ;
-    endgroup ;
-\stopuseMPgraphic
-
-\startMPpositionmethod{mpos:par:columnset}
-  \edef\MPparcounter{\MPv\MPbself{1}{0}}%
-  \startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
-    \includeMPgraphic{mpos:par:setup} ;
-    \includeMPgraphic{mpos:par:extra} ;
-    prepare_multi_pars(\MPpos\MPbself,\MPpos\MPeself,\MPpos\MPwself,
-      \MPpos\MPparanchor,\MPvv\MPparanchor{0pt,0pt,0pt,0pt,0,0pt}) ;
-    relocate_multipars(-\MPxy\MPanchorid) ; % inside layerpos
-    \includeMPgraphic{\MPvar{mp}} ;
-  \stopMPpositiongraphic
-  \MPpositiongraphic{mpos:par}{}%
-\stopMPpositionmethod
-
-%D \starttyping
-%D \setupbackground
-%D   [test]
-%D   [mp=mpos:par:columnset,
-%D    method=mpos:par:columnset]
-%D \stoptyping
-
-%D We need to treat floats in a special way.
-
-\startMPinitializations
-  local_multi_par_area:=\iflocalpositioning true\else false\fi;
-\stopMPinitializations
-
-\def\textbackgroundoverlay#1%
-  {\iflocalpositioning\v!local\else\v!text\fi#1}
-
-\newcount\localpositionnumber
-
-\def\MPanchornumber
-  {\iflocalpositioning\the\localpositionnumber\else\the\realpageno\fi}
-
-%D So far for the trickery.
-
-\newcount\textbackgrounddepth
-
-\ifdefined\nofparbackgrounds\else \newcount\nofparbackgrounds \fi
-
-\ifx\totalnofparbackgrounds\undefined \newcounter\totalnofparbackgrounds \fi
-
-\appendtoks
-    \expanded{\savecurrentvalue\noexpand\totalnofparbackgrounds{\number\nofparbackgrounds}}%
-\to \everybye
-
-% actually we can just ask lua to give us the nofpositions (or a least n<>0)
-
-\appendtoks
-    % a position can be mid paragraph in which case we're behind
-    % this will change when we move positions to lua
-    \initializeparbackgrounds
-\to \everystarttext
-
-\def\initializeparbackgrounds
-  {\ifcase\totalnofparbackgrounds\else
-     \enableparpositions
-   \fi}
-
-\unexpanded\def\starttextbackground
-  {\bgroup
-   \advance\textbackgrounddepth\plusone
-   \dodoubleempty\dostarttextbackground}
-
-\let\dodostarttextbackground\relax
-\let\dodostoptextbackground \relax
-
-\def\currentparbackground{pbg:0}
-\def\nextparbackground   {pbg:1}
-
-\def\btbanchor{b:\currentparbackground}
-\def\etbanchor{e:\currentparbackground}
-
-\def\nextbtbanchor{b:\nextparbackground}
-\def\nextetbanchor{e:\nextparbackground}
-
-\def\textbackgroundparameter#1%
-  {\csname\??td\currenttextbackground#1\endcsname}
-
-\let\backgroundvariable\textbackgroundparameter % will become obsolete
-
-% \definetextbackground[more][state=start,backgroundcolor=red] % location=paragraph
-% \definetextbackground[test][state=start,backgroundcolor=green]
-%
-% \page \placefigure[left]{}{}
-%
-% \starttextbackground[test]
-%   \readfile{ward}{}{}
-%   \starttextbackground[more]
-%     \readfile{ward}{}{}
-%   \stoptextbackground
-%   \readfile{ward}{}{}
-% \stoptextbackground
-%
-% \page \placefigure[right]{}{}
-%
-% \starttextbackground[test]
-%   \readfile{ward}{}{}
-%   \starttextbackground[more]
-%     \readfile{ward}{}{}
-%   \stoptextbackground
-%   \readfile{ward}{}{}
-% \stoptextbackground
-
-\def\dostarttextbackground[#1][#2]%
-  {\checktextbackgrounds
-   \def\currenttextbackground{#1}%
-   \global\advance\nofparbackgrounds\plusone
-   \edef\currentparbackground{pbg:\number\nofparbackgrounds}%
-   \xdef\nextparbackground{pbg:\number\numexpr\nofparbackgrounds+\plusone\relax}% still xdef ?
-   % todo : \synchonizepositionpage{b:\currentparbackground}{s:\currentparbackground}%
-   \setuptextbackground[#1][#2]%
-   \let\dodostarttextbackground\relax
-   \let\dodostoptextbackground \relax
-   \doif{\textbackgroundparameter\c!state}\v!start{\dopresettextbackground{#1}}%
-   \dodostarttextbackground}
-
-% todo \backgroundvariable\c!variant
-
-\def\dopresettextbackground#1% todo: \backgroundparameter
-  {\normalexpanded{\noexpand\processaction[\textbackgroundparameter\c!location]}
-     [   \v!text=>\let\dodostarttextbackground\dostarttextbackgroundtxt
-                  \let\dodostoptextbackground \dostoptextbackgroundtxt,
-    \v!paragraph=>\let\dodostarttextbackground\dostarttextbackgroundpar
-                  \let\dodostoptextbackground \dostoptextbackgroundpar,
-         \v!none=>\let\dodostarttextbackground\relax
-                  \let\dodostoptextbackground \relax]%
-   \ifx\dodostarttextbackground\dostarttextbackgroundpar % untested
-     \ifnum\textbackgrounddepth>\plusone % new
-       \let\dodostarttextbackground\dostarttextbackgroundtxt
-       \let\dodostoptextbackground \dostoptextbackgroundtxt
-     \fi
-   \fi
-   \doifelse{\textbackgroundparameter\c!frame}\v!on
-     {\doifelse{\textbackgroundparameter\c!corner}\v!round
-        {\setvalue{\??td#1\c!frame}{2}}
-        {\setvalue{\??td#1\c!frame}{1}}}
-     {\setvalue{\??td#1\c!frame}{0}}%
-   \doifelse{\textbackgroundparameter\c!background}\v!color
-     {\setvalue{\??td#1\c!background}{1}}
-     {\setvalue{\??td#1\c!background}{0}}%
-  %\startpositionoverlay{\v!text\getvalue{\??td#1\c!level}}%
-   \startpositionoverlay{\textbackgroundoverlay{\textbackgroundparameter\c!level}}%
-     \expanded
-       {\setMPpositiongraphicrange % moet veel efficienter
-          {\btbanchor}% {b:\currentparbackground}%
-          {\etbanchor}% {e:\currentparbackground}%
-          {\textbackgroundparameter\c!method}%
-          {self=\currentparbackground,
-           mp=\textbackgroundparameter\c!mp,
-           gridtype=\textbackgroundparameter\c!alternative,
-           filltype=\textbackgroundparameter\c!background,
-           linetype=\textbackgroundparameter\c!frame,
-           dashtype=\textbackgroundparameter{dash}, %  to be internationalized
-           gridcolor=\textbackgroundparameter\c!framecolor,
-           linecolor=\textbackgroundparameter\c!framecolor,
-           lineoffset=\textbackgroundparameter\c!frameoffset,
-           fillcolor=\textbackgroundparameter\c!backgroundcolor,
-           filloffset=\textbackgroundparameter\c!backgroundoffset,
-           gridwidth=\textbackgroundparameter\c!rulethickness,
-           gridshift=\textbackgroundparameter\c!voffset,
-           linewidth=\textbackgroundparameter\c!rulethickness,
-           lineradius=\textbackgroundparameter\c!radius}}%
-   \stoppositionoverlay}
-
-\unexpanded\def\stoptextbackground
-  {\dodostoptextbackground
-   \carryoverpar\egroup}
-
-\unexpanded\def\starttextbackgroundmanual
-  {\begingroup
-   \dousestylehashparameter{\??td\currenttextbackground}\c!style
-   \dousecolorhashparameter{\??td\currenttextbackground}\c!color
-   \fpos\currentparbackground\ignorespaces}
-
-\unexpanded\def\stoptextbackgroundmanual
-  {\tpos\currentparbackground
-   \endgroup}
-
-\def\dostarttextbackgroundtxt
-  {\ifvmode \dontleavehmode \fi
-   \begingroup
-   \dousestylehashparameter{\??td\currenttextbackground}\c!style
-   \dousecolorhashparameter{\??td\currenttextbackground}\c!color
-   \fpos\currentparbackground\ignorespaces}
-
-\def\dostoptextbackgroundtxt
-  {\tpos\currentparbackground
-   \endgroup}
-
-\newskip\textbackgroundskip
-
-\def\dostarttextbackgroundpar
-  {\endgraf % new
-   \textbackgroundparameter\c!before
-   \bgroup
-\begingroup
-\resetallattributes % \attribute\linenumberattribute \attributeunsetvalue
-   \noindent
-   \ifgridsnapping
-     \doassignsomeskip\textbackgroundparameter\c!topoffset\to\textbackgroundskip
-     \ifdim\textbackgroundskip>\zeropoint
-       \struttedbox{\hbox{\raise\textbackgroundskip\hbox{\fpos\currentparbackground}}}%
-     \else
-      \fpos\currentparbackground
-     \fi
-   \else
-     \fpos\currentparbackground
-   \fi
-   \endgraf % we need a vertical nobreak - 29/06/2004
-\endgroup
-   \nobreak \vskip-\lineheight \nobreak
-   \ifgridsnapping \else
-     \doassignsomeskip\textbackgroundparameter\c!topoffset\to\textbackgroundskip
-     \ifdim\textbackgroundskip>\zeropoint
-        \kern\textbackgroundskip\nobreak
-     \fi
-   \fi
-   \dosetleftskipadaption{\textbackgroundparameter\c!leftoffset}%
-   \advance\leftskip\leftskipadaption
-   \dosetleftskipadaption{\textbackgroundparameter\c!rightoffset}%
-   \advance\rightskip\leftskipadaption
-   % new
-   \dosetraggedcommand{\textbackgroundparameter\c!align}%
-   \raggedcommand
-   %
-  %\begingroup
-   \dousestylehashparameter{\??td\currenttextbackground}\c!style
-   \dousecolorhashparameter{\??td\currenttextbackground}\c!color
-   \nowhitespace
-   \nobreak % new per 23/04/2006 (else potential break when whitespace)
-   \seteffectivehsize
-   \doinhibitblank %   \blank[\v!disable]% new
-   \par}
-
-\def\dostoptextbackgroundpar
-  {\par
-   \removelastskip % new
-  %\endgroup
-   \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip
-   \ifdim\lastskip>\zeropoint
-     \advance\textbackgroundskip-\lastskip
-   \fi
-   \ifgridsnapping \else \ifdim\textbackgroundskip>\zeropoint
-     \kern\textbackgroundskip\nobreak
-   \fi \fi
-   \nobreak \vskip-\dimexpr\lineheight+\parskip\relax \nobreak
-%    \nobreak \vskip-\lineheight \nobreak \nowhitespace % does not work
-   \egroup
-   \bgroup \forgeteverypar % NOT REALLY NEEDED, SAVES HASH/MEM
-\resetallattributes % \attribute\linenumberattribute \attributeunsetvalue
-   \nobreak \noindent \strut \hfill \kern\zeropoint
-   \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip
-   \ifgridsnapping % experimental, pascal (todo: topoffset in same way)
-     \ifdim\textbackgroundskip>\zeropoint
-       \struttedbox\plusone{\hbox{\lower\textbackgroundskip\hbox{\tpos\currentparbackground}}}%
-     \else
-       \tpos\currentparbackground
-     \fi
-   \else
-     \tpos\currentparbackground
-   \fi
-\endgraf
-   \egroup
-   \endgraf % new
-   \textbackgroundparameter\c!after}
-
-\let\textparpages \!!zeropoint
-\let\textparheight\!!zeropoint
-\let\textparwidth \!!zeropoint
-
-\def\calculatetextpardimensions
-  {\docalculatetextpardimensions\btbanchor\etbanchor\MPparanchor}
-
-\def\calculatenexttextpardimensions
-  {\docalculatetextpardimensions\nextbtbanchor\nextetbanchor\relax}
-
-\def\docalculatetextpardimensions#1#2#3% #1=\btbanchor #2=\etbanchor (adapted 8/6/2009)
-  {\scratchcounter\numexpr\MPp#2-\MPp#1\relax
-   \edef\textparpages
-     {\the\scratchcounter}%
-   \edef\textparheight
-     {\the\dimexpr
-        \ifcase\scratchcounter
-          % one page
-          \MPy#1-\MPy#2%
-        \else
-          % two or more pages
-          \ifnum\scratchcounter>2
-            \ifnum\scratchcounter<5
-              % more pages
-              \textheight*\numexpr\scratchcounter+\minusone
-            \else
-              % keep'm small
-              5\textheight
-            \fi
-          \else
-            \MPy#1-\MPy#2-\MPy\textanchor+\MPy\textanchor+\MPh\textanchor
-          \fi
-        \fi
-      \relax}%
-   \edef\textparwidth
-     {\the\dimexpr
-        \ifcase\scratchcounter
-          % one page
-          \MPx#2-\MPx#1%
-        \else
-          % two or more pages / maybe also hang
-          \ifx#3\relax
-            \makeupwidth % \textwidth
-          \else
-            \MPw\MPparanchor-\MPl\MPparanchor-\MPr\MPparanchor
-          \fi
-        \fi
-      \relax}}
-
-\def\mintextparheight{4\lineheight}
-
-\def\dontsplitnexttextbackground % dangerous but useful
-  {\ifdim\pagetotal>\textheight \else
-     \ifdim\pagegoal=\maxdimen \else
-      \calculatenexttextpardimensions
-      % too tricky
-      % \scratchdimen=\textparheight
-      % \advance\scratchdimen\pagetotal\relax
-      % \ifdim\scratchdimen>\pagegoal
-      % \page
-      % \fi
-      \ifdim\textparheight>\zeropoint
-        \ifdim\textparheight>\mintextparheight\else
-          \page % option
-        \fi
-      \fi
-    \fi
-   \fi}
-
-\unexpanded\def\definetextbackground
-  {\dodoubleempty\dodefinetextbackground}
-
-\def\dodefinetextbackground[#1][#2]% parent and ..parameter
-  {\ifsecondargument % why ?
-     \copyparameters[\??td#1][\??td]
-       [\c!state,\c!location,\c!alternative,\c!mp,\c!method,
-        \c!background,\c!backgroundcolor,\c!corner,\c!level,
-        \c!backgroundoffset,\c!before,\c!after,\c!align,dash, % dash not yet internationalized
-        \c!radius,\c!frame,\c!framecolor,\c!rulethickness,\c!voffset,\c!frameoffset,
-        \c!leftoffset,\c!rightoffset,\c!topoffset,\c!bottomoffset]%
-     \getparameters[\??td#1][#2]%
-     \doifvalue{\??td#1\c!state}\v!start\checktextbackgrounds
-     \setuvalue{#1}{\groupedcommand{\starttextbackground[#1]}{\stoptextbackground}}%
-     \setuvalue{\e!start#1}{\starttextbackground[#1]}%
-     \setuvalue{\e!stop #1}{\stoptextbackground}%
-   \fi}
-
-\unexpanded\def\setuptextbackground
-  {\dodoubleargument\dosetuptextbackground}
-
-\def\dosetuptextbackground[#1][#2]%
-  {\ifsecondargument
-     \doifelsenothing{#1}
-       {\dodosetuptextbackground{#2}\empty}
-       {\processcommalist[#1]{\dodosetuptextbackground{#2}}}%
-   \else
-     \dodosetuptextbackground{#1}\empty
-   \fi}
-
-\def\dodosetuptextbackground#1#2%
-  {\getparameters[\??td#2][#1]%
-   \def\currenttextbackground{#2}%
-   \doifvalue{\??td#2\c!state}\v!start\checktextbackgrounds}
-
-\let\currenttextbackground\empty
-
-\def\checktextbackgrounds
-  {\ifproductionrun
-     \enabletextarearegistration
-     \enablehiddenbackground
-   \fi}
-
-\setuptextbackground
-  [\c!mp=mpos:par:columnset,      % buggy: mpos:par:shape
-   \c!method=mpos:par:columnset, %
-   \c!state=\v!start,
-   \c!location=\v!text,
-   \c!leftoffset=\!!zeropoint, % 1em,
-   \c!rightoffset=\textbackgroundparameter\c!leftoffset,
-   \c!topoffset=\!!zeropoint,  % \v!medium,
-   \c!bottomoffset=\textbackgroundparameter\c!topoffset,
-   \c!level=-1,
-   \c!alternative=0,
-   \c!align=,
-   dash=0, % to be internationalized
-   \c!background=\v!color,
-   \c!backgroundcolor=lightgray,
-   \c!backgroundoffset=\!!zeropoint,
-   \c!corner=\v!rectangular,
-   \c!radius=.5\bodyfontsize,
-   \c!voffset=\!!zeropoint,
-   \c!frame=\v!on,
-   \c!framecolor=blue,
-   \c!rulethickness=\linewidth]
-
-%D As an example we define a grid background:
-
-\definetextbackground
-  [\v!grid]
-  [\c!state=\v!stop,
-   \c!location=\v!paragraph,
-   \c!frame=\v!off,
-   \c!framecolor=red,
-   \c!background=,
-   \c!alternative=1]
-
-\ifx\basegrid\undefined \else \letvalue\v!grid=\basegrid \fi
-
-\setupMPvariables
-  [mpos:connect]
-  [linecolor=red,
-   linewidth=1pt]
-
-\setupMPvariables
-  [mpos:encircle]
-  [fillcolor=lightgray,
-   filloffset=\!!zeropoint,
-   linecolor=blue,
-   linewidth=1pt]
-
-% these might become macros in mp-page
-
-\startuseMPgraphic{mpos:common:ec}
-  path pa ; pair ca ; numeric lw ;
-  lw := \MPvar{linewidth} ;
-  initialize_box(\MPpos{\MPvar{self}}) ;
-  pa := pxy ; ca := cxy ; pa := boundingbox pa enlarged 2lw ;
-  pa := llcorner pa ... lrcorner pa ... urcorner pa ... ulcorner pa ... cycle ;
-  drawoptions (withpen pencircle scaled lw withcolor \MPvar{linecolor}) ;
-\stopuseMPgraphic
-
-\startMPpositiongraphic{mpos:encircle}{linecolor,fillcolor,linewidth}
-  \includeMPgraphic{mpos:common:ec}
-  fill pa withcolor \MPvar{fillcolor} ; draw pa ;
-  anchor_box(\MPanchor{\MPvar{self}}) ;
-\stopMPpositiongraphic
-
-\startMPpositiongraphic{mpos:connect}{linecolor,linewidth}
-  path pb, pc ; pair cb, cc ;
-  \includeMPgraphic{mpos:common:ec}
-  initialize_box(\MPpos{\MPvar{to}}) ;
-  pb := pxy ; cb := cxy ; pb := boundingbox pb enlarged 2lw ;
-  pb := llcorner pb...lrcorner pb...urcorner pb...ulcorner pb...cycle ;
-  pc := ca {up} .. {down} cb ;
-  cc := (pc intersection_point pa) ;
-  if intersection_found :
-    pc := pc cutbefore cc ;
-    cc := (pc intersection_point pb) ;
-    if intersection_found :
-      pc := pc cutafter cc ;
-      drawarrow pc ; drawarrow reverse pc ;
-    fi ;
-  fi ;
-  anchor_box(\MPanchor{\MPvar{self}}) ;
-\stopMPpositiongraphic
 
 %D \macros
 %D   {stackposdown, stackposup, stackposleft,stackposright}
@@ -1072,382 +562,4 @@
 \unexpanded\def\stackposleft {\dostackposbox{\copy\nextbox\hskip\nextboxwd\hskip\stackposdistance}}
 \unexpanded\def\stackposright{\dostackposbox{\hskip\stackposdistance\hskip\nextboxwd\flushnextbox}}
 
-%D \macros
-%D   {GFC, GTC, GSC}
-%D
-%D The next macros extend tables and tabulation with
-%D backgrounds and position related features. Areas are
-%D specified with symbolic names, and symbolic references to
-%D the graphics involved. Each table has its own namespace.
-
-\newconditional\tablehaspositions
-\newcount\noftabpositions
-\newtoks \posXCtoks
-
-\def\dotablebpos{\bpos}
-\def\dotableepos{\epos}
-
-\def\tbPOSprefix
-  {tbp:\number\noftabpositions:}
-
-\def\tablepos
-  {\normalexpanded{\global\posXCtoks\emptytoks\the\posXCtoks}}
-
-\let\tabulatepos\tablepos
-
-\def\dodododoGSC[#1:#2]%
-  {\remappositionframed{#2}{\tbPOSprefix#1}%
-   \dotablebpos{\tbPOSprefix#1}%
-   \doglobal\appendtoks\@EA\dotableepos\@EA{\tbPOSprefix#1}\to\posXCtoks}
-
-\def\dododoGSC[#1:#2:#3]%
-  {\doglobal\appendtoks\dodododoGSC[#1:#2]\to\posXCtoks\NC}
-
-\def\dodoGSC[#1]%
-  {\def\docommand##1{\dododoGSC[##1:##1]}%
-   \processcommalist[#1]\docommand}
-
-\def\dodododoGFC[#1:#2:#3]%
-  {\remappositionframed{#2}{\tbPOSprefix#1}%
-   \dotablebpos{\tbPOSprefix#1}}
-
-\def\dododoGFC[#1]%
-  {\def\docommand##1{\dodododoGFC[##1:##1]}%
-   \processcommalist[#1]\docommand}
-
-\def\dodoGFC[#1]%
-  {\doglobal\appendtoks\dododoGFC[#1]\to\posXCtoks\NC}
-
-\def\dododododoGTC[#1:#2]%
-  {\dotableepos{\tbPOSprefix#1}}
-
-\def\dodododoGTC[#1]%
-  {\def\docommand##1{\dododododoGTC[##1:##1]}%
-   \processcommalist[#1]\docommand}
-
-\def\dododoGTC[#1]%
-  {\doglobal\appendtoks\dodododoGTC[#1]\to\posXCtoks}
-
-\def\dodoGTC[#1]%
-  {\doglobal\appendtoks\dododoGTC[#1]\to\posXCtoks\NC}
-
-\def\dodododoXC[#1#2]%
-  {\if#1>\dodoGFC  [#2:#2]\else
-   \if#1+\dodoGFC  [#2:#2]\else
-   \if#1<\dodoGTC  [#2:#2]\else
-   \if#1-\dodoGTC  [#2:#2]\else
-   \if#1=\dodoGSC  [#2:#2]\else
-         \dodoGSC[#1#2:#1#2]\fi\fi\fi\fi\fi}
-
-\def\dododoXC#1%
-  {\dodododoXC[#1]}
-
-\def\dodoXC[#1]%
-  {{\let\NC\relax\processcommalist[#1]\dododoXC}}
-
-\def\@@checktablepositionstate
-  {\iftrialtypesetting
-     \global\settrue\tablehaspositions
-     \firstargumentfalse
-   \fi}
-
-\def\doGSC[#1]{\@@checktablepositionstate\iffirstargument\dodoGSC[#1]\else\expandafter\NC\fi}
-\def\doGFC[#1]{\@@checktablepositionstate\iffirstargument\dodoGFC[#1]\else\expandafter\NC\fi}
-\def\doGTC[#1]{\@@checktablepositionstate\iffirstargument\dodoGTC[#1]\else\expandafter\NC\fi}
-\def\doXC [#1]{\@@checktablepositionstate\iffirstargument\dodoXC [#1]\else\expandafter\fi\NC}
-
-\def\tbGSC{\dosingleempty\doGSC}
-\def\tbGFC{\dosingleempty\doGFC}
-\def\tbGTC{\dosingleempty\doGTC}
-\def\tbXC {\dosingleempty\doXC }
-
-%D The amount of code to support tables and tabulation is
-%D rather minimalistic.
-
-\let\tabulatepos\tablepos
-
-\def\tabulatenormalpos
-  {\iftrialtypesetting
-     % nothing
-   \else\ifconditional\tablehaspositions
-     \hss\tabulatepos\hss
-   \else
-     % nothing
-   \fi\fi}
-
-\def\tabulateequalpos
-  {\iftrialtypesetting
-     \tabulateEQ
-   \else\ifconditional\tablehaspositions
-     \tabulateEQpos
-   \else
-     \tabulateEQ
-   \fi\fi}
-
-\def\tabulateEQpos
-  {\setbox\scratchbox\hbox{\tabulateEQ}%
-   \hbox to \wd\scratchbox{\hss\kern\zeropoint\tabulatepos\hss}%
-   \hskip-\wd\scratchbox
-   \box\scratchbox}
-
-\appendtoks
-    \global\advance\noftabpositions\plusone
-    \global\setfalse\tablehaspositions
-\to \everytabulate
-
-% We need to handle paragraphs as well.
-
-\let\doflushtabulateepos\relax
-
-\def\dotabulatebpos
-  {\bpos}
-
-\def\dotabulateepos#1%
-  {\ifvoid\tablebox\tabulatecolumn
-     \epos{#1}%
-     \glet\doflushtabulateepos\relax
-   \else
-     \gdef\doflushtabulateepos{\epos{#1}}%
-   \fi}
-
-\def\flushtabulatesplitbox
-  {\box\tabulatebox
-   \iftrialtypesetting\else\ifconditional\tablehaspositions\doflushtabulateepos\fi\fi}
-
-\appendtoks
-    \let\dotablebpos\dotabulatebpos
-    \let\dotableepos\dotabulateepos
-    \glet\doflushtabulateepos\relax
-\to \everytabulate
-
-%D In order to prevent potential clashes with abbreviations,
-%D postpone the mapping.
-
-\appendtoks
-    \let\GSC\tbGSC
-    \let\GFC\tbGFC
-    \let\GTC\tbGTC
-    \let\XC \tbXC
-\to \everytabulate
-
-%D \macros
-%D   {definepositionframed}
-%D
-%D The next example show how to provide backgrounds to table
-%D cells. First we define some framed backgrounds.
-%D
-%D \startbuffer
-%D \definepositionframed[x][background=color,backgroundcolor=red]
-%D \definepositionframed[y][background=color,backgroundcolor=green]
-%D \definepositionframed[z][background=color,backgroundcolor=blue]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D % \getbuffer
-%D
-%D \startbuffer
-%D \starttabulate[|c|c|c|]
-%D \GFC[f:x] this is a small  \NC       table            \NC     in which we \NC \FR
-%D \NC       will demonstrate \GFC[g:z] that this        \GTC[g] positioning \NC \MR
-%D \GSC[e:y] mechanism also   \GTC[f]   works quite well \NC     in tables   \NC \LR
-%D \stoptabulate
-%D \stopbuffer
-%D
-%D The table itself defines three areas (a, b and~c) using
-%D these frames.
-%D
-%D \typebuffer
-%D % \getbuffer
-%D
-%D Tables (based on \TABLE) are supported by:
-
-\def\normalTABLEsimplebar {\unskip\!ttRightGlue&\tablepos&}                       % |
-\def\normalTABLEcomplexbar{\unskip\!ttRightGlue&\omit\tablepos\!ttAlternateVrule} % \|
-\def\normalTABLEquote     {\unskip\!ttRightGlue&\omit\tablepos&}                  % "
-
-\appendtoks
-    \global\advance\noftabpositions\plusone
-    \global\setfalse\tablehaspositions
-\to \everytable
-
-%D Since we don't want nameclashes:
-
-\appendtoks
-    \let\GSC\tbGSC
-    \let\GFC\tbGFC
-    \let\GTC\tbGTC
-    \let\XC \tbXC
-\to \everytable
-
-%D In the previous example, we could have provided an overlay to
-%D the framed definition. A more direct approach is demonstrated
-%D below:
-%D
-%D \startbuffer
-%D \def\cw#1{\color[white]{#1}}
-%D
-%D \startMPpositiongraphic{tableshade}
-%D   initialize_area(\MPpos{\MPvar{from}},\MPpos{\MPvar{to}}) ;
-%D   color c ; c := \MPvar{color} ;
-%D   linear_shade(pxy,0,.4c,.9c) ;
-%D   anchor_area(\MPanchor{\MPvar{from}}) ;
-%D \stopMPpositiongraphic
-%D
-%D \setMPpositiongraphic{b:x}{tableshade}{from=b:x,to=e:x,color=red}
-%D \setMPpositiongraphic{b:y}{tableshade}{from=b:y,to=e:y,color=green}
-%D \setMPpositiongraphic{b:z}{tableshade}{from=b:z,to=e:z,color=blue}
-%D \stopbuffer
-%D
-%D \typebuffer \getbuffer
-%D
-%D The definition of the table looks about the same as the
-%D previous one:
-%D
-%D \startbuffer
-%D \starttable[|c|c|c|]
-%D \GFC[b:z] \cw{this is a small}  \NC       \cw{table}            \NC     in which we      \NC \FR
-%D \NC       \cw{will demonstrate} \GFC[c:y] \cw{that this}        \GTC[c] \cw{positioning} \NC \MR
-%D \GSC[a:x] \cw{mechanism also}   \GTC[b]   \cw{works quite well} \NC     in tables        \NC \LR
-%D \stoptable
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D \getbuffer
-
-% \definepositionframed[w][background=color,backgroundcolor=yellow]
-% \definepositionframed[x][background=color,backgroundcolor=red]
-% \definepositionframed[y][background=color,backgroundcolor=green]
-% \definepositionframed[z][background=color,backgroundcolor=blue]
-%
-% \starttabulate[|c|c|c|]
-% \NC this is a small  \NC table            \NC in which we \NC \FR
-% \NC will demonstrate \NC that this        \NC positioning \NC \MR
-% \NC mechanism also   \NC works quite well \NC in tables   \NC \LR
-% \stoptabulate
-%
-% \starttabulate[|c|c|c|]
-% \GFC[f:x] this is a small      \GTC      table            \NC     in which we \NC \FR
-% \NC       will demonstrate     \GFC[g:z] that this        \GTC[g] positioning \NC \MR
-% \GSC[e:y] mechanism also       \GTC[f]   works quite well \NC     in tables   \NC \LR
-% \stoptabulate
-%
-% \starttabulate[|c|c|c|]
-% \GFC[f:x,d:w] this is a small  \GTC[d]   table            \NC     in which we \NC \FR
-% \NC           will demonstrate \GFC[g:z] that this        \GTC[g] positioning \NC \MR
-% \GSC[e:y]     mechanism also   \GTC[f]   works quite well \NC     in tables   \NC \LR
-% \stoptabulate
-%
-% \starttabulate[|c|c|c|]
-% \XC[+f:x] this is a small  \XC      table            \NC     in which we \NC \FR
-% \NC      will demonstrate  \XC[+g:z] that this       \XC[-g] positioning \NC \MR
-% \XC[=e:y] mechanism also   \XC[-f]  works quite well \NC     in tables   \NC \LR
-% \stoptabulate
-%
-% \starttabulate[|c|c|c|]
-% \XC[+f:x,+d:w] this is a small  \XC[-d]   table            \NC     in which we \NC \FR
-% \NC            will demonstrate \XC[+g:z] that this        \XC[-g] positioning \NC \MR
-% \XC[=e:y]       mechanism also  \XC[-f]   works quite well \NC     in tables   \NC \LR
-% \stoptabulate
-
-% evt                  [b:x]
-%
-% \definepositionframed[x][background=color,fillcolor=red]
-% \definepositionframed[y][background=color,fillcolor=green]
-% \definepositionframed[z][background=color,fillcolor=blue]
-
-\def\remappositionframed#1#2% from to
-  {\copyposition{b:#1}{b:#2}%
-   \copyposition{e:#1}{e:#2}%
-   \dosetpositionaction{b:#2}{\dopositionaction{b:#1}}}
-
-\unexpanded\def\definepositionframed
-  {\dodoubleargument\dodefinepositionframed}
-
-\def\dodefinepositionframed[#1][#2]%
-  {\dosetpositionaction{b:#1}{\dopositionframed[#1][#2]}}
-
-\def\positionframed
-  {\dodoubleempty\dopositionframed}
-
-\def\dopositionframed[#1][#2]%
-  {\bgroup
-   \setbox\scratchbox\hbox
-     {\dimen0=\MPx{e:#1}%
-      \advance\dimen0 -\MPx{b:#1}%
-      \dimen2=\MPy{b:#1}%
-      \advance\dimen2 -\MPy{e:#1}%
-      \advance\dimen2 \MPd{e:#1}%
-      \lower\dimen2\hbox
-        {\advance\dimen2 \MPh{b:#1}%
-         \framed
-           [\c!width=\dimen0,\c!height=\dimen2,
-            \c!offset=\v!overlay,#2]{}}}%
-   \smashedbox\scratchbox
-   \egroup}
-
-% \def\sethdistances#1%
-%   {\hbox{\lpos{ml:#1}\hpos{mh:#1}{\strut}\rpos{mr:#1}}}
-%
-% \def\gethdistances#1%
-%   {\scratchdimen\MPx{mh:#1}%
-%    \advance\scratchdimen -\MPx{ml#1}%
-%    \edef\lefthdistance{\the\scratchdimen}%
-%    \scratchdimen\MPx{mr:#1}%
-%    \advance\scratchdimen -\MPx{mh:#1}%
-%    \edef\righthdistance{\the\scratchdimen}}
-
 \protect \endinput
-
-% todo 1: shift down option
-
-% \startuseMPgraphic{mpos:par:columnset}
-%   \iftracepositions show_multi_pars \else draw_multi_pars \fi ;
-%   path p ; p := boundingbox currentpicture ;
-%   currentpicture := currentpicture shifted (0,-StrutDepth/2) ;
-%   setbounds currentpicture to p ;
-% \stopuseMPgraphic
-
-\definetextbackground[underline]    [location=text,alternative=1,background=,frame=off]
-\definetextbackground[overstrike]   [location=text,alternative=2,background=,frame=off]
-\definetextbackground[exlines]      [location=text,alternative=3,background=,frame=off]
-\definetextbackground[strikethrough][location=text,alternative=4,background=,frame=off]
-
-\definestartstop [underline]
-  [before={\starttextbackground[underline]},
-   after=\stoptextbackground]
-
-\definestartstop
-  [overstrike]
-  [before={\starttextbackground[overstrike]},
-   after=\stoptextbackground]
-
-\definestartstop
-  [exlines]
-  [before={\starttextbackground[exlines]},
-   after=\stoptextbackground]
-
-\definestartstop
-  [strikethrough]
-  [before={\starttextbackground[strikethrough]},
-   after=\stoptextbackground]
-
-\definetextbackground
-  [sideline]
-  [mp=mpos:par:sideline,
-   location=paragraph,
-   framecolor=red,
-   frameoffset=5mm]
-
-\definestartstop [sideline]
-  [before={\starttextbackground[sideline]},
-   after=\stoptextbackground]
-
-\starttext
-    \startunderline     \input tufte \stopunderline      \blank
-    \startoverstrike    \input tufte \stopoverstrike     \blank
-    \startexlines       \input tufte \stopexlines        \blank
-    \startstrikethrough \input tufte \stopstrikethrough  \blank
-    \startsideline      \input tufte \stopsideline       \blank
-\stoptext
diff --git a/tex/context/base/anch-pos.mkiv b/tex/context/base/anch-pos.mkiv
index da6e25f87..cd664ed40 100644
--- a/tex/context/base/anch-pos.mkiv
+++ b/tex/context/base/anch-pos.mkiv
@@ -208,6 +208,8 @@
 %D position as well as execute an action associated with that
 %D position.
 
+\let\dopositionaction\gobbleoneargument
+
 \def\initializenextposition
   {\ifpositioning \else
      \global\positioningtrue
@@ -322,46 +324,13 @@
 
 \let\currentposition\s!unknown
 
-%D A few more low level macros take care of defining and
-%D recalling actions. We could save this information in the
-%D position containers themselves, this would save hash
-%D entries, but at the cost of much more time consuming
-%D expansion. Actions are saved globally!
-
-\newtoks\everypositionaction
-
-\let\POSactionprefix\POSprefix
-
-\unexpanded\def\dosetpositionaction#1%
-  {\setgvalue{\POSactionprefix#1::}}
-
-%D The lists can become quite long (also because there can
-%D be lots of parameters passed on) so we provide a hook
-%D to clean up the list afterwards.
-
-\let\cleanuppositionaction\gobbleoneargument
-
-\def\doifpositionaction#1%
-  {\ifcsname\POSactionprefix#1::\endcsname
-     \expandafter\firstofoneargument
-   \else
-     \expandafter\gobbleoneargument
-   \fi}
-
-\def\doifpositionactionelse#1%
-  {\ifcsname\POSactionprefix#1::\endcsname
-     \expandafter\firstoftwoarguments
-   \else
-     \expandafter\secondoftwoarguments
-   \fi}
-
 %D We can copy a position with:
 %D
 %D \starttyping
 %D \copyposition {to} {from}
 %D \stoptyping
 %D
-%D Again, this is a global action.
+%D Again, this is a global operation.
 
 \def\copyposition#1#2{\ctxcommand{copyposition('#1','#2')}}
 
diff --git a/tex/context/base/anch-snc.mkiv b/tex/context/base/anch-snc.mkiv
index 4940ff274..32222bb50 100644
--- a/tex/context/base/anch-snc.mkiv
+++ b/tex/context/base/anch-snc.mkiv
@@ -24,6 +24,8 @@
 
 \unexpanded\def\definesyncpositions[#1]%
   {\global\let\flushsyncpositions\doflushsyncpositions % only when used
+   \global\let\flushsyncresets   \doflushsyncresets
+   \global\let\flushsyncpresets  \doflushsyncpresets
    \setcounter{\s!num:\s!syncpos:#1}{0}%
    \doglobal\appendtoksonce\csname\s!reset :\s!syncpos:#1\endcsname\to\resetsyncpositions
    \doglobal\appendtoksonce\csname\s!preset:\s!syncpos:#1\endcsname\to\presetsyncpositions
@@ -130,15 +132,21 @@
    \endgroup}
 
 \def\flushsyncxxsets#1%
-  {\setbox\scratchbox\hbox{\the#1}%
+  {\begingroup
+   \setbox\scratchbox\hbox{\the#1}%
    \ifvoid\scratchbox\else
-     \prewordbreak \let\prewordbreak\relax % only once
+     \prewordbreak
+    %\let\prewordbreak\relax % only once
      \smashbox\scratchbox
      \box\scratchbox
-   \fi}
+   \fi
+   \endgroup}
+
+\let\flushsyncresets \relax
+\let\flushsyncpresets\relax
 
-\def\flushsyncresets {\flushsyncxxsets\resetsyncpositions }
-\def\flushsyncpresets{\flushsyncxxsets\presetsyncpositions}
+\def\doflushsyncresets {\flushsyncxxsets\resetsyncpositions }
+\def\doflushsyncpresets{\flushsyncxxsets\presetsyncpositions}
 
 % \appendtoks \flushsyncpositions \to \everypar
 % \appendtoks \flushsyncpositions \to \everyheadstart
diff --git a/tex/context/base/anch-tab.mkiv b/tex/context/base/anch-tab.mkiv
new file mode 100644
index 000000000..137b96889
--- /dev/null
+++ b/tex/context/base/anch-tab.mkiv
@@ -0,0 +1,347 @@
+%D \module
+%D   [       file=anch-pgr, % moved from anch-pgr (1999.08.01)
+%D        version=2011.12.19, % 1999.08.01,
+%D          title=\CONTEXT\ Anchoring Macros,
+%D       subtitle=Table Extensions,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Anchoring Macros / Table Extensions}
+
+%D Beware, the code in this module is somewhat weird and experimental
+%D and might be dropped or become a loadable module.
+
+\unprotect
+
+%D \macros
+%D   {GFC, GTC, GSC}
+%D
+%D The next macros extend tables and tabulation with
+%D backgrounds and position related features. Areas are
+%D specified with symbolic names, and symbolic references to
+%D the graphics involved. Each table has its own namespace.
+
+\newconditional\tablehaspositions
+\newcount\noftabpositions
+\newtoks \posXCtoks
+
+\def\dotablebpos{\bpos}
+\def\dotableepos{\epos}
+
+\def\tbPOSprefix
+  {tbp:\number\noftabpositions:}
+
+\def\tablepos
+  {\normalexpanded{\global\posXCtoks\emptytoks\the\posXCtoks}}
+
+\let\tabulatepos\tablepos
+
+\def\dodododoGSC[#1:#2]%
+  {\remappositionframed{#2}{\tbPOSprefix#1}%
+   \dotablebpos{\tbPOSprefix#1}%
+   \doglobal\appendtoks\@EA\dotableepos\@EA{\tbPOSprefix#1}\to\posXCtoks}
+
+\def\dododoGSC[#1:#2:#3]%
+  {\doglobal\appendtoks\dodododoGSC[#1:#2]\to\posXCtoks\NC}
+
+\def\dodoGSC[#1]%
+  {\def\docommand##1{\dododoGSC[##1:##1]}%
+   \processcommalist[#1]\docommand}
+
+\def\dodododoGFC[#1:#2:#3]%
+  {\remappositionframed{#2}{\tbPOSprefix#1}%
+   \dotablebpos{\tbPOSprefix#1}}
+
+\def\dododoGFC[#1]%
+  {\def\docommand##1{\dodododoGFC[##1:##1]}%
+   \processcommalist[#1]\docommand}
+
+\def\dodoGFC[#1]%
+  {\doglobal\appendtoks\dododoGFC[#1]\to\posXCtoks\NC}
+
+\def\dododododoGTC[#1:#2]%
+  {\dotableepos{\tbPOSprefix#1}}
+
+\def\dodododoGTC[#1]%
+  {\def\docommand##1{\dododododoGTC[##1:##1]}%
+   \processcommalist[#1]\docommand}
+
+\def\dododoGTC[#1]%
+  {\doglobal\appendtoks\dodododoGTC[#1]\to\posXCtoks}
+
+\def\dodoGTC[#1]%
+  {\doglobal\appendtoks\dododoGTC[#1]\to\posXCtoks\NC}
+
+\def\dodododoXC[#1#2]%
+  {\if#1>\dodoGFC  [#2:#2]\else
+   \if#1+\dodoGFC  [#2:#2]\else
+   \if#1<\dodoGTC  [#2:#2]\else
+   \if#1-\dodoGTC  [#2:#2]\else
+   \if#1=\dodoGSC  [#2:#2]\else
+         \dodoGSC[#1#2:#1#2]\fi\fi\fi\fi\fi}
+
+\def\dododoXC#1%
+  {\dodododoXC[#1]}
+
+\def\dodoXC[#1]%
+  {{\let\NC\relax\processcommalist[#1]\dododoXC}}
+
+\def\@@checktablepositionstate
+  {\iftrialtypesetting
+     \global\settrue\tablehaspositions
+     \firstargumentfalse
+   \fi}
+
+\def\doGSC[#1]{\@@checktablepositionstate\iffirstargument\dodoGSC[#1]\else\expandafter\NC\fi}
+\def\doGFC[#1]{\@@checktablepositionstate\iffirstargument\dodoGFC[#1]\else\expandafter\NC\fi}
+\def\doGTC[#1]{\@@checktablepositionstate\iffirstargument\dodoGTC[#1]\else\expandafter\NC\fi}
+\def\doXC [#1]{\@@checktablepositionstate\iffirstargument\dodoXC [#1]\else\expandafter\fi\NC}
+
+\def\tbGSC{\dosingleempty\doGSC}
+\def\tbGFC{\dosingleempty\doGFC}
+\def\tbGTC{\dosingleempty\doGTC}
+\def\tbXC {\dosingleempty\doXC }
+
+%D The amount of code to support tables and tabulation is
+%D rather minimalistic.
+
+\let\tabulatepos\tablepos
+
+\def\tabulatenormalpos
+  {\iftrialtypesetting
+     % nothing
+   \else\ifconditional\tablehaspositions
+     \hss\tabulatepos\hss
+   \else
+     % nothing
+   \fi\fi}
+
+\def\tabulateequalpos
+  {\iftrialtypesetting
+     \tabulateEQ
+   \else\ifconditional\tablehaspositions
+     \tabulateEQpos
+   \else
+     \tabulateEQ
+   \fi\fi}
+
+\def\tabulateEQpos
+  {\setbox\scratchbox\hbox{\tabulateEQ}%
+   \hbox to \wd\scratchbox{\hss\kern\zeropoint\tabulatepos\hss}%
+   \hskip-\wd\scratchbox
+   \box\scratchbox}
+
+\appendtoks
+    \global\advance\noftabpositions\plusone
+    \global\setfalse\tablehaspositions
+\to \everytabulate
+
+% We need to handle paragraphs as well.
+
+\let\doflushtabulateepos\relax
+
+\def\dotabulatebpos
+  {\bpos}
+
+\def\dotabulateepos#1%
+  {\ifvoid\tablebox\tabulatecolumn
+     \epos{#1}%
+     \glet\doflushtabulateepos\relax
+   \else
+     \gdef\doflushtabulateepos{\epos{#1}}%
+   \fi}
+
+\def\flushtabulatesplitbox
+  {\box\tabulatebox
+   \iftrialtypesetting\else\ifconditional\tablehaspositions\doflushtabulateepos\fi\fi}
+
+\appendtoks
+    \let\dotablebpos\dotabulatebpos
+    \let\dotableepos\dotabulateepos
+    \glet\doflushtabulateepos\relax
+\to \everytabulate
+
+%D In order to prevent potential clashes with abbreviations,
+%D postpone the mapping.
+
+\appendtoks
+    \let\GSC\tbGSC
+    \let\GFC\tbGFC
+    \let\GTC\tbGTC
+    \let\XC \tbXC
+\to \everytabulate
+
+%D \macros
+%D   {definepositionframed}
+%D
+%D The next example show how to provide backgrounds to table
+%D cells. First we define some framed backgrounds.
+%D
+%D \startbuffer
+%D \definepositionframed[x][background=color,backgroundcolor=red]
+%D \definepositionframed[y][background=color,backgroundcolor=green]
+%D \definepositionframed[z][background=color,backgroundcolor=blue]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D % \getbuffer
+%D
+%D \startbuffer
+%D \starttabulate[|c|c|c|]
+%D \GFC[f:x] this is a small  \NC       table            \NC     in which we \NC \FR
+%D \NC       will demonstrate \GFC[g:z] that this        \GTC[g] positioning \NC \MR
+%D \GSC[e:y] mechanism also   \GTC[f]   works quite well \NC     in tables   \NC \LR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D The table itself defines three areas (a, b and~c) using
+%D these frames.
+%D
+%D \typebuffer
+%D % \getbuffer
+%D
+%D Tables (based on \TABLE) are supported by:
+
+\def\normalTABLEsimplebar {\unskip\!ttRightGlue&\tablepos&}                       % |
+\def\normalTABLEcomplexbar{\unskip\!ttRightGlue&\omit\tablepos\!ttAlternateVrule} % \|
+\def\normalTABLEquote     {\unskip\!ttRightGlue&\omit\tablepos&}                  % "
+
+\appendtoks
+    \global\advance\noftabpositions\plusone
+    \global\setfalse\tablehaspositions
+\to \everytable
+
+%D Since we don't want nameclashes:
+
+\appendtoks
+    \let\GSC\tbGSC
+    \let\GFC\tbGFC
+    \let\GTC\tbGTC
+    \let\XC \tbXC
+\to \everytable
+
+%D In the previous example, we could have provided an overlay to
+%D the framed definition. A more direct approach is demonstrated
+%D below:
+%D
+%D \startbuffer
+%D \def\cw#1{\color[white]{#1}}
+%D
+%D \startMPpositiongraphic{tableshade}
+%D   initialize_area(\MPpos{\MPvar{from}},\MPpos{\MPvar{to}}) ;
+%D   color c ; c := \MPvar{color} ;
+%D   linear_shade(pxy,0,.4c,.9c) ;
+%D   anchor_area(\MPanchor{\MPvar{from}}) ;
+%D \stopMPpositiongraphic
+%D
+%D \setMPpositiongraphic{b:x}{tableshade}{from=b:x,to=e:x,color=red}
+%D \setMPpositiongraphic{b:y}{tableshade}{from=b:y,to=e:y,color=green}
+%D \setMPpositiongraphic{b:z}{tableshade}{from=b:z,to=e:z,color=blue}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D The definition of the table looks about the same as the
+%D previous one:
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \GFC[b:z] \cw{this is a small}  \NC       \cw{table}            \NC     in which we      \NC \FR
+%D \NC       \cw{will demonstrate} \GFC[c:y] \cw{that this}        \GTC[c] \cw{positioning} \NC \MR
+%D \GSC[a:x] \cw{mechanism also}   \GTC[b]   \cw{works quite well} \NC     in tables        \NC \LR
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+% \definepositionframed[w][background=color,backgroundcolor=yellow]
+% \definepositionframed[x][background=color,backgroundcolor=red]
+% \definepositionframed[y][background=color,backgroundcolor=green]
+% \definepositionframed[z][background=color,backgroundcolor=blue]
+%
+% \starttabulate[|c|c|c|]
+% \NC this is a small  \NC table            \NC in which we \NC \FR
+% \NC will demonstrate \NC that this        \NC positioning \NC \MR
+% \NC mechanism also   \NC works quite well \NC in tables   \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \GFC[f:x] this is a small      \GTC      table            \NC     in which we \NC \FR
+% \NC       will demonstrate     \GFC[g:z] that this        \GTC[g] positioning \NC \MR
+% \GSC[e:y] mechanism also       \GTC[f]   works quite well \NC     in tables   \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \GFC[f:x,d:w] this is a small  \GTC[d]   table            \NC     in which we \NC \FR
+% \NC           will demonstrate \GFC[g:z] that this        \GTC[g] positioning \NC \MR
+% \GSC[e:y]     mechanism also   \GTC[f]   works quite well \NC     in tables   \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \XC[+f:x] this is a small  \XC      table            \NC     in which we \NC \FR
+% \NC      will demonstrate  \XC[+g:z] that this       \XC[-g] positioning \NC \MR
+% \XC[=e:y] mechanism also   \XC[-f]  works quite well \NC     in tables   \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \XC[+f:x,+d:w] this is a small  \XC[-d]   table            \NC     in which we \NC \FR
+% \NC            will demonstrate \XC[+g:z] that this        \XC[-g] positioning \NC \MR
+% \XC[=e:y]       mechanism also  \XC[-f]   works quite well \NC     in tables   \NC \LR
+% \stoptabulate
+
+% evt                  [b:x]
+%
+% \definepositionframed[x][background=color,fillcolor=red]
+% \definepositionframed[y][background=color,fillcolor=green]
+% \definepositionframed[z][background=color,fillcolor=blue]
+
+\def\remappositionframed#1#2% from to
+  {\copyposition{b:#1}{b:#2}%
+   \copyposition{e:#1}{e:#2}%
+   \dosetpositionaction{b:#2}{\dopositionaction{b:#1}}}
+
+\unexpanded\def\definepositionframed
+  {\dodoubleargument\dodefinepositionframed}
+
+\def\dodefinepositionframed[#1][#2]%
+  {\dosetpositionaction{b:#1}{\dopositionframed[#1][#2]}}
+
+\def\positionframed
+  {\dodoubleempty\dopositionframed}
+
+\def\dopositionframed[#1][#2]%
+  {\bgroup
+   \setbox\scratchbox\hbox
+     {\dimen0=\MPx{e:#1}%
+      \advance\dimen0 -\MPx{b:#1}%
+      \dimen2=\MPy{b:#1}%
+      \advance\dimen2 -\MPy{e:#1}%
+      \advance\dimen2 \MPd{e:#1}%
+      \lower\dimen2\hbox
+        {\advance\dimen2 \MPh{b:#1}%
+         \framed
+           [\c!width=\dimen0,\c!height=\dimen2,
+            \c!offset=\v!overlay,#2]{}}}%
+   \smashedbox\scratchbox
+   \egroup}
+
+% \def\sethdistances#1%
+%   {\hbox{\lpos{ml:#1}\hpos{mh:#1}{\strut}\rpos{mr:#1}}}
+%
+% \def\gethdistances#1%
+%   {\scratchdimen\MPx{mh:#1}%
+%    \advance\scratchdimen -\MPx{ml#1}%
+%    \edef\lefthdistance{\the\scratchdimen}%
+%    \scratchdimen\MPx{mr:#1}%
+%    \advance\scratchdimen -\MPx{mh:#1}%
+%    \edef\righthdistance{\the\scratchdimen}}
+
+\protect \endinput
diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf
index f98f74e94..3442aa045 100644
Binary files a/tex/context/base/context-version.pdf and b/tex/context/base/context-version.pdf differ
diff --git a/tex/context/base/context-version.png b/tex/context/base/context-version.png
index b2123c564..250cdb7be 100644
Binary files a/tex/context/base/context-version.png and b/tex/context/base/context-version.png differ
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index ee8df8080..082abf664 100644
--- a/tex/context/base/context.mkiv
+++ b/tex/context/base/context.mkiv
@@ -20,7 +20,7 @@
 %D your styles an modules.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2011.12.19 13:06}
+\edef\contextversion{2011.12.19 22:53}
 
 %D For those who want to use this:
 
@@ -368,7 +368,9 @@
 \loadmarkfile{page-plg}
 \loadmarkfile{page-str}
 
-\loadmarkfile{anch-pgr} % overloads tabl-tbl
+\loadmarkfile{anch-pgr} % can be moved up (nicer for dependencies)
+\loadmkvifile{anch-bck}
+\loadmarkfile{anch-tab} % overloads tabl-tbl
 \loadmarkfile{anch-bar}
 \loadmarkfile{anch-snc}
 
diff --git a/tex/context/base/m-educat.tex b/tex/context/base/m-educat.tex
index f5d55fa84..93b1a6c5d 100644
--- a/tex/context/base/m-educat.tex
+++ b/tex/context/base/m-educat.tex
@@ -8,15 +8,15 @@
 %D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
 %C
 %C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 
-%C details. 
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
 
 %D This module will collect a few macros cq.\ definitions
 %D meant for educational use. Most of the code has been laying
 %D around for some time and has been (or is still) used in
-%D \PRAGMA\ projects. 
+%D \PRAGMA\ projects.
 
-\unprotect 
+\unprotect
 
 \definesystemvariable{iv}
 
@@ -28,10 +28,10 @@
   [\c!location=\v!text,
    \c!n=0,
    \c!frame=\v!off,
-   \c!framecolor=answerlinecolor,       
+   \c!framecolor=answerlinecolor,
    \c!rulethickness=2pt,
    \c!background=\v!color,
-   \c!backgroundcolor=answerareacolor, 
+   \c!backgroundcolor=answerareacolor,
    \c!alternative=2] % betweenline
 
 % n=gedwongen
@@ -48,23 +48,23 @@
    \dontcomplain
    \setupanswerarea
      [\c!n=0,\c!m=,#1,\c!location=\v!text]%
-   \doifelsenothing{\backgroundvariable\c!m}
+   \doifelsenothing{\textbackgroundparameter\c!m}
      {\expandafter\donoanswerspace}
      {\expandafter\dodoanswerspace}%
    [#1]}
 
 \def\donoanswerspace[#1]#2%
   {\setupthinrules
-     [\c!alternative=\backgroundvariable\c!alternative,
-      \c!color=\backgroundvariable\c!framecolor,
-      \c!background=\backgroundvariable\c!background,
-      \c!backgroundcolor=\backgroundvariable\c!backgroundcolor,
-      \c!rulethickness=\backgroundvariable\c!rulethickness]%
-   \doifelse{\backgroundvariable\c!n}{*}
+     [\c!alternative=\textbackgroundparameter\c!alternative,
+      \c!color=\textbackgroundparameter\c!framecolor,
+      \c!background=\textbackgroundparameter\c!background,
+      \c!backgroundcolor=\textbackgroundparameter\c!backgroundcolor,
+      \c!rulethickness=\textbackgroundparameter\c!rulethickness]%
+   \doifelse{\textbackgroundparameter\c!n}{*}
      {\thinrule
       \par}
-     {\scratchcounter0\backgroundvariable\c!n\relax
-      % tricky, guess  
+     {\scratchcounter0\textbackgroundparameter\c!n\relax
+      % tricky, guess
       \def\processisolatedword##1%
         {\setbox\scratchbox=\hbox{##1}%
          \vbox{\hsize\wd\scratchbox\thinrule
@@ -74,7 +74,7 @@
            \vbox{\hsize\wd\scratchbox\thinrule}%
          \fi}}%
       \processisolatedwords{#2}\processisolatedword
-      % so far 
+      % so far
       \ifcase\scratchcounter \else \ifnum\scratchcounter<3
         \nobreak \vbox{\hsize\scratchcounter em\thinrule}%
       \else % more
@@ -87,11 +87,11 @@
 \def\dodoanswerspace[#1]#2% m case
   {\getvalue{\e!start\v!answerarea}%
    #2%
-   \doifelse{\backgroundvariable\c!m}{*}
+   \doifelse{\textbackgroundparameter\c!m}{*}
      {\hfill\strut
       \getvalue{\e!stop\v!answerarea}%
       \par}
-     {\scratchcounter0\backgroundvariable\c!m\relax
+     {\scratchcounter0\textbackgroundparameter\c!m\relax
       \ifcase\scratchcounter \else \ifnum\scratchcounter<3
         \nobreak \hbox to \scratchcounter em{\strut\hss}%
       \else % more
@@ -110,43 +110,43 @@
    \dontcomplain
    \setupanswerarea
      [\c!n=0,\c!m=,#1,\c!location=\v!text]%
-   \doifnot{\backgroundvariable\c!option}\v!joinedup\softbreak
-   \doifelsenothing{\backgroundvariable\c!m}
+   \doifnot{\textbackgroundparameter\c!option}\v!joinedup\softbreak
+   \doifelsenothing{\textbackgroundparameter\c!m}
      {\expandafter\donostartanswerlines}
      {\expandafter\dodostartanswerlines}%
    [#1]}
 
 \def\donostartanswerlines[#1]%
   {\setupthinrules
-     [\c!alternative=\backgroundvariable\c!alternative,
-      \c!color=\backgroundvariable\c!framecolor,
-      \c!background=\backgroundvariable\c!background,
-      \c!backgroundcolor=\backgroundvariable\c!backgroundcolor,
-      \c!rulethickness=\backgroundvariable\c!rulethickness]%
-   \thinrules[\c!n=\backgroundvariable\c!n]\par
+     [\c!alternative=\textbackgroundparameter\c!alternative,
+      \c!color=\textbackgroundparameter\c!framecolor,
+      \c!background=\textbackgroundparameter\c!background,
+      \c!backgroundcolor=\textbackgroundparameter\c!backgroundcolor,
+      \c!rulethickness=\textbackgroundparameter\c!rulethickness]%
+   \thinrules[\c!n=\textbackgroundparameter\c!n]\par
    \endgroup
    \grabuntil{\e!stop\e!answerlines}}
 
 \def\dodostartanswerlines[#1]%
-  {\begingroup    
+  {\begingroup
    \getvalue{\e!start\v!answerarea}%
    \ignorespaces}
 
-\setvalue{\e!stop\e!answerlines}% 
-  {\scratchcounter0\backgroundvariable\c!m\relax
-   % a \softbreak is more efficient in pos dan \par 
+\setvalue{\e!stop\e!answerlines}%
+  {\scratchcounter0\textbackgroundparameter\c!m\relax
+   % a \softbreak is more efficient in pos dan \par
    \ifcase\scratchcounter
      % nothing
    \or
-     \softbreak 
+     \softbreak
    \else
-     \softbreak 
+     \softbreak
      \advance \scratchcounter \minusone
      \dorecurse\scratchcounter{\strut\hfill\strut\softbreak}%
    \fi
    \strut\hfill\strut
    \getvalue{\e!stop\v!answerarea}%
-   \par\endgroup\endgroup} 
+   \par\endgroup\endgroup}
 
 \setvalue\e!answerlines
   {\dosingleempty\doanswerlines}
@@ -174,19 +174,19 @@ test test test \answerspace [n=10] {Whow}. test test test
 test tets test test \answerspace [n=10] {Whow}. test test
 test test tets test test \answerspace [n=10] {Whow}. test
 test test test tets test test \answerspace [n=10] {Whow}.
-test test test test test test \answerspace [n=*] {Whow.} 
+test test test test test test \answerspace [n=*] {Whow.}
 
 test test test test test test test \startanswerlines
-[n=3] What A Junk Answer \stopanswerlines 
+[n=3] What A Junk Answer \stopanswerlines
 
 test test test test test test test \startanswerlines
-[n=3,alternative=0] What A Junk Answer \stopanswerlines 
+[n=3,alternative=0] What A Junk Answer \stopanswerlines
 
 test test test test test test test \startanswerlines
-[n=3,alternative=1] What A Junk Answer \stopanswerlines 
+[n=3,alternative=1] What A Junk Answer \stopanswerlines
 
 test test test test test test test \startanswerlines
-[n=3,alternative=2] What A Junk Answer \stopanswerlines 
+[n=3,alternative=2] What A Junk Answer \stopanswerlines
 
 \startitemize[paragraph]
 \item \startanswerlines [option=seried,n=2] xxx \stopanswerlines
@@ -196,20 +196,20 @@ test test test \answerspace [m=10] {Whow}. test test test
 test tets test test \answerspace [m=10] {Whow}. test test
 test test tets test test \answerspace [m=10] {Whow}. test
 test test test tets test test \answerspace [m=10] {Whow}.
-test test test test test test \answerspace [m=*] {Whow.} 
+test test test test test test \answerspace [m=*] {Whow.}
 
 test test test test test test test \startanswerlines
-[m=2] What A Junk Answer \stopanswerlines 
+[m=2] What A Junk Answer \stopanswerlines
 
 test test test test test test test \startanswerlines
-[m=2,alternative=0] What A Junk Answer \stopanswerlines 
- 
+[m=2,alternative=0] What A Junk Answer \stopanswerlines
+
 test test test test test test test \startanswerlines
-[m=2,alternative=1] What A Junk Answer \stopanswerlines 
+[m=2,alternative=1] What A Junk Answer \stopanswerlines
 
 test test test test test test test \startanswerlines
-[m=2,alternative=2] What A Junk Answer \stopanswerlines 
- 
+[m=2,alternative=2] What A Junk Answer \stopanswerlines
+
 \startitemize[paragraph]
 \item \startanswerlines [option=seried,m=2] xxx \stopanswerlines
 \stopitemize
diff --git a/tex/context/base/meta-pag.mkiv b/tex/context/base/meta-pag.mkiv
index 19051e872..2b72ab3d7 100644
--- a/tex/context/base/meta-pag.mkiv
+++ b/tex/context/base/meta-pag.mkiv
@@ -23,64 +23,64 @@
 %D pagebody looks.
 
 \startMPextensions
-  boolean PageStateAvailable,OnRightPage,InPageBody;
-  PageStateAvailable:=true;
+    boolean PageStateAvailable,OnRightPage,InPageBody;
+    PageStateAvailable:=true;
 \stopMPextensions
 
 \startMPinitializations
-  OnRightPage:=true;
-  InPageBody:=\ifinpagebody true \else false \fi;
+    OnRightPage:=true;
+    InPageBody:=\ifinpagebody true \else false \fi;
 \stopMPinitializations
 
 \startMPinitializations
-  def LoadPageState =
-    OnRightPage:=\MPonrightpage;
-    OnOddPage:=\MPonoddpage;
-    RealPageNumber:=\the\realpageno;
-    PageNumber:=\the\pageno;
-    NOfPages:=\lastpage;
-    PaperHeight:=\the\paperheight;
-    PaperWidth:=\the\paperwidth;
-    PrintPaperHeight:=\the\printpaperheight;
-    PrintPaperWidth:=\the\printpaperwidth;
-    TopSpace:=\the\topspace;
-    BottomSpace:=\the\bottomspace;
-    BackSpace:=\the\backspace;
-    CutSpace:=\the\cutspace;
-    MakeupHeight:=\the\makeupheight;
-    MakeupWidth:=\the\makeupwidth;
-    TopHeight:=\the\topheight;
-    TopDistance:=\the\topdistance;
-    HeaderHeight:=\the\headerheight;
-    HeaderDistance:=\the\headerdistance;
-    TextHeight:=\the\textheight;
-    FooterDistance:=\the\footerdistance;
-    FooterHeight:=\the\footerheight;
-    BottomDistance:=\the\bottomdistance;
-    BottomHeight:=\the\bottomheight;
-    LeftEdgeWidth:=\the\leftedgewidth;
-    LeftEdgeDistance:=\the\leftedgedistance;
-    LeftMarginWidth:=\the\leftmarginwidth;
-    LeftMarginDistance:=\the\leftmargindistance;
-    TextWidth:=\the\textwidth ;
-    RightMarginDistance:=\the\rightmargindistance;
-    RightMarginWidth:=\the\rightmarginwidth;
-    RightEdgeDistance:=\the\rightedgedistance;
-    RightEdgeWidth:=\the\rightedgewidth;
-    InnerMarginDistance:=\the\innermargindistance;
-    InnerMarginWidth:=\the\innermarginwidth;
-    OuterMarginDistance:=\the\outermargindistance;
-    OuterMarginWidth:=\the\outermarginwidth;
-    InnerEdgeDistance:=\the\inneredgedistance;
-    InnerEdgeWidth:=\the\inneredgewidth;
-    OuterEdgeDistance:=\the\outeredgedistance;
-    OuterEdgeWidth:=\the\outeredgewidth;
-    PageOffset:=\the\pageoffset;
-    PageDepth:=\the\pagedepth;
-    LayoutColumns:=\the\layoutcolumns;
-    LayoutColumnDistance:=\the\layoutcolumndistance;
-    LayoutColumnWidth:=\the\layoutcolumnwidth;
-  enddef;
+    def LoadPageState =
+        OnRightPage:=\MPonrightpage;
+        OnOddPage:=\MPonoddpage;
+        RealPageNumber:=\the\realpageno;
+        PageNumber:=\the\pageno;
+        NOfPages:=\lastpage;
+        PaperHeight:=\the\paperheight;
+        PaperWidth:=\the\paperwidth;
+        PrintPaperHeight:=\the\printpaperheight;
+        PrintPaperWidth:=\the\printpaperwidth;
+        TopSpace:=\the\topspace;
+        BottomSpace:=\the\bottomspace;
+        BackSpace:=\the\backspace;
+        CutSpace:=\the\cutspace;
+        MakeupHeight:=\the\makeupheight;
+        MakeupWidth:=\the\makeupwidth;
+        TopHeight:=\the\topheight;
+        TopDistance:=\the\topdistance;
+        HeaderHeight:=\the\headerheight;
+        HeaderDistance:=\the\headerdistance;
+        TextHeight:=\the\textheight;
+        FooterDistance:=\the\footerdistance;
+        FooterHeight:=\the\footerheight;
+        BottomDistance:=\the\bottomdistance;
+        BottomHeight:=\the\bottomheight;
+        LeftEdgeWidth:=\the\leftedgewidth;
+        LeftEdgeDistance:=\the\leftedgedistance;
+        LeftMarginWidth:=\the\leftmarginwidth;
+        LeftMarginDistance:=\the\leftmargindistance;
+        TextWidth:=\the\textwidth ;
+        RightMarginDistance:=\the\rightmargindistance;
+        RightMarginWidth:=\the\rightmarginwidth;
+        RightEdgeDistance:=\the\rightedgedistance;
+        RightEdgeWidth:=\the\rightedgewidth;
+        InnerMarginDistance:=\the\innermargindistance;
+        InnerMarginWidth:=\the\innermarginwidth;
+        OuterMarginDistance:=\the\outermargindistance;
+        OuterMarginWidth:=\the\outermarginwidth;
+        InnerEdgeDistance:=\the\inneredgedistance;
+        InnerEdgeWidth:=\the\inneredgewidth;
+        OuterEdgeDistance:=\the\outeredgedistance;
+        OuterEdgeWidth:=\the\outeredgewidth;
+        PageOffset:=\the\pageoffset;
+        PageDepth:=\the\pagedepth;
+        LayoutColumns:=\the\layoutcolumns;
+        LayoutColumnDistance:=\the\layoutcolumndistance;
+        LayoutColumnWidth:=\the\layoutcolumnwidth;
+    enddef;
 \stopMPinitializations
 
 \def\MPonrightpage{true}
@@ -139,83 +139,94 @@
 
 \newif\iftracetextareas
 
-\def\registerMPtextarea#1%
-  {\ifpositioning
-     \bgroup
-     \global\advance\currentMPtextareadata\plusone
-    %\hpos{gbd:\the\currentMPtextareadata}{#1}%
-     \hpos{gbd:\the\currentMPtextareadata}%
-       {\iftracetextareas\boxrulewidth1.5pt\ruledhbox\fi{#1}}%
-     \edef\!!stringa{gbd:\the\currentMPtextareadata}%
-     \edef\!!stringa{RegisterTextArea(%
-       \MPx\!!stringa,\MPy\!!stringa,%
-       \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
-     \@EA \doglobal \@EA \appendtoks \!!stringa \to \MPtextareadata
-     \egroup
-   \else
-     \hbox{#1}%
-   \fi}
-
-\def\registerMPlocaltextarea#1%
-  {\ifpositioning
-     \bgroup
-     \global\advance\currentMPtextareadata\plusone
-    %\hpos{gbd:\the\currentMPtextareadata}{#1}%
-     \hpos{gbd:\the\currentMPtextareadata}%
-       {\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
-     \edef\!!stringa{gbd:\the\currentMPtextareadata}%
-     \edef\!!stringa{RegisterLocalTextArea(%
-       \MPx\!!stringa,\MPy\!!stringa,%
-       \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
-     \global\MPlocaltextareadata\@EA{\!!stringa}%
-     \egroup
-   \else
-     \hbox{#1}%
-   \fi}
+% \def\registerMPtextarea#1%
+%   {\ifpositioning
+%      \bgroup
+%      \global\advance\currentMPtextareadata\plusone
+%     %\hpos{gbd:\the\currentMPtextareadata}{#1}%
+%      \hpos{gbd:\the\currentMPtextareadata}%
+%        {\iftracetextareas\boxrulewidth1.5pt\ruledhbox\fi{#1}}%
+%      \edef\!!stringa{gbd:\the\currentMPtextareadata}%
+%      \edef\!!stringa{RegisterTextArea(%
+%        \MPx\!!stringa,\MPy\!!stringa,%
+%        \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
+%      \@EA \doglobal \@EA \appendtoks \!!stringa \to \MPtextareadata
+%      \egroup
+%    \else
+%      \hbox{#1}%
+%    \fi}
 
-% better, so that we can force a key and share with e.g. renumbering
-%
-% \let\namedtextarea\empty
-%
 % \def\registerMPlocaltextarea#1%
 %   {\ifpositioning
 %      \bgroup
-%      \ifx\namedtextarea\empty
-%        \global\advance\currentMPtextareadata\plusone
-%        \edef\namedtextarea{gbd:\the\currentMPtextareadata}%
-%      \fi
-%      \hpos\namedtextarea{\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
-%      \edef\ascii{RegisterLocalTextArea(%
-%        \MPx\namedtextarea,\MPy\namedtextarea,%
-%        \MPw\namedtextarea,\MPh\namedtextarea,\MPd\namedtextarea);}%
-%      \global\MPlocaltextareadata\@EA{\ascii}%
+%      \global\advance\currentMPtextareadata\plusone
+%     %\hpos{gbd:\the\currentMPtextareadata}{#1}%
+%      \hpos{gbd:\the\currentMPtextareadata}%
+%        {\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
+%      \edef\!!stringa{gbd:\the\currentMPtextareadata}%
+%      \edef\!!stringa{RegisterLocalTextArea(%
+%        \MPx\!!stringa,\MPy\!!stringa,%
+%        \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
+%      \global\MPlocaltextareadata\@EA{\!!stringa}%
 %      \egroup
 %    \else
 %      \hbox{#1}%
 %    \fi}
+\def\globalregisterMPtextarea{\normalexpanded{\global\MPtextareadata{\the\MPtextareadata
+  RegisterTextArea(%
+   \MPx\currentMPtextarea,%
+   \MPy\currentMPtextarea,%
+   \MPw\currentMPtextarea,%
+   \MPh\currentMPtextarea,%
+   \MPd\currentMPtextarea%
+  );}}}
+
+\def\localregisterMPtextarea{\normalexpanded{\global\MPlocaltextareadata{%
+  RegisterLocalTextArea(%
+   \MPx\currentMPtextarea,%
+   \MPy\currentMPtextarea,%
+   \MPw\currentMPtextarea,%
+   \MPh\currentMPtextarea,%
+   \MPd\currentMPtextarea%
+  );}}}
+
+\def\registerMPtextareaindeed#1#2%
+  {\ifpositioning
+     \begingroup
+     \global\advance\currentMPtextareadata\plusone
+     \edef\currentMPtextarea{gbd:\the\currentMPtextareadata}%
+     \hpos\currentMPtextarea{\iftracetextareas\boxrulewidth1.5pt\ruledhbox\fi{#2}}%
+     #1%
+     \endgroup
+   \else
+     \hbox{#2}%
+   \fi}
+
+\def\registerMPtextarea     {\registerMPtextareaindeed\globalregisterMPtextarea}
+\def\registerMPlocaltextarea{\registerMPtextareaindeed\localregisterMPtextarea }
 
 \def\resetMPlocaltextarea
   {\global\MPlocaltextareadata\emptytoks}
 
 \startMPextensions
-   path PlainTextArea;
+    path PlainTextArea;
 \stopMPextensions
 
 \startMPinitializations
-  ResetTextAreas;
-  \the\MPsavedtextareadata;
-  SaveTextAreas;
-  ResetTextAreas;
-  \the\MPtextareadata;
-  \the\MPlocaltextareadata;
-  PlainTextArea:=boundingbox(\MPxy{text:\realfolio}--\MPxy{text:\realfolio}
-    shifted (\MPw{text:\realfolio},\MPh{text:\realfolio}));
+    ResetTextAreas;
+    \the\MPsavedtextareadata;
+    SaveTextAreas;
+    ResetTextAreas;
+    \the\MPtextareadata;
+    \the\MPlocaltextareadata;
+    PlainTextArea:=boundingbox(\MPxy{text:\realfolio}--\MPxy{text:\realfolio}
+        shifted (\MPw{text:\realfolio},\MPh{text:\realfolio}));
 \stopMPinitializations
 
 \appendtoks
-  \global\MPsavedtextareadata\MPtextareadata
-  \global\MPtextareadata     \emptytoks
-  \global\MPlocaltextareadata\emptytoks
+    \global\MPsavedtextareadata\MPtextareadata
+    \global\MPtextareadata     \emptytoks
+    \global\MPlocaltextareadata\emptytoks
 \to \everyshipout
 
 \protect \endinput
diff --git a/tex/context/base/mult-def.lua b/tex/context/base/mult-def.lua
index 40339c442..23a4a08b5 100644
--- a/tex/context/base/mult-def.lua
+++ b/tex/context/base/mult-def.lua
@@ -6452,6 +6452,10 @@ return {
   ["buffer"]={
    ["en"]="buffer",
   },
+  ["dash"]={
+    ["en"]="dash",
+    ["nl"]="streep",
+  },
   ["labeloffset"]={
    ["en"]="labeloffset",
   },
diff --git a/tex/context/base/page-bck.mkiv b/tex/context/base/page-bck.mkiv
index 31d440771..08bf8958b 100644
--- a/tex/context/base/page-bck.mkiv
+++ b/tex/context/base/page-bck.mkiv
@@ -177,8 +177,8 @@
 
 \def\page_backgrounds_add_to_paper#1%
   {\doifbothsidesoverruled
-     {\page_backgrounds_add_to_box\v!rightpage#1\paperwidth\paperheight}
-     {\page_backgrounds_add_to_box\v!rightpage#1\paperwidth\paperheight}
+     {\page_backgrounds_add_to_box\v!rightpage#1\paperwidth\paperheight}%
+     {\page_backgrounds_add_to_box\v!rightpage#1\paperwidth\paperheight}%
      {\page_backgrounds_add_to_box\v!leftpage #1\paperwidth\paperheight}%
    \page_backgrounds_add_to_box\v!page#1\paperwidth\paperheight}
 
@@ -188,8 +188,8 @@
 %D only recalculated when they change or when the \type
 %D {status} is set to \type {repeat}.
 
-\newbox\leftbackground
-\newbox\rightbackground
+\newbox\leftbackground  % todo: rename
+\newbox\rightbackground % todo: rename
 
 %D Finaly there is an aditional {\em text} background, again
 %D useful for special purposes only. This one is calculated
@@ -328,6 +328,88 @@
 
 \newconditional\swapbackgroundmargins \settrue\swapbackgroundmargins
 
+% \def\page_backgrounds_set_box#1% #2%
+%   {\global\setbox#1\vbox
+%      {\dontcomplain
+%       \swapmargins
+%       \ifconditional\swapbackgroundmargins
+%         \doifmarginswapelse \donothing
+%           {\swapmacros\v!rightmargin\v!leftmargin
+%            \swapmacros\v!rightedge  \v!leftedge}%
+%       \fi
+%       \calculatereducedvsizes
+%       \offinterlineskip
+%     % \ifconditional#2\relax
+%     %   \doswapmargins % hm, this one gets nilled in \swapmargins anyway
+%     % \fi
+%       \vskip\dimexpr-\topheight-\topdistance\relax
+%       \ifdim\topheight>\zeropoint
+%         \page_backgrounds_set_box_row\v!top\topheight
+%       \fi
+%       \vskip\topdistance
+%       \ifdim\headerheight>\zeropoint
+%         \page_backgrounds_set_box_row\v!header\headerheight
+%       \fi
+%       \vskip\headerdistance
+%       \ifdim\textheight>\zeropoint
+%         \page_backgrounds_set_box_row\v!text\textheight
+%       \fi
+%       \vskip\footerdistance
+%       \ifdim\footerheight>\zeropoint
+%         \page_backgrounds_set_box_row\v!footer\footerheight
+%       \fi
+%       \vskip\bottomdistance
+%       \ifdim\bottomheight>\zeropoint
+%         \page_backgrounds_set_box_row\v!bottom\bottomheight
+%       \fi
+%       \vfilll}%
+%   \smashbox#1}
+
+% \def\page_backgrounds_set_box_row#1#2% maybe helper
+%   {\setbox\scratchbox\vbox to #2
+%      \bgroup\hbox\bgroup
+%        \goleftonpage
+%        \ifdim\leftedgewidth>\zeropoint
+%          \ifcsname\??ma#1\v!leftedge\endcsname
+%            \page_backgrounds_set_box_cell#1\v!leftedge\leftedgewidth#2%
+%          \else
+%            \hskip\leftedgewidth
+%          \fi
+%        \fi
+%        \hskip\leftedgedistance
+%        \ifdim\leftmarginwidth>\zeropoint
+%          \ifcsname\??ma#1\v!leftmargin\endcsname
+%            \page_backgrounds_set_box_cell#1\v!leftmargin\leftmarginwidth#2%
+%          \else
+%            \hskip\leftmarginwidth
+%          \fi
+%        \fi
+%        \hskip\leftmargindistance
+%        \ifcsname\??ma#1\v!text\endcsname
+%          \page_backgrounds_set_box_cell#1\v!text\makeupwidth#2%
+%        \else
+%          \hskip\makeupwidth
+%        \fi
+%        \hskip\rightmargindistance
+%        \ifdim\rightmarginwidth>\zeropoint
+%          \ifcsname\??ma#1\v!rightmargin\endcsname
+%            \page_backgrounds_set_box_cell#1\v!rightmargin\rightmarginwidth#2%
+%          \else
+%            \hskip\rightmarginwidth
+%          \fi
+%        \fi
+%        \hskip\rightedgedistance
+%        \ifdim\rightedgewidth>\zeropoint
+%          \ifcsname\??ma#1\v!rightedge\endcsname
+%            \page_backgrounds_set_box_cell#1\v!rightedge\rightedgewidth#2%
+%          \else
+%            \hskip\rightedgewidth
+%          \fi
+%        \fi
+%      \egroup\egroup
+%    \wd\scratchbox\zeropoint
+%    \box\scratchbox\relax}
+
 \def\page_backgrounds_set_box#1% #2%
   {\global\setbox#1\vbox
      {\dontcomplain
@@ -342,28 +424,28 @@
     % \ifconditional#2\relax
     %   \doswapmargins % hm, this one gets nilled in \swapmargins anyway
     % \fi
-      \vskip\dimexpr-\topheight-\topdistance\relax
       \ifdim\topheight>\zeropoint
+        \kern\dimexpr-\topheight-\topdistance\relax
         \page_backgrounds_set_box_row\v!top\topheight
+        \kern\topdistance
       \fi
-      \vskip\topdistance
       \ifdim\headerheight>\zeropoint
         \page_backgrounds_set_box_row\v!header\headerheight
+        \kern\headerdistance
       \fi
-      \vskip\headerdistance
       \ifdim\textheight>\zeropoint
         \page_backgrounds_set_box_row\v!text\textheight
       \fi
-      \vskip\footerdistance
       \ifdim\footerheight>\zeropoint
+        \kern\footerdistance
         \page_backgrounds_set_box_row\v!footer\footerheight
       \fi
-      \vskip\bottomdistance
       \ifdim\bottomheight>\zeropoint
+        \kern\bottomdistance
         \page_backgrounds_set_box_row\v!bottom\bottomheight
       \fi
       \vfilll}%
-  \smashbox#1}
+   \smashbox#1}
 
 \def\page_backgrounds_set_box_row#1#2% maybe helper
   {\setbox\scratchbox\vbox to #2
@@ -373,37 +455,37 @@
          \ifcsname\??ma#1\v!leftedge\endcsname
            \page_backgrounds_set_box_cell#1\v!leftedge\leftedgewidth#2%
          \else
-           \hskip\leftedgewidth
+           \kern\leftedgewidth
          \fi
+         \kern\leftedgedistance
        \fi
-       \hskip\leftedgedistance
        \ifdim\leftmarginwidth>\zeropoint
          \ifcsname\??ma#1\v!leftmargin\endcsname
            \page_backgrounds_set_box_cell#1\v!leftmargin\leftmarginwidth#2%
          \else
-           \hskip\leftmarginwidth
+           \kern\leftmarginwidth
          \fi
+         \kern\leftmargindistance
        \fi
-       \hskip\leftmargindistance
        \ifcsname\??ma#1\v!text\endcsname
          \page_backgrounds_set_box_cell#1\v!text\makeupwidth#2%
        \else
-         \hskip\makeupwidth
+         \kern\makeupwidth
        \fi
-       \hskip\rightmargindistance
        \ifdim\rightmarginwidth>\zeropoint
+         \kern\rightmargindistance
          \ifcsname\??ma#1\v!rightmargin\endcsname
            \page_backgrounds_set_box_cell#1\v!rightmargin\rightmarginwidth#2%
          \else
-           \hskip\rightmarginwidth
+           \kern\rightmarginwidth
          \fi
        \fi
-       \hskip\rightedgedistance
        \ifdim\rightedgewidth>\zeropoint
+         \kern\rightedgedistance
          \ifcsname\??ma#1\v!rightedge\endcsname
            \page_backgrounds_set_box_cell#1\v!rightedge\rightedgewidth#2%
          \else
-           \hskip\rightedgewidth
+           \kern\rightedgewidth
          \fi
        \fi
      \egroup\egroup
diff --git a/tex/context/base/page-imp.mkiv b/tex/context/base/page-imp.mkiv
index edf82834d..6497ba657 100644
--- a/tex/context/base/page-imp.mkiv
+++ b/tex/context/base/page-imp.mkiv
@@ -105,7 +105,7 @@
    \deadcycles\zerocount
    \endgroup}
 
-\def\page_otr_flush_every_stuff % this will become obsolete ... was backend related
+\def\page_otr_flush_every_stuff
   {\begingroup
    \setbox\scratchbox\hbox
      {% before the main one !
@@ -161,9 +161,15 @@
    \fi}
 
 \def\page_shipouts_arrange#1%
-  {\setbox\scratchbox\hbox{#1}%
+  {% \global\advance\shippedoutpages\plusone
+   \begingroup
+   \setbox\scratchbox\hbox
+     {\page_otr_flush_every_stuff
+      \page_otr_flush_special_content
+      \box\shipoutscratchbox}%
    \pusharrangedpage\scratchbox
-   \deadcycles\zerocount}
+   \deadcycles\zerocount
+   \endgroup}
 
 %D We need a couple of boxes for duplex printing \unknown
 
diff --git a/tex/context/base/page-ini.mkiv b/tex/context/base/page-ini.mkiv
index b8e419a79..253c8419b 100644
--- a/tex/context/base/page-ini.mkiv
+++ b/tex/context/base/page-ini.mkiv
@@ -402,7 +402,7 @@
       \ifcase\pageornamentstate
         \page_backgrounds_add_to_paper    \pagebox
       \fi
-      \registerpageposition               \pagebox
+      \positions_register_page            \pagebox
       \ifarrangingpages
         \page_boxes_apply_shift_paper     \pagebox % \v!paper
       \else
diff --git a/tex/context/base/page-lay.mkiv b/tex/context/base/page-lay.mkiv
index e30d76245..e397e2c78 100644
--- a/tex/context/base/page-lay.mkiv
+++ b/tex/context/base/page-lay.mkiv
@@ -367,12 +367,25 @@
      \page_paper_restore
    \fi}
 
-\unexpanded\def\setup_paper_size_settings[#1]%
+\unexpanded\def\setup_paper_size_settings[#1]% sometimes used to set paper/print size
   {\let\currentlayouttarget\empty
+   \edef\tmp_layouttarget_paper_saved{\page_paper_the_paper_size{\layouttargetparameter\c!page }}%
+   \edef\tmp_layouttarget_print_saved{\page_paper_the_print_size{\layouttargetparameter\c!paper}}%
    \setupcurrentlayouttarget[#1]%
    \edef\tmp_layouttarget_paper{\page_paper_the_paper_size{\layouttargetparameter\c!page }}%
    \edef\tmp_layouttarget_print{\page_paper_the_print_size{\layouttargetparameter\c!paper}}%
-   \ifx\tmp_layouttarget_paper\empty
+   \ifx\tmp_layouttarget_paper_saved\tmp_layouttarget_paper
+     \ifx\tmp_layouttarget_print_saved\tmp_layouttarget_print
+       % we didn't change the size, maybe only sx or sy or so
+     \else
+       \setup_paper_size_settings_recalibrate
+     \fi
+   \else
+     \setup_paper_size_settings_recalibrate
+   \fi}
+
+\def\setup_paper_size_settings_recalibrate
+  {\ifx\tmp_layouttarget_paper\empty
      % forget about it
    \else
      \ifx\tmp_layouttarget_print\empty
@@ -822,9 +835,9 @@
       \begingroup % needed ?
       \uselayoutstyleandcolor\c!style\c!color
       \offinterlineskip
-      \gettextboxes
+      \page_insert_elements % zero size
       \endgroup
-      \getmainbox#1#2}}% including footnotes
+      \page_insert_body#1#2}}% including footnotes
 
 \installlayoutalternative\v!default{\page_boxes_construct_content_default}
 \installlayoutalternative\v!normal {\page_boxes_construct_content_default}
diff --git a/tex/context/base/page-txt.mkvi b/tex/context/base/page-txt.mkvi
index 86415c6ed..bf4c3c40b 100644
--- a/tex/context/base/page-txt.mkvi
+++ b/tex/context/base/page-txt.mkvi
@@ -648,14 +648,6 @@
 \appendtoks \placerightmarginblock \hskip-\rightmarginwidth \to \rightmargintextcontent
 \appendtoks \placeleftmarginblock  \hskip-\leftmarginwidth  \to \leftmargintextcontent
 
-%D The next hook will later be used for keeping track of
-%D positions, i.e.\ it will provide a proper (page
-%D dependent) reference point.
-
-\ifx\undefined\placepositionanchors
-  \unexpanded\def\placepositionanchors{\vskip\textheight}
-\fi
-
 %D \macros
 %D   {definetext}
 %D
@@ -823,7 +815,7 @@
 
 \newbox\layout_element_box
 
-\def\gettextboxes % will become \place_layout_elements
+\def\page_insert_elements
   {\ifcase\pageornamentstate
      \place_layout_elements_indeed
    \fi}
@@ -839,7 +831,7 @@
       \vskip\dimexpr\topheight+\topdistance\relax
       \the\headertextcontent
       \vskip\dimexpr\headerheight+\headerdistance\relax
-      \placepositionanchors
+      \positions_place_anchors
       \vskip-\textheight
       \the\texttextcontent
       \vskip\textheight
@@ -853,7 +845,7 @@
   \smashbox\layout_element_box
   \box\layout_element_box}
 
-\def\getmainbox#1#2%
+\def\page_insert_body#1#2%
   {\setbox\layout_element_box\vbox
      {\offinterlineskip
       \calculatereducedvsizes
@@ -862,37 +854,35 @@
       \vskip\dimexpr\headerheight+\headerdistance+\layoutparameter\c!textdistance\relax
       \dontleavehmode
       \hbox to \makeupwidth
-        {\bgroup
+        {\begingroup
            \swapmargins
            \goleftonpage
            \ifdim\leftedgewidth>\zeropoint
              \the\leftedgetextcontent
-             \hskip\leftedgewidth
+             \kern\dimexpr\leftedgewidth+\leftedgedistance\relax
            \fi
-           \hskip\leftedgedistance
            \ifdim\leftmarginwidth>\zeropoint
              \the\leftmargintextcontent
-             \hskip\leftmarginwidth
+             \kern\dimexpr\leftmarginwidth+\leftmargindistance\relax
            \fi
-           \hskip\leftmargindistance
-         \egroup
+         \endgroup
          \mkprocesspagecontents{#2}%
          \settextpagecontent\layout_element_box{#1}{#2}%
          \page_backgrounds_add_to_text\layout_element_box
          \page_grids_add_to_box\layout_element_box
          \box\layout_element_box
-         \bgroup
-           \hskip\rightmargindistance
+         \begingroup
            \ifdim\rightmarginwidth>\zeropoint
+             \kern\rightmargindistance
              \the\rightmargintextcontent
-             \hskip\rightmarginwidth
+             \kern\rightmarginwidth
            \fi
-           \hskip\rightedgedistance
            \ifdim\rightedgewidth>\zeropoint
+             \kern\rightedgedistance
              \the\rightedgetextcontent
-             \hskip\rightedgewidth
+             \kern\rightedgewidth
            \fi
-         \egroup
+         \endgroup
          \hss}}%
    \smashbox\layout_element_box
    \box\layout_element_box}
diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf
index ea308c0b2..a8c4bbdea 100644
Binary files a/tex/context/base/status-files.pdf and b/tex/context/base/status-files.pdf differ
diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf
index 0ce87fb5b..69c47e279 100644
Binary files a/tex/context/base/status-lua.pdf and b/tex/context/base/status-lua.pdf differ
diff --git a/tex/context/base/tabl-tbl.mkiv b/tex/context/base/tabl-tbl.mkiv
index cf6c04991..a9d47903a 100644
--- a/tex/context/base/tabl-tbl.mkiv
+++ b/tex/context/base/tabl-tbl.mkiv
@@ -449,7 +449,7 @@
         \dotabulatepostskip{\the\tabulateposskip}%
         \alignmark\alignmark
    }}%
-   \tabulatedummy{\the\tabulatedummy\NC}%
+   \tabulatedummy\expandafter{\the\tabulatedummy\NC}%
    \tabulatepreskip.5\tabulateunit\relax
    \ifnum\tabulatecolumns<\numexpr\noftabulatecolumns-\plusone\relax
      \tabulateposskip\tabulatepreskip
-- 
cgit v1.2.3