From 895f68ef1727ec31a51ef8799e2bf576ea7642d0 Mon Sep 17 00:00:00 2001
From: Marius <mariausol@gmail.com>
Date: Wed, 4 Jul 2012 12:00:14 +0300
Subject: beta 2012.07.04 10:42

---
 tex/context/base/anch-pgr.mkiv                     |   8 +-
 tex/context/base/anch-tab.mkiv                     | 184 ++---
 tex/context/base/buff-ver.mkiv                     |   2 +-
 tex/context/base/catc-ini.mkiv                     |  64 +-
 tex/context/base/cont-log.mkiv                     |   2 +-
 tex/context/base/cont-new.mkii                     |   2 +-
 tex/context/base/cont-new.mkiv                     |  57 +-
 tex/context/base/context-version.pdf               | Bin 4146 -> 4141 bytes
 tex/context/base/context-version.png               | Bin 106156 -> 105732 bytes
 tex/context/base/context.mkii                      |   2 +-
 tex/context/base/context.mkiv                      |  14 +-
 tex/context/base/core-con.mkiv                     | 159 ++--
 tex/context/base/core-def.mkiv                     | 114 ++-
 tex/context/base/core-env.mkiv                     |  47 ++
 tex/context/base/core-ini.mkiv                     | 223 +++++-
 tex/context/base/core-var.mkiv                     | 254 ------
 tex/context/base/enco-ini.mkiv                     |   2 +-
 tex/context/base/file-ini.mkvi                     |  20 +-
 tex/context/base/file-job.mkvi                     |   7 +-
 tex/context/base/font-sty.mkvi                     |   2 +-
 tex/context/base/grph-raw.mkiv                     |  14 +-
 tex/context/base/grph-trf.mkiv                     | 137 ++--
 tex/context/base/lang-lab.mkiv                     |  19 +-
 tex/context/base/lang-mis.mkiv                     |   2 +-
 tex/context/base/luat-ini.mkiv                     |   8 +-
 tex/context/base/lxml-ini.mkiv                     |   2 +-
 tex/context/base/math-ali.mkiv                     |  87 +--
 tex/context/base/math-arr.mkiv                     | 379 ++++-----
 tex/context/base/math-for.mkiv                     |  15 -
 tex/context/base/math-ini.mkiv                     |  18 +-
 tex/context/base/meta-ini.mkiv                     |  36 +-
 tex/context/base/mult-def.mkiv                     |   4 +
 tex/context/base/mult-low.lua                      |   3 +-
 tex/context/base/mult-sys.mkiv                     | 120 +--
 tex/context/base/pack-bck.mkvi                     |   2 +-
 tex/context/base/pack-mrl.mkiv                     | 859 ++++++++++-----------
 tex/context/base/pack-rul.mkiv                     |  19 +-
 tex/context/base/page-bck.mkiv                     | 132 ++--
 tex/context/base/page-col.mkiv                     |  75 +-
 tex/context/base/page-com.mkiv                     | 176 +++--
 tex/context/base/page-fac.mkiv                     |  48 +-
 tex/context/base/page-flt.mkiv                     | 175 ++---
 tex/context/base/page-flw.mkiv                     | 186 +++--
 tex/context/base/page-imp.mkiv                     |   3 +-
 tex/context/base/page-ini.mkiv                     |   4 +-
 tex/context/base/page-ins.mkiv                     |  90 +--
 tex/context/base/page-lay.mkiv                     |  76 +-
 tex/context/base/page-lin.lua                      |   9 +
 tex/context/base/page-lin.mkiv                     | 523 ++++++-------
 tex/context/base/page-mbk.mkvi                     |   4 +-
 tex/context/base/page-mis.lua                      |  78 --
 tex/context/base/page-mis.mkiv                     |  95 ---
 tex/context/base/page-mul.mkiv                     |  76 +-
 tex/context/base/page-not.mkiv                     |  10 +-
 tex/context/base/page-one.mkiv                     | 105 +--
 tex/context/base/page-plg.mkiv                     | 101 +--
 tex/context/base/page-pst.lua                      |  78 ++
 tex/context/base/page-pst.mkiv                     | 102 +++
 tex/context/base/page-sel.mkiv                     | 347 ---------
 tex/context/base/page-sel.mkvi                     | 368 +++++++++
 tex/context/base/page-set.mkiv                     |  42 +-
 tex/context/base/page-sid.mkiv                     |   9 +-
 tex/context/base/page-spr.mkiv                     |  90 ++-
 tex/context/base/page-str.mkiv                     |  10 +-
 tex/context/base/page-txt.mkvi                     | 100 +--
 tex/context/base/regi-ini.lua                      |   3 +
 tex/context/base/scrn-pag.mkvi                     |   6 -
 tex/context/base/scrn-wid.lua                      |  12 +-
 tex/context/base/scrn-wid.mkvi                     | 107 +--
 tex/context/base/spac-def.mkiv                     |  36 +-
 tex/context/base/spac-grd.mkiv                     |   6 +-
 tex/context/base/spac-hor.mkiv                     |   6 +-
 tex/context/base/spac-ver.mkiv                     |  53 +-
 tex/context/base/status-files.pdf                  | Bin 24466 -> 24505 bytes
 tex/context/base/status-lua.pdf                    | Bin 182510 -> 182713 bytes
 tex/context/base/status-mkiv.lua                   | 138 ++--
 tex/context/base/status-mkiv.tex                   |  35 +-
 tex/context/base/strc-flt.mkvi                     |  74 +-
 tex/context/base/strc-ind.mkiv                     |  12 +-
 tex/context/base/strc-mat.mkiv                     | 450 ++++++-----
 tex/context/base/strc-num.mkiv                     |  26 +-
 tex/context/base/strc-pag.mkiv                     |  64 +-
 tex/context/base/strc-ref.lua                      |   1 -
 tex/context/base/strc-ref.mkvi                     |  36 +-
 tex/context/base/strc-reg.mkiv                     |   2 +-
 tex/context/base/strc-tag.mkiv                     |   8 +
 tex/context/base/supp-mat.mkiv                     |   7 +-
 tex/context/base/syst-aux.mkiv                     |  73 +-
 tex/context/base/syst-ini.mkiv                     |  26 +-
 tex/context/base/tabl-ntb.mkiv                     |   8 +-
 tex/context/base/tabl-tab.mkiv                     | 154 ++--
 tex/context/base/tabl-tsp.mkiv                     |   6 +-
 tex/context/base/typo-brk.mkiv                     |  16 +-
 tex/context/base/typo-cap.mkiv                     |  25 +-
 tex/context/base/typo-del.mkiv                     |  31 +-
 tex/context/base/typo-spa.mkiv                     |  17 +-
 tex/generic/context/luatex/luatex-fonts-merged.lua |   2 +-
 97 files changed, 3842 insertions(+), 3597 deletions(-)
 delete mode 100644 tex/context/base/core-var.mkiv
 delete mode 100644 tex/context/base/page-mis.lua
 delete mode 100644 tex/context/base/page-mis.mkiv
 create mode 100644 tex/context/base/page-pst.lua
 create mode 100644 tex/context/base/page-pst.mkiv
 delete mode 100644 tex/context/base/page-sel.mkiv
 create mode 100644 tex/context/base/page-sel.mkvi

(limited to 'tex')

diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv
index 130116bc7..01ef25dc4 100644
--- a/tex/context/base/anch-pgr.mkiv
+++ b/tex/context/base/anch-pgr.mkiv
@@ -365,11 +365,11 @@
 \let\stopMPpositiongraphic\relax
 
 \def\anch_positions_meta_graphic_prepare
-  {\ifcsname\??gv\currentmpvariableclass:self\endcsname \else
-     \letvalue{\??gv\currentmpvariableclass:self}\currentposition
+  {\ifcsname\??graphicvariable\currentmpvariableclass:self\endcsname \else
+     \letvalue{\??graphicvariable\currentmpvariableclass:self}\currentposition
    \fi
-   \ifcsname\??gv\currentmpvariableclass:from\endcsname \else
-     \letvalue{\??gv\currentmpvariableclass:from}\currentposition
+   \ifcsname\??graphicvariable\currentmpvariableclass:from\endcsname \else
+     \letvalue{\??graphicvariable\currentmpvariableclass:from}\currentposition
    \fi}
 
 \def\anch_positions_meta_graphic_use#1#2#3%
diff --git a/tex/context/base/anch-tab.mkiv b/tex/context/base/anch-tab.mkiv
index 1b90d2476..2fb6938a2 100644
--- a/tex/context/base/anch-tab.mkiv
+++ b/tex/context/base/anch-tab.mkiv
@@ -13,6 +13,9 @@
 
 \writestatus{loading}{ConTeXt Anchoring Macros / Table Extensions}
 
+%D This is just a playground and functionality might change or even
+%D dissappear in favour of better solutions.
+
 \unprotect
 
 \newcount\c_anch_tabs
@@ -57,23 +60,22 @@
     \global\advance\c_anch_tabs\plusone
 \to \everytabulate
 
-%D Beware, the following code is somewhat weird and experimental
-%D and might be dropped or become a loadable module.
+%D Beware, the following code is somewhat weird and experimental and might be
+%D dropped or become a loadable module.
 
 %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.
+%D The next macros extend tables and tabulation with backgrounds and position
+%D related features. Areas are specified with symbolic names, and symbolic
+%D references to the graphics involved. Each table has its own namespace.
 
 \newconditional\tablehaspositions
-\newcount\noftabpositions
-\newtoks \posXCtoks
+\newcount      \noftabpositions
+\newtoks       \posXCtoks
 
-\def\dotablebpos{\bpos}
-\def\dotableepos{\epos}
+\def\anch_tabulate_bpos{\bpos}
+\def\anch_tabulate_epos{\epos}
 
 \installcorenamespace{positiontables}
 
@@ -85,74 +87,80 @@
 
 \let\tabulatepos\tablepos
 
-\def\dodododoGSC[#1:#2]%
-  {\remappositionframed{#2}{\tbPOSprefix#1}%
-   \dotablebpos{\tbPOSprefix#1}%
-   \doglobal\appendtoks\@EA\dotableepos\@EA{\tbPOSprefix#1}\to\posXCtoks}
+\unexpanded\def\tbXC {\dosingleempty\anch_tables_XC }
+\unexpanded\def\tbGSC{\dosingleempty\anch_tables_GSC}
+\unexpanded\def\tbGFC{\dosingleempty\anch_tables_GFC}
+\unexpanded\def\tbGTC{\dosingleempty\anch_tables_GTC}
 
-\def\dododoGSC[#1:#2:#3]%
-  {\doglobal\appendtoks\dodododoGSC[#1:#2]\to\posXCtoks\NC}
+\def\anch_table_check_state
+  {\iftrialtypesetting
+     \global\settrue\tablehaspositions
+     \firstargumentfalse
+   \fi}
 
-\def\dodoGSC[#1]%
-  {\def\docommand##1{\dododoGSC[##1:##1]}%
-   \processcommalist[#1]\docommand}
+\def\anch_tables_XC [#1]{\anch_table_check_state\iffirstargument\anch_tables_indeed_XC [#1]\else\expandafter\fi\NC}
+\def\anch_tables_GSC[#1]{\anch_table_check_state\iffirstargument\anch_tables_indeed_GSC[#1]\else\expandafter\NC\fi}
+\def\anch_tables_GFC[#1]{\anch_table_check_state\iffirstargument\anch_tables_indeed_GFC[#1]\else\expandafter\NC\fi}
+\def\anch_tables_GTC[#1]{\anch_table_check_state\iffirstargument\anch_tables_indeed_GTC[#1]\else\expandafter\NC\fi}
 
-\def\dodododoGFC[#1:#2:#3]%
-  {\remappositionframed{#2}{\tbPOSprefix#1}%
-   \dotablebpos{\tbPOSprefix#1}}
+\def\anch_tables_indeed_XC[#1]%
+  {{\let\NC\relax\processcommalist[#1]\anch_tables_step_XC}}
 
-\def\dododoGFC[#1]%
-  {\def\docommand##1{\dodododoGFC[##1:##1]}%
-   \processcommalist[#1]\docommand}
+\def\anch_tables_step_XC#1%
+  {\anch_tables_step_indeed_XC[#1]}
 
-\def\dodoGFC[#1]%
-  {\doglobal\appendtoks\dododoGFC[#1]\to\posXCtoks\NC}
+\def\anch_tables_step_indeed_XC[#1#2]%
+  {\if#1>\anch_tables_indeed_GFC  [#2:#2]\else
+   \if#1+\anch_tables_indeed_GFC  [#2:#2]\else
+   \if#1<\anch_tables_indeed_GTC  [#2:#2]\else
+   \if#1-\anch_tables_indeed_GTC  [#2:#2]\else
+   \if#1=\anch_tables_indeed_GSC  [#2:#2]\else
+         \anch_tables_indeed_GSC[#1#2:#1#2]\fi\fi\fi\fi\fi}
 
-\def\dododododoGTC[#1:#2]%
-  {\dotableepos{\tbPOSprefix#1}}
+\def\anch_tables_indeed_GSC[#1]%
+  {\processcommalist[#1]\anch_tables_step_GSC}
 
-\def\dodododoGTC[#1]%
-  {\def\docommand##1{\dododododoGTC[##1:##1]}%
-   \processcommalist[#1]\docommand}
+\def\anch_tables_step_GSC#1%
+  {\anch_tables_append_GSC[#1:#1]}
 
-\def\dododoGTC[#1]%
-  {\doglobal\appendtoks\dodododoGTC[#1]\to\posXCtoks}
+\def\anch_tables_append_GSC[#1:#2:#3]%
+  {\doglobal\appendtoks\anch_tables_process_GSC[#1:#2]\to\posXCtoks\NC}
 
-\def\dodoGTC[#1]%
-  {\doglobal\appendtoks\dododoGTC[#1]\to\posXCtoks\NC}
+\def\anch_tables_process_GSC[#1:#2]%
+  {\remappositionframed{#2}{\tbPOSprefix#1}%
+   \anch_tabulate_bpos{\tbPOSprefix#1}%
+   \doglobal\appendtoks\@EA\anch_tabulate_epos\@EA{\tbPOSprefix#1}\to\posXCtoks}
 
-\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\anch_tables_indeed_GFC[#1]%
+  {\doglobal\appendtoks\anch_tables_delayed_GFC[#1]\to\posXCtoks\NC}
 
-\def\dododoXC#1%
-  {\dodododoXC[#1]}
+\def\anch_tables_delayed_GFC[#1]%
+  {\processcommalist[#1]\anch_tables_step_GFC}
 
-\def\dodoXC[#1]%
-  {{\let\NC\relax\processcommalist[#1]\dododoXC}}
+\def\anch_tables_step_GFC#1%
+  {\anch_tables_process_GFC[#1:#1]}
 
-\def\@@checktablepositionstate
-  {\iftrialtypesetting
-     \global\settrue\tablehaspositions
-     \firstargumentfalse
-   \fi}
+\def\anch_tables_process_GFC[#1:#2:#3]%
+  {\remappositionframed{#2}{\tbPOSprefix#1}%
+   \anch_tabulate_bpos{\tbPOSprefix#1}}
+
+\def\anch_tables_indeed_GTC[#1]%
+  {\doglobal\appendtoks\anch_tables_delayed_GTC[#1]\to\posXCtoks\NC}
 
-\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\anch_tables_delayed_GTC[#1]%
+  {\doglobal\appendtoks\anch_tables_process_GTC[#1]\to\posXCtoks}
 
-\def\tbGSC{\dosingleempty\doGSC}
-\def\tbGFC{\dosingleempty\doGFC}
-\def\tbGTC{\dosingleempty\doGTC}
-\def\tbXC {\dosingleempty\doXC }
+\def\anch_tables_process_GTC[#1]%
+  {\processcommalist[#1]\anch_tables_step_GTC}
 
-%D The amount of code to support tables and tabulation is
-%D rather minimalistic.
+\def\anch_tables_step_GTC#1%
+  {\anch_tables_step_indeed_GTC[#1:#1]}
+
+\def\anch_tables_step_indeed_GTC[#1:#2]%
+  {\anch_tabulate_epos{\tbPOSprefix#1}}
+
+%D The amount of code to support tables and tabulation is rather
+%D minimalistic.
 
 \let\tabulatepos\tablepos
 
@@ -187,31 +195,30 @@
 
 % We need to handle paragraphs as well.
 
-\let\doflushtabulateepos\relax
+\let\anch_tabulate_flush_epos\relax
 
-\def\dotabulatebpos
+\def\anch_tabulate_bpos_indeed
   {\bpos}
 
-\def\dotabulateepos#1%
+\def\anch_tabulate_epos_indeed#1%
   {\ifvoid\b_tabl_tabulate_current\c_tabl_tabulate_column
      \epos{#1}%
-     \glet\doflushtabulateepos\relax
+     \glet\anch_tabulate_flush_epos\relax
    \else
-     \gdef\doflushtabulateepos{\epos{#1}}%
+     \gdef\anch_tabulate_flush_epos{\epos{#1}}%
    \fi}
 
 \def\flushtabulatesplitbox
   {\box\b_tabl_tabulate
-   \iftrialtypesetting\else\ifconditional\tablehaspositions\doflushtabulateepos\fi\fi}
+   \iftrialtypesetting\else\ifconditional\tablehaspositions\anch_tabulate_flush_epos\fi\fi}
 
 \appendtoks
-    \let\dotablebpos\dotabulatebpos % ?
-    \let\dotableepos\dotabulateepos % ?
-    \glet\doflushtabulateepos\relax
+    \let\anch_tabulate_bpos\anch_tabulate_bpos_indeed % ?
+    \let\anch_tabulate_epos\anch_tabulate_epos_indeed % ?
+    \glet\anch_tabulate_flush_epos\relax
 \to \everytabulate
 
-%D In order to prevent potential clashes with abbreviations,
-%D postpone the mapping.
+%D In order to prevent potential clashes with abbreviations, postpone the mapping.
 
 \appendtoks
     \let\GSC\tbGSC
@@ -223,8 +230,8 @@
 %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 The next example show how to provide backgrounds to table cells. First we define
+%D some framed backgrounds.
 %D
 %D \startbuffer
 %D \definepositionframed[x][background=color,backgroundcolor=red]
@@ -244,8 +251,7 @@
 %D \stoptabulate
 %D \stopbuffer
 %D
-%D The table itself defines three areas (a, b and~c) using
-%D these frames.
+%D The table itself defines three areas (a, b and~c) using these frames.
 %D
 %D \typebuffer
 %D % \getbuffer
@@ -270,9 +276,8 @@
     \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 In the previous example, we could have provided an overlay to the framed definition.
+%D A more direct approach is demonstrated below:
 %D
 %D \startbuffer
 %D \def\cw#1{\color[white]{#1}}
@@ -291,8 +296,7 @@
 %D
 %D \typebuffer \getbuffer
 %D
-%D The definition of the table looks about the same as the
-%D previous one:
+%D The definition of the table looks about the same as the previous one:
 %D
 %D \startbuffer
 %D \starttable[|c|c|c|]
@@ -347,22 +351,26 @@
 % \definepositionframed[y][background=color,fillcolor=green]
 % \definepositionframed[z][background=color,fillcolor=blue]
 
-\def\remappositionframed#1#2% from to
+\unexpanded\def\remappositionframed#1#2% from to
   {\copyposition{b:#1}{b:#2}%
    \copyposition{e:#1}{e:#2}%
    \anch_positions_set_action{b:#2}{\dopositionaction{b:#1}}}
 
 \unexpanded\def\definepositionframed
-  {\dodoubleargument\dodefinepositionframed}
+  {\dodoubleargument\anch_framed_define}
 
-\def\dodefinepositionframed[#1][#2]%
-  {\anch_positions_set_action{b:#1}{\dopositionframed[#1][#2]}}
+\def\anch_framed_define[#1][#2]%
+  {\anch_positions_set_action{b:#1}{\anch_framed_handle[#1][#2]}}
+
+\unexpanded\def\anch_framed_handle
+  {\bgroup
+   \anch_framed_indeed}
 
 \unexpanded\def\positionframed
   {\bgroup
-   \dodoubleempty\dopositionframed}
+   \dodoubleempty\anch_framed_indeed}
 
-\def\dopositionframed[#1][#2]%
+\def\anch_framed_indeed[#1][#2]%
   {\setbox\scratchbox\hbox
      {\scratchwidth \dimexpr\MPx{e:#1}-\MPx{b:#1}\relax
       \scratchdepth \dimexpr\MPy{b:#1}-\MPy{e:#1}+\MPd{e:#1}\relax
diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv
index d8fbe31b4..36de37669 100644
--- a/tex/context/base/buff-ver.mkiv
+++ b/tex/context/base/buff-ver.mkiv
@@ -839,6 +839,6 @@
 \appendtoks
     \def\type#1{\letterbackslash\checkedstrippedcsname#1}% or maybe detokenize
     \def\tex #1{\letterbackslash#1}%
-\to \simplifiedcommands
+\to \everysimplifycommands
 
 \protect \endinput
diff --git a/tex/context/base/catc-ini.mkiv b/tex/context/base/catc-ini.mkiv
index 26c3ceee9..791ce31c4 100644
--- a/tex/context/base/catc-ini.mkiv
+++ b/tex/context/base/catc-ini.mkiv
@@ -87,6 +87,17 @@
    \xdef\outputnewlinechar{^^J}%
    \endgroup}
 
+%D We predefine some prefixes ahead of syst-aux and mult-sys. We reserve 8 slots
+%D for catcodes.
+
+\def\??catcodelet   {1>>} % let : \let
+\def\??catcodedef   {2>>} % def : \def
+\def\??catcodeued   {3>>} % ued : \unexpanded\def
+\def\??catcodeget   {4>>} %       \meaning
+
+\def\??catcodetablet{5>>}
+\def\??catcodetablen{6>>}
+
 \newcount\c_syst_catcodes_n \c_syst_catcodes_n\zerocount % 0 = signal, so advance before allocate
 \newcount\c_syst_catcodes_a
 \newcount\c_syst_catcodes_b
@@ -94,7 +105,7 @@
 
 \normalprotected\def\newcatcodetable#1% we could move the cctdefcounter to lua
   {\global\advance\c_syst_catcodes_n\plusone
-   \expandafter\xdef\csname\??qm:n:\number\c_syst_catcodes_n\endcsname{\string#1}% logging
+   \expandafter\xdef\csname\??catcodetablen\number\c_syst_catcodes_n\endcsname{\string#1}% logging
    \newconstant#1%
    #1\c_syst_catcodes_n
    \ctxlua{catcodes.register("\expandafter\gobbleoneargument\string#1",\number#1)}}
@@ -151,12 +162,7 @@
 \setnewconstant\c_syst_catcodes_hack\tildeasciicode
 
 %D Once a catcode is assigned, the next assignments will happen
-%D faster. We predefine some prefixes ahead of mult-sys.
-
-\def\??ql{@@ql} % let : \let
-\def\??qd{@@qd} % def : \def
-\def\??qu{@@qu} % ued : \unexpanded\def
-\def\??qm{@@qm} %       \meaning
+%D faster.
 
 \def\letcatcodecommand{\afterassignment\syst_catcodes_let_a\c_syst_catcodes_a}
 \def\defcatcodecommand{\afterassignment\syst_catcodes_def_a\c_syst_catcodes_a}
@@ -167,46 +173,46 @@
 \def\syst_catcodes_ued_a{\afterassignment\syst_catcodes_ued_b\c_syst_catcodes_b}
 
 \def\syst_catcodes_let_b % each time
-  {\ifcsname\??ql:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname
-     \csname\??ql:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname
+  {\ifcsname\??catcodelet\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname
+     \csname\??catcodelet\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname
    \else
      \expandafter\syst_catcodes_let_c
    \fi}
 
 \def\syst_catcodes_def_b % each time
-  {\ifcsname\??qd:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname
-     \csname\??qd:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname
+  {\ifcsname\??catcodedef\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname
+     \csname\??catcodedef\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname
    \else
      \expandafter\syst_catcodes_def_c
    \fi}
 
 \def\syst_catcodes_ued_b % each time
-  {\ifcsname\??qu:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname
-     \csname\??qu:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname
+  {\ifcsname\??catcodeued\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname
+     \csname\??catcodeued\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname
    \else
      \expandafter\syst_catcodes_ued_c
    \fi}
 
 \def\syst_catcodes_let_c % only first time
-  {\expandafter\gdef\csname\??ql:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname\expandafter
-     {\expandafter\let\csname\??qm:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname}%
+  {\expandafter\gdef\csname\??catcodelet\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname\expandafter
+     {\expandafter\let\csname\??catcodeget\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname}%
    \syst_catcodes_reinstate_unexpanded
-   \csname\??ql:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname}
+   \csname\??catcodelet\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname}
 
 
 \def\syst_catcodes_def_c % only first time (we could use \normalexpanded here)
-  {\expandafter\gdef\csname\??qd:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname
+  {\expandafter\gdef\csname\??catcodedef\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname
      \expandafter##\expandafter1\expandafter
-       {\expandafter\def\csname\??qm:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname{##1}}%
+       {\expandafter\def\csname\??catcodeget\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname{##1}}%
    \syst_catcodes_reinstate_normal
-   \csname\??qd:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname}
+   \csname\??catcodedef\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname}
 
 \def\syst_catcodes_ued_c % only first time
-  {\expandafter\gdef\csname\??qu:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname
+  {\expandafter\gdef\csname\??catcodeued\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\expandafter\endcsname
      \expandafter##\expandafter1\expandafter
-       {\expandafter\normalprotected\expandafter\def\csname\??qm:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname{##1}}%
+       {\expandafter\normalprotected\expandafter\def\csname\??catcodeget\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname{##1}}%
    \syst_catcodes_reinstate_unexpanded
-   \csname\??qu:\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname}
+   \csname\??catcodeued\number\c_syst_catcodes_a:\number\c_syst_catcodes_b\endcsname}
 
 \def\reinstatecatcodecommand{\afterassignment\syst_catcodes_reinstate_normal\c_syst_catcodes_b}
 
@@ -227,8 +233,8 @@
 \newconstant\defaultcatcodetable
 
 \def\catcodecommand#1%
-  {\csname\??qm:\number
-     \ifcsname\??qm:\number\currentcatcodetable:\number#1\endcsname
+  {\csname\??catcodeget\number
+     \ifcsname\??catcodeget\number\currentcatcodetable:\number#1\endcsname
        \currentcatcodetable \else \defaultcatcodetable
      \fi
    :\number#1\endcsname}
@@ -251,13 +257,13 @@
 \normalprotected\def\pushcatcodetable
   {\advance\c_syst_catcodes_level\plusone
    \syst_catcodes_trace_push
-   \expandafter\chardef\csname\??qm:t:\number\c_syst_catcodes_level\endcsname\currentcatcodetable}
+   \expandafter\chardef\csname\??catcodetablet\number\c_syst_catcodes_level\endcsname\currentcatcodetable}
 
 \normalprotected\def\popcatcodetable
   {\ifcase\c_syst_catcodes_level
      \syst_catcodes_trace_nesting_error
    \else
-     \expandafter\catcodetable\csname\??qm:t:\number\c_syst_catcodes_level\endcsname
+     \expandafter\catcodetable\csname\??catcodetablet\number\c_syst_catcodes_level\endcsname
      \syst_catcodes_trace_pop
      \advance\c_syst_catcodes_level\minusone
    \fi}
@@ -269,7 +275,7 @@
 
 \normalprotected\def\restorecatcodes % takes previous level
   {\ifnum\c_syst_catcodes_level>\plusone
-     \expandafter\catcodetable\csname\??qm:t:\number\numexpr\c_syst_catcodes_level-1\relax\endcsname
+     \expandafter\catcodetable\csname\??catcodetablet\number\numexpr\c_syst_catcodes_level-1\relax\endcsname
    \fi}
 
 % \newtoks\everycatcodetable
@@ -294,14 +300,14 @@
 
 \def\syst_catcodes_prev
   {\ifnum\numexpr\c_syst_catcodes_level-1\relax>\zerocount
-     \csname\??qm:n:\number\csname\??qm:t:\number\numexpr\c_syst_catcodes_level-1\relax\endcsname\endcsname
+     \csname\??catcodetablen\number\csname\??catcodetablet\number\numexpr\c_syst_catcodes_level-1\relax\endcsname\endcsname
    \else
      -%
    \fi}
 
 \def\catcodetablename
   {\ifnum\currentcatcodetable>\zerocount
-     \csname\??qm:n:\number\currentcatcodetable\endcsname
+     \csname\??catcodetablen\number\currentcatcodetable\endcsname
    \else
      -%
    \fi}
diff --git a/tex/context/base/cont-log.mkiv b/tex/context/base/cont-log.mkiv
index 5baa05bee..a83417ffd 100644
--- a/tex/context/base/cont-log.mkiv
+++ b/tex/context/base/cont-log.mkiv
@@ -276,6 +276,6 @@
     \def\MetaFont{MetaFont}%
     \def\MetaFun {MetaFun}%
     \def\TeX     {TeX}%
-\to \simplifiedcommands
+\to \everysimplifycommands
 
 \protect \endinput
diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii
index 6cb0f0bdc..eea9250ad 100644
--- a/tex/context/base/cont-new.mkii
+++ b/tex/context/base/cont-new.mkii
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\newcontextversion{2012.06.30 12:32}
+\newcontextversion{2012.07.04 10:42}
 
 %D This file is loaded at runtime, thereby providing an
 %D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
index 442b42222..794733f23 100644
--- a/tex/context/base/cont-new.mkiv
+++ b/tex/context/base/cont-new.mkiv
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\newcontextversion{2012.06.30 12:32}
+\newcontextversion{2012.07.04 10:42}
 
 %D This file is loaded at runtime, thereby providing an
 %D excellent place for hacks, patches, extensions and new
@@ -124,47 +124,6 @@
 % \markpage[nobackgrounds]
 % \doifmarkedpageelse{nobackgrounds}
 
-% Just a simple and fast hanger, for usage in macros.
-
-\def\setuphanging
-  {\dodoubleempty\getparameters[\??ha]}
-
-\setuphanging
-  [\c!distance=.5em]
-
-\def\starthanging
-  {\noindent\bgroup
-   \dowithnextbox
-     {\setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
-      \hangindent\nextboxwd
-      \hangafter\plusone
-      \flushnextbox\ignorespaces}
-   \hbox}
-
-\def\stophanging
-  {\endgraf
-   \egroup}
-
-% experimental
-
-\def\stophangaround
-  {\endgraf
-   \egroup}
-
-\def\starthangaround
-  {\noindent\bgroup
-   \dowithnextbox
-     {\ifdim\nextboxht>\strutht\setbox\nextbox\tbox{\flushnextbox}\fi
-      \setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
-      \getboxheight\scratchdimen\of\box\nextbox
-      \getnoflines\scratchdimen
-      \nextboxht\strutht
-      \nextboxdp\strutdp
-      \hangindent\nextboxwd
-      \hangafter-\noflines
-      \llap{\flushnextbox}\ignorespaces}
-   \hbox}
-
 \def\modevalue#1#2#3%
   {\@EA\ifx\csname\@mode@\systemmodeprefix#1\endcsname\endcsname\enabledmode#2\else#2\fi}
 
@@ -179,7 +138,7 @@
 %    \placefloatplaceholder}
 
 \def\placefloatplaceholder
-  {\ifroomforfloat \else
+  {\ifconditional\c_page_floats_room \else
      \scratchdimen\pagegoal
      \advance\scratchdimen-\pagetotal
      \advance\scratchdimen-3\lineheight
@@ -328,12 +287,12 @@
 % \the\dimexpr(\dimchoice{11pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
 % \the\dimexpr(\dimchoice{14pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
 
-\def\tabulaterule % to be redone, not correct
-  {\dotabulaterule
-     {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax
-      \doifvalue{\??tt\currenttabulate\c!distance}\v!grid
-        {\kern-\scratchdimen}}} % experimental tm-prikkels
-% so far
+%\def\tabulaterule % to be redone, not correct
+%  {\dotabulaterule
+%     {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax
+%      \doif{\tabulateparameter\c!distance}\v!grid
+%        {\kern-\scratchdimen}}} % experimental tm-prikkels
+%
 
 % between alignment lines certain rules apply, and even a
 % simple test can mess up a table, which is why we have a
diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf
index b0e91f6fa..f95cc016a 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 2a2f8a374..70c4214dc 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.mkii b/tex/context/base/context.mkii
index c547b109d..232902240 100644
--- a/tex/context/base/context.mkii
+++ b/tex/context/base/context.mkii
@@ -20,7 +20,7 @@
 %D your styles an modules.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2012.06.30 12:32}
+\edef\contextversion{2012.07.04 10:42}
 
 %D For those who want to use this:
 
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index bcaa34449..9f6d4e3c3 100644
--- a/tex/context/base/context.mkiv
+++ b/tex/context/base/context.mkiv
@@ -19,11 +19,13 @@
 %D 2004.8.30 the low level interface is english. Watch out and adapt
 %D your styles an modules.
 
+% \everypar{\writestatus{!!!!}{some spurious input in line \the\inputlineno}\wait}
+
 %D The order of loading will change when all modules have been cleaned
 %D up and the dependencies are more consistent.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2012.06.30 12:32}
+\edef\contextversion{2012.07.04 10:42}
 
 %D For those who want to use this:
 
@@ -121,7 +123,7 @@
 
 \loadmarkfile{attr-ini}
 
-\loadmarkfile{core-var}
+\loadmarkfile{core-ini}
 \loadmarkfile{core-env}
 
 \loadmarkfile{layo-ini}
@@ -275,7 +277,7 @@
 
 \loadmkvifile{strc-flt}
 
-\loadmarkfile{page-mis}
+\loadmarkfile{page-pst}
 \loadmkvifile{page-mbk}
 \loadmarkfile{page-mul}
 \loadmarkfile{page-set}
@@ -304,14 +306,15 @@
 \loadmarkfile{strc-blk}
 
 \loadmarkfile{page-imp}
-\loadmarkfile{page-sel} % optional
-\loadmarkfile{page-com} % optional
+\loadmkvifile{page-sel} % optional
 
 \loadmkvifile{scrn-pag}
 \loadmkvifile{scrn-wid}
 \loadmkvifile{scrn-but}
 \loadmkvifile{scrn-bar}
 
+\loadmarkfile{page-com} % optional (after scrn-pag)
+
 \loadmarkfile{strc-bkm} % bookmarks
 
 \loadmarkfile{tabl-com}
@@ -461,7 +464,6 @@
 
 \loadmarkfile{core-ctx} % this order might change but we need to check depedencies / move to another namespace
 
-\loadmarkfile{core-ini}
 \loadmarkfile{core-def}
 
 %usemodule[x][res-04] % xml resource libraries
diff --git a/tex/context/base/core-con.mkiv b/tex/context/base/core-con.mkiv
index 241d43165..5979bfe37 100644
--- a/tex/context/base/core-con.mkiv
+++ b/tex/context/base/core-con.mkiv
@@ -20,35 +20,27 @@
 \ifdefined\currentlanguage \else \let\currentlanguage\empty              \fi
 \ifdefined\labeltext       \else \let\labeltext      \firstofoneargument \fi
 
-%D This module deals with all kind of conversions from numbers
-%D and dates. I considered splitting this module in a support
-%D one and a core one, but to keep things simple as well as
-%D preserve the overview, I decided against splitting.
+%D This module deals with all kind of conversions from numbers and dates. I
+%D considered splitting this module in a support one and a core one, but to keep
+%D things simple as well as preserve the overview, I decided against splitting.
 
 \let\spr\firstofoneargument % separator
 \let\stp\firstofoneargument % stopper
 
-% cleaner, some day:
-%
-% \def\isolateseparators % etex only, even works with list separator overloading
-%   {\unexpanded\def\spr##1{{##1}}%
-%    \unexpanded\def\stp##1{{##1}}}
-
-% needed for arab :
+% needed for arab:
 
 \unexpanded\def\isolateseparators % even works with list separator overloading
-  {\def\spr##1{{##1}}%
-   \def\stp##1{{##1}}}
+  {\def\spr##1{{##1}}%            % we can probably best mess around with zwj
+   \def\stp##1{{##1}}}            % and friends
 
 %D \macros
 %D   {numbers}
 %D
-%D First we deal with the dummy conversion of numbers using the
-%D \TEX\ primitive \type{\number}. The uppercase alternative is
-%D only there for compatibility with the other conversion
-%D macros. We could do without \type{#1} but this way we get
-%D rid of unwanted braces. For the savety we also define a
-%D non||sence uppercase alternative.
+%D First we deal with the dummy conversion of numbers using the \TEX\ primitive
+%D \type{\number}. The uppercase alternative is only there for compatibility with
+%D the other conversion macros. We could do without \type{#1} but this way we get
+%D rid of unwanted braces. For the savety we also define a non||sence uppercase
+%D alternative.
 %D
 %D \showsetup{numbers}
 %D
@@ -57,8 +49,8 @@
 %D \def\Numbers#1{\number#1}
 %D \stoptyping
 %D
-%D Due to read ahead, as in \type{[\pagenumber\space]} the space will
-%D disappear, unless we use:
+%D Due to read ahead, as in \type{[\pagenumber\space]} the space will disappear,
+%D unless we use:
 
 \def\numbers#1{\purenumber{#1}}
 \def\Numbers#1{\purenumber{#1}}
@@ -66,10 +58,9 @@
 %D \macros
 %D   {romannumerals,Romannumerals}
 %D
-%D \TEX\ the program uses a rather tricky conversion from
-%D numbers to their roman counterparts. This conversion could
-%D of course be programmed in \TEX\ itself, but I guess Knuth
-%D found the programming trick worth presenting.
+%D \TEX\ the program uses a rather tricky conversion from numbers to their roman
+%D counterparts. This conversion could of course be programmed in \TEX\ itself, but
+%D I guess Knuth found the programming trick worth presenting.
 %D
 %D \showsetup{romannumerals}
 %D \showsetup{Romannumerals}
@@ -113,9 +104,9 @@
 %D \macros
 %D   {character,Character}
 %D
-%D Converting a number into a character can of course only
-%D be done with numbers less or equal to~26. At the cost of
-%D much more macros a faster conversion is possible, using:
+%D Converting a number into a character can of course only be done with numbers
+%D less or equal to~26. At the cost of much more macros a faster conversion is
+%D possible, using:
 %D
 %D \starttyping
 %D \setvalue{char1}{a} \def\character#1{\getvalue{char#1}}
@@ -134,9 +125,8 @@
 %D \macros
 %D   {characters,Characters}
 %D
-%D Converting large numbers is supported by the next two
-%D macros. This time we just count on: $\cdots$~x, y, z, aa,
-%D ab, ac~$\cdots$.
+%D Converting large numbers is supported by the next two macros. This time we
+%D just count on: $\cdots$~x, y, z, aa, ab, ac~$\cdots$.
 %D
 %D \showsetup{characters}
 %D \showsetup{Characters}
@@ -174,9 +164,8 @@
 %D \macros
 %D   {protectconversion}
 %D
-%D The previous two commands are not robust enough to be
-%D passed to \type{\write} en \type{\message}. That's why we
-%D introduce:
+%D The previous two commands are not robust enough to be passed to \type
+%D {\write} en \type{\message}. That's why we introduce:
 
 \unexpanded\def\protectconversion
   {\let\doconvertcharacters\firstofoneargument}
@@ -184,10 +173,9 @@
 %D \macros
 %D   {normaltime,normalyear,normalmonth,normalday}
 %D
-%D The last part of this module is dedicated to converting
-%D dates. Because we want to use as meaningful commands as
-%D possible, and because \TEX\ already uses up some of those,
-%D we save the original meanings.
+%D The last part of this module is dedicated to converting dates. Because we
+%D want to use as meaningful commands as possible, and because \TEX\ already
+%D uses up some of those, we save the original meanings.
 
 \savenormalmeaning\time
 \savenormalmeaning\year
@@ -197,10 +185,9 @@
 %D \macros
 %D   {month,MONTH}
 %D
-%D Converting the month number into a month name is done
-%D using a case statement, abstact values and the label
-%D mechanism. This way users can easily redefine a label from
-%D for instance german into austrian.
+%D Converting the month number into a month name is done using a case statement,
+%D abstact values and the label mechanism. This way users can easily redefine a
+%D label from for instance german into austrian.
 %D
 %D \starttyping
 %D \setuplabeltext [de] [january=J\"anner]
@@ -224,11 +211,9 @@
 \def\MONTHLONG #1{\WORD{\monthlong {#1}}}
 \def\MONTHSHORT#1{\WORD{\monthshort{#1}}}
 
-%D We never explicitly needed this, but Tobias Burnus pointed
-%D out that it would be handy to convert to the day of the
-%D week. In doing so, we have to calculate the total number of
-%D days, taking leapyears into account. For those who are
-%D curious:
+%D We never explicitly needed this, but Tobias Burnus pointed out that it would be
+%D handy to convert to the day of the week. In doing so, we have to calculate the
+%D total number of days, taking leapyears into account. For those who are curious:
 %D
 %D \startitemize[packed]
 %D \item  years that can be divided by 4 are leapyears
@@ -239,8 +224,7 @@
 %D \macros
 %D   {weekday,WEEKDAY}
 %D
-%D The first one is sort of redundant. It takes the day
-%D number argument.
+%D The first one is sort of redundant. It takes the day number argument.
 %D
 %D \showsetup{weekday}
 %D \showsetup{WEEKDAY}
@@ -277,15 +261,15 @@
 %D \getbuffer
 %D \stoplines
 %D
-%D The macro \type {\getdayoftheweek} can be used to calculate
-%D the number \type {\normalweekday}.
+%D The macro \type {\getdayoftheweek} can be used to calculate the number
+%D \type {\normalweekday}.
 
 %D \macros
 %D   {doifleapyearelse,
 %D    getdayspermonth}
 %D
-%D Sometimes we need to know if we're dealing with a
-%D leapyear, so here is a testmacro:
+%D Sometimes we need to know if we're dealing with a leapyear, so here is a
+%D testmacro:
 %D
 %D \starttyping
 %D \doifleapyearelse{year}{yes}{no}
@@ -297,8 +281,7 @@
 %D \getdayspermonth{year}{month}
 %D \stoptyping
 %D
-%D The number of days is available in the macro \type
-%D {\numberofdays}.
+%D The number of days is available in the macro \type {\numberofdays}.
 
 \def\doifleapyearelse#1%
   {\ctxcommand{doifleapyearelse(\number#1)}}
@@ -320,13 +303,11 @@
 %D \macros
 %D   {currentdate, rawdate, date}
 %D
-%D We use these conversion macros in the date formatting
-%D macro:
+%D We use these conversion macros in the date formatting macro:
 %D
 %D \showsetup{currentdate}
 %D
-%D This macro takes care of proper spacing and delivers for
-%D instance:
+%D This macro takes care of proper spacing and delivers for instance:
 %D
 %D \startbuffer
 %D \currentdate[weekday,day,month,year] % still dutch example
@@ -351,8 +332,8 @@
 %D
 %D or typeset: \getbuffer.
 %D
-%D When no argument is passed, the current date is given as
-%D specified per language (using \type{\installlanguage}).
+%D When no argument is passed, the current date is given as specified per
+%D language (using \type{\installlanguage}).
 %D
 %D \showsetup{currentdate}
 %D
@@ -367,8 +348,8 @@
 %D
 %D \typebuffer
 %D
-%D The date is specified by one character keys. When no date
-%D is given, we get the current date.
+%D The date is specified by one character keys. When no date is given, we
+%D get the current date.
 %D
 %D \startlines
 %D \getbuffer
@@ -430,10 +411,13 @@
 \def\syst_converters_date[#1][#2]%
   {\begingroup
    \iffirstargument
-     \getparameters[\??da][d=\normalday,m=\normalmonth,y=\normalyear,#1]%
-     \normalday  \@@dad\relax
-     \normalmonth\@@dam\relax
-     \normalyear \@@day\relax
+     \letdummyparameter\c!d\normalday
+     \letdummyparameter\c!m\normalmonth
+     \letdummyparameter\c!y\normalyear
+     \getdummyparameters[#1]%
+     \normalday  \directdummyparameter\c!d\relax
+     \normalmonth\directdummyparameter\c!m\relax
+     \normalyear \directdummyparameter\c!y\relax
    \fi
    \syst_converters_current_date[#2]%
    \endgroup}
@@ -444,9 +428,8 @@
 %D \macros
 %D   {currenttime}
 %D
-%D The currenttime is actually the jobtime. You can specify
-%D a pattern similar to the previous date macro using the
-%D keys \type {h}, \type {m} and a separator.
+%D The currenttime is actually the jobtime. You can specify a pattern similar
+%D to the previous date macro using the keys \type {h}, \type {m} and a separator.
 
 \unexpanded\def\calculatecurrenttime
   {\edef\currenthour  {\ctxcommand{hour  ()}}%
@@ -462,7 +445,6 @@
 \unexpanded\def\currenttime
   {\doifnextoptionalelse\syst_converters_current_time_yes\syst_converters_current_time_nop}
 
-
 \unexpanded\def\syst_converters_current_time_yes[#1]%
   {\calculatecurrenttime
    \processallactionsinset[#1][h=>\currenthour,m=>\currentminute,\s!unknown=>\commalistelement]}
@@ -471,16 +453,15 @@
   {\normalexpanded{\syst_converters_current_time_yes[\currenttimespecification]}}
 
 
-%D Because we're dealing with dates, we also introduce a few
-%D day loops:
+%D Because we're dealing with dates, we also introduce a few day loops:
 %D
 %D \starttyping
 %D \processmonth{year}{month}{command}
 %D \processyear{year}{command}{before}{after}
 %D \stoptyping
 %D
-%D The counters \type {\normalyear}, \type {\normalmonth} and
-%D \type{\normalday} can be used for for date manipulations.
+%D The counters \type {\normalyear}, \type {\normalmonth} and \type {\normalday}
+%D can be used for for date manipulations.
 
 \unexpanded\def\processmonth#1#2#3% year month command
   {\begingroup
@@ -505,15 +486,13 @@
 %D \macros
 %D   {defineconversion, convertnumber}
 %D
-%D Conversion involves the macros that we implemented earlier
-%D in this module.
+%D Conversion involves the macros that we implemented earlier in this module.
 %D
 %D \showsetup{defineconversion}
 %D \showsetup{convertnumber}
 %D
-%D We can feed this command with conversion macros as well as
-%D a set of conversion symbols. Both need a bit different
-%D treatment.
+%D We can feed this command with conversion macros as well as a set of conversion
+%D symbols. Both need a bit different treatment.
 %D
 %D \starttyping
 %D \defineconversion [roman] [\romannumerals]
@@ -549,9 +528,9 @@
 \def\syst_converters_checked_conversion#1#2%
   {\ctxcommand{checkedconversion("#1",#2)}}
 
-%D If a conversion is just a font switch then we need to make sure
-%D that the number is indeed end up as number in the input, so we
-%D need to handle the second argument.
+%D If a conversion is just a font switch then we need to make sure that the
+%D number is indeed end up as number in the input, so we need to handle the
+%D second argument.
 
 \def\convertnumber#1#2% expandable
   {\csname\??conversionarguments
@@ -600,19 +579,17 @@
 %D \macros
 %D   {ordinaldaynumber, highordinalstr, ordinalstr}
 %D
-%D Efficient general ordinal number converters are sometimes
-%D difficult to implement. Fortunately dates never exceed the
-%D number~31.
+%D Efficient general ordinal number converters are sometimes difficult to
+%D implement. Fortunately dates never exceed the number~31.
 
 \def\highordinalstr     #1{\high{\notsmallcapped{#1}}}
 \def\ordinalstr         #1{\notsmallcapped{#1}}
 \def\ordinaldaynumber   #1{\ctxcommand{ordinal(#1,"\currentlanguage")}}
 
-%D As longs as symbols are linked to levels or numbers, we can
-%D also use the conversion mechanism, but in for instance the
-%D itemization macros, we prefer symbols because they can more
-%D easier be (partially) redefined. Symbols are implemented
-%D in another module.
+%D As longs as symbols are linked to levels or numbers, we can also use the
+%D conversion mechanism, but in for instance the itemization macros, we prefer
+%D symbols because they can more easier be (partially) redefined. Symbols are
+%D implemented in another module.
 
 \def\smallcappedromannumerals#1{\smallcapped{\romannumerals{#1}}}
 \def\smallcappedcharacters   #1{\smallcapped{\characters   {#1}}}
diff --git a/tex/context/base/core-def.mkiv b/tex/context/base/core-def.mkiv
index 5423b97aa..d418689ef 100644
--- a/tex/context/base/core-def.mkiv
+++ b/tex/context/base/core-def.mkiv
@@ -24,38 +24,87 @@
 
 \setupinteraction[\c!symbolset=navigation 1]
 
+% what a mess
+
+\everypar  \emptytoks
+\neverypar \emptytoks
+
+\appendtoks
+  % \flushnotes
+    \page_otr_command_synchronize_side_floats % an otr specific command
+    \checkindentation
+    \showparagraphnumber
+    \restoreinterlinepenalty
+  % \flushmargincontents
+  % \flushcommentanchors
+    \flushnotes
+    \synchronizenotes
+    \OTRSETshowstatus
+    \registerparoptions
+  % \flushsyncpositions
+    \flushpostponednodedata
+    \typo_delimited_repeat
+    \insertparagraphintro
+\to \everypar
+
+\appendtoks
+    \flushnotes
+\to \everydisplay
+
+\appendtoks
+    \adjustsidefloatdisplaylines
+\to \everydisplay
+
+% \appendtoks
+%     \flushsyncpositions
+% \to \everyheadstart
+
+% \appendtoks
+%     \flushsyncresets
+% \to \everyendoftextbody
+
+\appendtoks
+    \ignorespaces
+\to \everybeginofpar
+
+\appendtoks
+    \removeunwantedspaces
+  % \strut                % option ?
+  % \flushsyncresets
+  % \setlastlinewidth     % gone, will be done in lua
+    \endgraf
+\to \everyendofpar
+
 % initialization order:
 
 \ifdefined\font_preloads_at_every_job  \else \let\font_preloads_at_every_job \relax \fi
 \ifdefined\font_preloads_at_start_text \else \let\font_preloads_at_start_text\relax \fi
 \ifdefined\font_preloads_at_stop_text  \else \let\font_preloads_at_stop_text \relax \fi
 
-\appendtoks  \font_preloads_at_start_text          \to \everystarttext
-\appendtoks  \font_preloads_at_stop_text           \to \everystoptext
-
-\appendtoks  \showcontextbanner                    \to \everyjob
-\appendtoks  \initializenewlinechar                \to \everyjob
-\appendtoks  \calculatecurrenttime                 \to \everyjob
-\appendtoks  \loadsystemfiles                      \to \everyjob
-
-\appendtoks  \loadoptionfile                       \to \everyjob % obsolete
 \appendtoks
-    \job_options_get_commandline % expands some commands
-    \job_options_get_ctxfile     % might expand some commands
-\to \everyjob % ok here?
-
-\appendtoks  \font_preloads_at_every_job           \to \everyjob
-\appendtoks  \settopskip                           \to \everyjob
-\appendtoks  \initializemainlanguage               \to \everyjob
-\appendtoks  \xmlinitialize                        \to \everyjob % is this still needed?
-\appendtoks  \setfalse\c_page_backgrounds_new      \to \everyjob
-\appendtoks  \setfalse\c_page_backgrounds_some     \to \everyjob
-\appendtoks  \initializepagecounters               \to \everyjob
+    \font_preloads_at_start_text
+\to \everystarttext
 
-\appendtoks  \directsetup{*runtime:options}        \to \everyjob % obsolete
-\appendtoks  \directsetup{*runtime:modules}        \to \everyjob % obsolete
+\appendtoks
+    \font_preloads_at_stop_text
+\to \everystoptext
 
 \appendtoks
+    \showcontextbanner
+    \initializenewlinechar
+    \calculatecurrenttime
+    \loadsystemfiles
+  % \loadoptionfile                       % obsolete, but nice to keep as reference of when/how
+    \job_options_get_commandline          % expands some commands
+    \job_options_get_ctxfile              % might expand some commands
+    \font_preloads_at_every_job
+    \settopskip                           % brrr
+    \initializemainlanguage
+    \initializexmlprocessing              % is this still needed?
+    \initializepagebackgrounds
+    \initializepagecounters
+  % \directsetup{*runtime:options}%       % obsolete as the option file is replaced by a more direct mechanism
+  % \directsetup{*runtime:modules}%       % obsolete as the option file is replaced by a more direct mechanism
     \job_options_set_modes
     \job_options_set_modules
     \job_options_set_environments
@@ -65,14 +114,25 @@
     \job_options_log
 \to \everystarttext
 
-\appendtoks  \ifarrangingpages\poparrangedpages\fi \to \everybye
+\appendtoks
+    \ifarrangingpages\poparrangedpages\fi
+\to \everybye
+
+\prependtoks
+    \resetallattributes
+\to \everybeforeoutput
 
-\prependtoks \resetallattributes                   \to \everybeforeoutput
+\appendtoks
+    \the\everybackendshipout
+\to \everyshipout
 
-\appendtoks  \the\everybackendshipout              \to \everyshipout
-\prependtoks \the\everylastbackendshipout          \to \everylastshipout
+\prependtoks
+    \the\everylastbackendshipout
+\to \everylastshipout
 
-\prependtoks \lefttoright                          \to \everybeforeoutput
+\prependtoks
+    \lefttoright
+\to \everybeforeoutput
 
 % temporary here:
 
diff --git a/tex/context/base/core-env.mkiv b/tex/context/base/core-env.mkiv
index 1819d084d..6b369b29a 100644
--- a/tex/context/base/core-env.mkiv
+++ b/tex/context/base/core-env.mkiv
@@ -625,4 +625,51 @@
 \def\env                   {\getvariable       \s!environment}
 \def\envvar                {\getvariabledefault\s!environment}
 
+%D \macros
+%D   {defineselector,setupselector,select,directselect}
+%D
+%D \starttyping
+%D \defineselector[caption][max=2,n=2]
+%D
+%D \start
+%D     \setupselector[caption][n=1]
+%D     \placelist[figure][criterium=all]
+%D \stop
+%D
+%D \starttext
+%D     \placefigure
+%D       {\select{caption}{zapf}{\input zapf \relax}}
+%D       {}
+%D \stoptext
+%D \stoptyping
+
+\installcorenamespace{selector}
+
+\unexpanded\def\defineselector{\dodoubleargument\syst_selectors_define}
+\unexpanded\def\setupselector {\dodoubleargument\syst_selectors_setup}
+
+% \def\syst_selectors_define[#1][#2]{\getparameters[\??selector#1][\c!max=\plusone,\c!n=\plusone,#2]}
+% \def\syst_selectors_setup [#1][#2]{\getparameters[\??selector#1][#2]}
+
+\def\syst_selectors_define[#1][{\getparameters[\??selector#1][\c!max=\plustwo,\c!n=\plusone,}
+\def\syst_selectors_setup [#1][{\getparameters[\??selector#1][}
+
+\unexpanded\def\select % unexpandable
+  {\directselect}
+
+% \def\directselect#1% expandable
+%   {\filterfromnext % maybe add an \expanded
+%      {\csname\??selector\ifcsname\??selector#1\c!max\endcsname#1\fi\c!max\endcsname}%
+%      {\csname\??selector\ifcsname\??selector#1\c!n  \endcsname#1\fi\c!n  \endcsname}}
+%
+% this is more efficient when the arguments are used a few times (or passed along):
+
+\def\directselect#1% expandable
+  {\expandafter\filterfromnext
+     \csname\??selector\ifcsname\??selector#1\c!max\endcsname#1\fi\c!max\expandafter\endcsname
+     \csname\??selector\ifcsname\??selector#1\c!n  \endcsname#1\fi\c!n  \endcsname}
+
+\letvalue{\??selector\c!max}\plusone
+\letvalue{\??selector\c!n  }\plusone
+
 \protect \endinput
diff --git a/tex/context/base/core-ini.mkiv b/tex/context/base/core-ini.mkiv
index 6235d5bde..7b32cb3a2 100644
--- a/tex/context/base/core-ini.mkiv
+++ b/tex/context/base/core-ini.mkiv
@@ -13,58 +13,199 @@
 
 \writestatus{loading}{ConTeXt Core Macros / Additional Initialization}
 
-%D We will move more code to here, so that we become less dependent of the
-%D orde in which modules are loaded.
-
 \unprotect
 
-\everypar  \emptytoks
-\neverypar \emptytoks
+%D We introduce a couple of variables that are used all over \CONTEXT. Alternatively
+%D we could define them in each module but as they are part of the bigger picture we
+%D prefer to do it here. Ideally we should hav ea proper dependency tree but it might
+%D be that we want to make versions with a smaller footprints in which case one would
+%D still need to define the token list registers (unless we could do that runtime).
 
-\appendtoks
-    %flushnotes
-    \page_otr_command_synchronize_side_floats % an otr specific command
-    \checkindentation
-    \showparagraphnumber
-    \restoreinterlinepenalty
-    %flushmargincontents
-    %flushcommentanchors
-    \flushnotes
-    \synchronizenotes
-    \OTRSETshowstatus
-    \registerparoptions
-   %\flushsyncpositions
-    \flushpostponednodedata
-    \typo_delimited_repeat
-    \insertparagraphintro
-\to \everypar
+%D \macros
+%D   {every...}
+%D
+%D A few every's.
 
-\appendtoks
-    \flushnotes
-\to \everydisplay
+%D Output routine:
+
+\newtoks \everybeforeoutput
+\newtoks \everyafteroutput
+
+%D Shipout:
+
+\newtoks \everyshipout
+\newtoks \everybeforeshipout
+\newtoks \everyaftershipout
+\newtoks \everyfirstshipout
+\newtoks \everylastshipout
+
+%D End of run:
+
+\newtoks \everybye
+\newtoks \everygoodbye
+\newtoks \everynotabene
+
+%D Document:
+
+\newtoks \everysetupdocument
+\newtoks \everyendoftextbody
+
+\newtoks \everystarttext
+\newtoks \everystoptext
+
+%D Purity:
+
+\newtoks \everyforgetall
+\newtoks \everycleanupfeatures
+\newtoks \everysimplifycommands
+
+\let\simplifiedcommands\everysimplifycommands % backward compatible, will stay as it's used in styles
+
+\unexpanded\def\forgetall       {\the\everyforgetall}
+\unexpanded\def\cleanupfeatures {\the\everycleanupfeatures}
+\unexpanded\def\simplifycommands{\the\everysimplifycommands}
 
 \appendtoks
-    \adjustsidefloatdisplaylines
-\to \everydisplay
+    \everypar\emptytoks % pretty important
+\to \everyforgetall
+
+%D Page building:
+
+\newtoks \everybeforepagebody
+\newtoks \everyafterpagebody
+
+\let\everypagebody\everybeforepagebody % backward compatible, will become obsolete
+
+%D Floats:
+
+\newtoks \everyinsidefloat
+
+%D Sectioning:
+
+\newtoks \everyheadstart
+
+%D Par building (experimental, used in xml <p> .. </p>)
+
+\newtoks \everybeginofpar
+\newtoks \everyendofpar
+%newtoks \everyparflush
+
+\unexpanded\def\bpar{\the\everybeginofpar\ignorespaces}                  % may interfere with \everypar
+\unexpanded\def\epar{\ifhmode\removeunwantedspaces\the\everyendofpar\fi} % test prevents problems with \bpar\epar
+
+%D Lists:
+
+\newtoks \everylistentry
+\newtoks \everysavesortkeys
+
+%D Marks:
 
-% \appendtoks
-%     \flushsyncpositions
-% \to \everyheadstart
+\newtoks \everymarking
 
-% \appendtoks
-%     \flushsyncresets
-% \to \everyendoftextbody
+%D Fonts:
+
+\newtoks \everyfont
+\newtoks \everyglobalbodyfont
+\newtoks \everydefinedfont
+
+\newevery \everybodyfont   \EveryBodyFont
+\newevery \everyfontswitch \EveryFontSwitch
+
+\newtoks \everysetupbodyfont
+\newtoks \everyswitchtobodyfont
+
+%D Math:
+
+\newtoks \everybeforedisplayformula
+\newtoks \everymathematics
+
+\prependtoks \the\everymathematics \to \everymath
+\prependtoks \the\everymathematics \to \everydisplay
+
+%D Tables:
+
+\newtoks \everytable % we need to disstinguish kinds
+
+%D State mess:
+
+\newtoks \everypushsomestate
+\newtoks \everypopsomestate
+
+\unexpanded\def\pushsomestates{\the\everypushsomestate}
+\unexpanded\def\popsomestates {\the\everypopsomestate }
+
+%D More generic (used to be pushcolor etc)
+
+\newtoks\everystarttextproperties
+\newtoks\everystoptextproperties
+
+\unexpanded\def\starttextproperties{\the\everystarttextproperties}
+\unexpanded\def\stoptextproperties {\the\everystoptextproperties}
+
+%D \macros
+%D   {trialtypesetting}
+%D
+%D We disable trial typesetting in the output routine,
+%D just to be sure.
+
+\prependtoks
+    \resettrialtypesetting
+\to \everybeforepagebody
+
+%D \macros
+%D   {ifinpagebody,ifinsidecolumns,ifdoublesided,ifsinglesided}
+%D
+%D These will become system modes and conditionals
+
+\newif \ifinpagebody
+\newif \ifinsidecolumns
+\newif \ifdoublesided   \doublesidedfalse
+\newif \ifsinglesided   \singlesidedtrue
+\newif \ifinsidefloat
+\newif \ifdoingblocks
+\newif \ifgridsnapping
+
+%D \macros
+%D   {ifproductionrun}
+%D
+%D This boolean can be used to bypass certain initializations.
+
+\newif\ifproductionrun
 
 \appendtoks
-    \ignorespaces
-\to \everybeginofpar
+    \productionruntrue
+\to \everydump
+
+%D \macros
+%D   {everyboxedcontent, ifboxedcontent,
+%D    startboxedcontent, stopboxedcontent}
+%D
+%D This one is relatively new and will be used as a more robust test for inner
+%D situations.
+
+\newif  \ifboxedcontent
+\newtoks\everyboxedcontent
 
 \appendtoks
-    \removeunwantedspaces
-    %strut                % option ?
-  % \flushsyncresets
-    %setlastlinewidth     % gone, will be done in lua
-    \endgraf
-\to \everyendofpar
+    \boxedcontenttrue
+\to \everyboxedcontent
+
+\unexpanded\def\startboxedcontent{\bgroup\the\everyboxedcontent}
+
+\let\stopboxedcontent\egroup
+
+%D We store some original meanings, maybe in \type {math-ini}.
+
+\let\normalat   \at
+\let\normalin   \in
+\let\normalfrom \from
+%let\normalover \over
+\let\normalabout\about
+
+%D This will be implemented way later:
+
+\let\setlayoutcomponentattribute  \gobbleoneargument
+\let\resetlayoutcomponentattribute\relax
+\let\layoutcomponentboxattribute  \empty
 
 \protect \endinput
diff --git a/tex/context/base/core-var.mkiv b/tex/context/base/core-var.mkiv
deleted file mode 100644
index f9baa8995..000000000
--- a/tex/context/base/core-var.mkiv
+++ /dev/null
@@ -1,254 +0,0 @@
-%D \module
-%D   [       file=core-var,
-%D        version=1998.02.21,
-%D          title=\CONTEXT\ Core Macros,
-%D       subtitle=Variables,
-%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 Core Macros / Variables}
-
-\unprotect
-
-%D Much of this will move to *-ini files.
-
-%D We introduce a couple of variables that are used all over
-%D \CONTEXT. Alternatively we could define them in each module
-%D but as they are part of the bigger picture we prefer to do
-%D it here.
-
-%D \macros
-%D   {every...}
-%D
-%D A few every's. Some are only used in \MKII\ or \MKIV.
-
-%D Output routine:
-
-\newtoks \everybeforeoutput
-\newtoks \everyafteroutput
-
-%D Shipout:
-
-\newtoks \everyshipout
-\newtoks \everybeforeshipout
-\newtoks \everyaftershipout
-\newtoks \everyfirstshipout
-\newtoks \everylastshipout
-
-%D End of run:
-
-\newtoks \everybye
-\newtoks \everygoodbye
-\newtoks \everynotabene
-
-%D Document
-
-\newtoks \everysetupdocument
-\newtoks \everyendoftextbody
-
-\newtoks \everystarttext
-\newtoks \everystoptext
-
-%D Purity:
-
-\newtoks \everyforgetall
-\newtoks \everycleanupfeatures
-
-\unexpanded\def\cleanupfeatures{\the\everycleanupfeatures}
-\unexpanded\def\forgetall      {\the\everyforgetall}
-
-\appendtoks
-    \everypar\emptytoks % pretty important
-\to \everyforgetall
-
-%D Page building:
-
-\newtoks \everybeforepagebody
-\newtoks \everyafterpagebody
-
-\let \everypagebody \everybeforepagebody % backward compatible, will become obsolete
-
-%D Floats:
-
-\newtoks \everyinsidefloat
-
-%D Sectioning:
-
-\newtoks \everyheadstart
-
-%D Par building (experimental, used in xml <p> .. </p>)
-
-\newtoks \everybeginofpar
-\newtoks \everyendofpar
-%newtoks \everyparflush
-
-\unexpanded\def\bpar{\dostarttagged\t!paragraph\empty\the\everybeginofpar\ignorespaces} % may interfere with \everypar
-\unexpanded\def\epar{\ifhmode\removeunwantedspaces\the\everyendofpar\fi\dostoptagged  } % test prevents problems with \bpar\epar
-
-%D Lists:
-
-\newtoks \everylistentry
-\newtoks \everysavesortkeys
-
-%D Marks:
-
-\newtoks \everymarking
-
-%D Fonts:
-
-\newtoks \everyfont
-\newtoks \everyglobalbodyfont
-\newtoks \everydefinedfont
-
-\newevery \everybodyfont   \EveryBodyFont
-\newevery \everyfontswitch \EveryFontSwitch
-
-\newtoks \everysetupbodyfont
-\newtoks \everyswitchtobodyfont
-
-%D Math:
-
-\newtoks \everybeforedisplayformula
-\newtoks \everymathematics
-
-\prependtoks \the\everymathematics \to \everymath
-\prependtoks \the\everymathematics \to \everydisplay
-
-%D Tables
-
-\newtoks \everytable
-
-%D Simplification:
-
-\newtoks \simplifiedcommands
-
-\unexpanded\def\simplifycommands
-  {\the\simplifiedcommands}
-
-\appendtoks
-    \let\ =\space
-\to \simplifiedcommands
-
-%D State mess:
-
-\newtoks \everypushsomestate
-\newtoks \everypopsomestate
-
-\def\pushsomestates{\the\everypushsomestate}
-\def\popsomestates {\the\everypopsomestate }
-
-%D More generic (used to be pushcolor etc)
-
-\newtoks\everystarttextproperties
-\newtoks\everystoptextproperties
-
-\unexpanded\def\starttextproperties{\the\everystarttextproperties}
-\unexpanded\def\stoptextproperties {\the\everystoptextproperties}
-
-%D \macros
-%D   {trialtypesetting}
-%D
-%D We disable trial typesetting in the output routine,
-%D just to be sure.
-
-\prependtoks \resettrialtypesetting \to \everybeforepagebody
-
-%D \macros
-%D   {ifinpagebody,ifinsidecolumns,ifdoublesided,ifsinglesided}
-
-\newif \ifinpagebody
-\newif \ifinsidecolumns
-\newif \ifdoublesided   \doublesidedfalse
-\newif \ifsinglesided   \singlesidedtrue
-\newif \ifinsidefloat
-\newif \ifdoingblocks
-\newif \ifgridsnapping
-
-%D \macros
-%D   {ifprocessingXML}
-%D
-%D We need this one even if no \XML\ is supported.
-
-% \newif\ifprocessingXML % old way
-
-%D \macros
-%D   {ifproductionrun}
-%D
-%D This boolean can be used to bypass certain
-%D initializations.
-
-\newif\ifproductionrun   \appendtoks \productionruntrue \to \everydump
-
-%D \macros
-%D   {everyboxedcontent, ifboxedcontent,
-%D    startboxedcontent, stopboxedcontent}
-%D
-%D This one is relatively new and will be used as a more
-%D robust test for inner situations.
-
-\newif  \ifboxedcontent
-\newtoks\everyboxedcontent
-
-\appendtoks \boxedcontenttrue \to \everyboxedcontent
-
-\unexpanded\def\startboxedcontent{\bgroup\the\everyboxedcontent}
-\let\stopboxedcontent  \egroup
-
-%D \macros
-%D   {fastmode,silentmode}
-%D
-%D These commands are obsolete.
-
-\let\fastmode  \relax
-\let\silentmode\relax
-
-%D \macros
-%D   {defineselector,setupselector}
-%D
-%D \starttyping
-%D \defineselector[caption][max=2,n=2]
-%D
-%D \start
-%D     \setupselector[caption][n=1]
-%D     \placelist[figure][criterium=all]
-%D \stop
-%D
-%D \starttext
-%D     \placefigure
-%D       {\select{caption}{zapf}{\input zapf \relax}}
-%D       {}
-%D \stoptext
-%D \stoptyping
-
-\unexpanded\def\defineselector{\dodoubleargument\dodefineselector}
-\unexpanded\def\setupselector {\dodoubleargument\dosetupselector}
-
-\def\dodefineselector[#1][#2]{\getparameters[\??sx#1][\c!max=2,\c!n=1,#2]}
-\def\dosetupselector [#1][#2]{\getparameters[\??sx#1][#2]}
-
-\unexpanded\def\select#1%
-  {\filterfromnext
-     {\executeifdefined{\??sx#1\c!max}1}
-     {\executeifdefined{\??sx#1\c!n  }1}}
-
-%D We store some original meanings, maybe in \type
-%D {math-ini}.
-
-\let\normalat   \at
-\let\normalin   \in
-\let\normalfrom \from
-%let\normalover \over
-\let\normalabout\about
-
-%D Add-ons:
-
-\let\setlayoutcomponentattribute  \gobbleoneargument
-\let\resetlayoutcomponentattribute\relax
-\let\layoutcomponentboxattribute  \empty
-
-\protect \endinput
diff --git a/tex/context/base/enco-ini.mkiv b/tex/context/base/enco-ini.mkiv
index 816e59d9d..aca70f0c0 100644
--- a/tex/context/base/enco-ini.mkiv
+++ b/tex/context/base/enco-ini.mkiv
@@ -385,6 +385,6 @@
 
 \appendtoks
     \let\buildtextaccent\secondoftwoarguments
-\to \simplifiedcommands
+\to \everysimplifycommands
 
 \protect \endinput
diff --git a/tex/context/base/file-ini.mkvi b/tex/context/base/file-ini.mkvi
index b0f6244aa..989241dd1 100644
--- a/tex/context/base/file-ini.mkvi
+++ b/tex/context/base/file-ini.mkvi
@@ -73,15 +73,17 @@
 %D \popendofline
 %D \stoptyping
 
+\installsystemnamespace{eolstack}
+
 \newcount\c_system_files_eol_level
 
 \unexpanded\def\pushendofline
   {\advance\c_system_files_eol_level\plusone
-   \expandafter\chardef\csname\??fi:eol:\number\c_system_files_eol_level\endcsname\catcode\endoflineasciicode
+   \expandafter\chardef\csname\??eolstack\number\c_system_files_eol_level\endcsname\catcode\endoflineasciicode
    \catcode\endoflineasciicode\commentcatcode}
 
 \unexpanded\def\popendofline
-  {\catcode\endoflineasciicode\csname\??fi:eol:\number\c_system_files_eol_level\endcsname
+  {\catcode\endoflineasciicode\csname\??eolstack\number\c_system_files_eol_level\endcsname
    \advance\c_system_files_eol_level\minusone}
 
 \unexpanded\def\restoreendofline
@@ -101,11 +103,11 @@
    \the\everystartreadingfile
    \pushcatcodetable       % saveguard
    \setcatcodetable\ctxcatcodes
-   \ctxlua{regimes.push()}}% temporarily this way
+   \ctxcommand{pushregime()}}% temporarily this way
 
 \unexpanded\def\stopreadingfile
   {\popcatcodetable      % saveguard
-   \ctxlua{regimes.pop()}% temporarily this way
+   \ctxcommand{popregime()}% temporarily this way
    \the\everystopreadingfile
    \global\advance\readingfilelevel\minusone}
 
@@ -203,11 +205,13 @@
 %D This command obeys the standard method for locating files. We could
 %D move this function to the \LUA\ end.
 
+\installsystemnamespace {fileonce}
+
 \unexpanded\def\doonlyonce#whatever%
-  {\ifcsname\??fi:#whatever\endcsname
+  {\ifcsname\??fileonce#whatever\endcsname
      \expandafter\gobbleoneargument
    \else
-     \letgvalue{\??fi:#whatever}\relax
+     \letgvalue{\??fileonce#whatever}\relax
      \expandafter\firstofoneargument
    \fi}
 
@@ -215,11 +219,11 @@
   {\doonlyonce{#name}{\doiffileelse{#name}{\inputgivenfile{#name}}\donothing}}
 
 \unexpanded\def\doendinputonce#name%
-  {\ifcsname\??fi:#name\endcsname
+  {\ifcsname\??fileonce#name\endcsname
      \expandafter\endinput
    \fi}
 
 \unexpanded\def\forgetdoingonce#whatever%
-  {\global\letbeundefined{\??fi:#whatever}}
+  {\global\letbeundefined{\??fileonce#whatever}}
 
 \protect \endinput
diff --git a/tex/context/base/file-job.mkvi b/tex/context/base/file-job.mkvi
index 4a54c6b2f..3bde3f268 100644
--- a/tex/context/base/file-job.mkvi
+++ b/tex/context/base/file-job.mkvi
@@ -75,17 +75,14 @@
 \def\syst_files_load#name% only mkiv files
   {\readsysfile{#name.\mksuffix}{\showmessage\m!system2{#name.\mksuffix}}\donothing}
 
+% obsolete, but we keep it as reference of what happened
+%
 % \unexpanded\def\loadoptionfile
 %   {\readjobfile{\jobname.\f!optionextension}
 %      {\writestatus\m!system{\jobname.\f!optionextension\space loaded}%
 %       \ctxcommand{copyfiletolog("\jobname.\f!optionextension")}}%
 %      {\writestatus\m!system{no \jobname.\f!optionextension}}}
 
-\unexpanded\def\loadoptionfile % this one is soon obsolete
-  {\readjobfile{\jobname.\f!optionextension}
-     {\ctxcommand{copyfiletolog("\jobname.\f!optionextension")}}%
-     {}}
-
 % document structure
 
 \ifdefined\textlevel\else \newcount\textlevel \fi % might go away
diff --git a/tex/context/base/font-sty.mkvi b/tex/context/base/font-sty.mkvi
index d8f01afa7..3e1bb96da 100644
--- a/tex/context/base/font-sty.mkvi
+++ b/tex/context/base/font-sty.mkvi
@@ -84,7 +84,7 @@
 
 % \appendtoks
 %     \let\groupedcommand\thirdofthreearguments
-% \to \simplifiedcommands
+% \to \everysimplifycommands
 
 %D This command also defines the keyword as command. This means
 %D that the example definition of \type{bold} we gave before,
diff --git a/tex/context/base/grph-raw.mkiv b/tex/context/base/grph-raw.mkiv
index 5b488cf58..a40b78455 100644
--- a/tex/context/base/grph-raw.mkiv
+++ b/tex/context/base/grph-raw.mkiv
@@ -45,14 +45,14 @@
 
 \unexpanded\def\bitmapimage[#1]#2%
   {\hbox\bgroup
-     \getparameters[\??gb][\c!color=rgb,\c!width=,\c!height=,\c!x=,\c!y=,#1]%
-     \ctxlua{figures.bitmapimage {
+     \getdummyparameters[\c!color=rgb,\c!width=,\c!height=,\c!x=,\c!y=,#1]%
+     \ctxlua{figures.bitmapimage { % we could pass #1 directly ... todo
         data        = \!!bs#2\!!es,
-        xresolution = "\@@gbx",
-        yresolution = "\@@gby",
-        colorspace  = "\@@gbcolor",
-        width       = "\@@gbwidth",
-        height      = "\@@gbheight"
+        colorspace  = "\directdummyparameter\c!color",
+        width       = "\directdummyparameter\c!width",
+        height      = "\directdummyparameter\c!height"
+        xresolution = "\directdummyparameter\c!x",
+        yresolution = "\directdummyparameter\c!y",
      }}%
    \egroup}
 
diff --git a/tex/context/base/grph-trf.mkiv b/tex/context/base/grph-trf.mkiv
index 4474eb8f1..87193ae4d 100644
--- a/tex/context/base/grph-trf.mkiv
+++ b/tex/context/base/grph-trf.mkiv
@@ -575,8 +575,9 @@
 %D
 %D \showsetup{setupclipping}
 
-\unexpanded\def\setupclipping
-  {\dodoubleargument\getparameters[\??cp]}
+\installcorenamespace{clipping}
+
+\installdirectcommandhandler \??clipping {clipping}
 
 \unexpanded\def\clip
   {\dosingleempty\grph_clip}
@@ -584,62 +585,106 @@
 \def\grph_clip[#1]% nb top->bottom left->right
   {\bgroup
    \iffirstargument
-     \getparameters[\??cp][#1]%
+     \setupcurrentclipping[#1]%
    \fi
    \dowithnextboxcs\grph_clip_finish\hbox}
 
 \def\grph_clip_finish
-  {\doifelse\@@cpstate\v!start
+  {\doifelse{\clippingparameter\c!state}\v!start
      \grph_clip_yes_finish
      \grph_clip_nop_finish}
 
+% \def\grph_clip_yes_finish
+%   {\ifdim\@@cpwidth>\zeropoint
+%      \!!dimena\@@cpwidth
+%      \!!dimenc\@@cphoffset
+%    \else
+%      \!!dimena\wd\nextbox
+%      \divide\!!dimena \@@cpnx
+%      \!!dimenc\@@cpx\!!dimena
+%      \advance\!!dimenc -\!!dimena
+%      \!!dimena\@@cpsx\!!dimena
+%    \fi
+%    \relax % sure
+%    \ifdim\@@cpheight>\zeropoint
+%      \!!dimenb\@@cpheight
+%      \!!dimend\ht\nextbox
+%      \advance\!!dimend -\@@cpvoffset
+%      \advance\!!dimend -\!!dimenb
+%    \else
+%      \!!dimenb\ht\nextbox
+%      \divide\!!dimenb \@@cpny
+%      \!!dimend-\@@cpy\!!dimenb
+%      \advance\!!dimend -\@@cpsy\!!dimenb
+%      \advance\!!dimend \!!dimenb
+%      \!!dimenb\@@cpsy\!!dimenb
+%      \advance\!!dimend \ht\nextbox % dimend !
+%    \fi
+%    \setbox\nextbox\hbox                            % old
+%      {\advance\!!dimenc -\@@cpleftoffset           % new !
+%       \advance\!!dimend -\@@cpbottomoffset         % new ! % - added
+%       \hskip-\!!dimenc\lower\!!dimend\box\nextbox}% old
+%    \wd\nextbox\zeropoint
+%    \ht\nextbox\zeropoint
+%    \dp\nextbox\zeropoint
+%    \setbox\nextbox\hbox
+%      {\advance\!!dimena \@@cpleftoffset         % new !
+%       \advance\!!dimena \@@cprightoffset        % new !
+%       \advance\!!dimenb \@@cpbottomoffset       % new !
+%       \advance\!!dimenb \@@cptopoffset          % new !
+%       \dostartclipping\@@cpmp\!!dimena\!!dimenb % old
+%         \box\nextbox
+%       \dostopclipping}%
+%    \setbox\nextbox\hbox                       % new !
+%      {\!!dimena-\@@cpleftoffset               % new !
+%       \!!dimenb \@@cpbottomoffset             % new ! % - removed
+%       \hskip\!!dimena\lower\!!dimenb\box\nextbox}% new !
+%    \wd\nextbox\!!dimena
+%    \ht\nextbox\!!dimenb
+%    \dp\nextbox\zeropoint
+%    \box\nextbox
+%    \egroup}
+
 \def\grph_clip_yes_finish
-  {\ifdim\@@cpwidth>\zeropoint
-     \!!dimena\@@cpwidth
-     \!!dimenc\@@cphoffset
+  {\ifdim\clippingparameter\c!width>\zeropoint
+     \scratchwidth  \clippingparameter\c!width
+     \scratchxoffset\clippingparameter\c!hoffset
    \else
-     \!!dimena\wd\nextbox
-     \divide\!!dimena \@@cpnx
-     \!!dimenc\@@cpx\!!dimena
-     \advance\!!dimenc -\!!dimena
-     \!!dimena\@@cpsx\!!dimena
+     \scratchwidth\dimexpr\wd\nextbox/\clippingparameter\c!nx\relax
+     \scratchxoffset\dimexpr\clippingparameter\c!x\scratchwidth-\scratchwidth\relax
+     \scratchwidth\clippingparameter\c!sx\scratchwidth
    \fi
    \relax % sure
-   \ifdim\@@cpheight>\zeropoint
-     \!!dimenb\@@cpheight
-     \!!dimend\ht\nextbox
-     \advance\!!dimend -\@@cpvoffset
-     \advance\!!dimend -\!!dimenb
+   \ifdim\clippingparameter\c!height>\zeropoint
+     \scratchheight\clippingparameter\c!height
+     \scratchyoffset\dimexpr\ht\nextbox-\clippingparameter\c!voffset-\scratchheight\relax
    \else
-     \!!dimenb\ht\nextbox
-     \divide\!!dimenb \@@cpny
-     \!!dimend-\@@cpy\!!dimenb
-     \advance\!!dimend -\@@cpsy\!!dimenb
-     \advance\!!dimend \!!dimenb
-     \!!dimenb\@@cpsy\!!dimenb
-     \advance\!!dimend \ht\nextbox % dimend !
+     \scratchheight\dimexpr\ht\nextbox/\clippingparameter\c!ny\relax
+     \scratchyoffset\dimexpr-\clippingparameter\c!y\scratchheight-\clippingparameter\c!sy\scratchheight+\scratchheight\relax
+     \scratchheight\clippingparameter\c!sy\scratchheight
+     \advance\scratchyoffset \ht\nextbox
    \fi
-   \setbox\nextbox\hbox                            % old
-     {\advance\!!dimenc -\@@cpleftoffset           % new !
-      \advance\!!dimend -\@@cpbottomoffset         % new ! % - added
-      \hskip-\!!dimenc\lower\!!dimend\box\nextbox}% old
+   \setbox\nextbox\hbox
+     {\advance\scratchxoffset -\clippingparameter\c!leftoffset  \relax
+      \advance\scratchyoffset -\clippingparameter\c!bottomoffset\relax
+      \hskip-\scratchxoffset
+      \lower\scratchyoffset
+      \box\nextbox}%
    \wd\nextbox\zeropoint
    \ht\nextbox\zeropoint
    \dp\nextbox\zeropoint
    \setbox\nextbox\hbox
-     {\advance\!!dimena \@@cpleftoffset         % new !
-      \advance\!!dimena \@@cprightoffset        % new !
-      \advance\!!dimenb \@@cpbottomoffset       % new !
-      \advance\!!dimenb \@@cptopoffset          % new !
-      \dostartclipping\@@cpmp\!!dimena\!!dimenb % old
+     {\advance\scratchwidth \dimexpr\clippingparameter\c!leftoffset  +\clippingparameter\c!rightoffset\relax
+      \advance\scratchheight\dimexpr\clippingparameter\c!bottomoffset+\clippingparameter\c!topoffset  \relax
+      \dostartclipping{\clippingparameter\c!mp}\scratchwidth\scratchheight
         \box\nextbox
       \dostopclipping}%
-   \setbox\nextbox\hbox                       % new !
-     {\!!dimena-\@@cpleftoffset               % new !
-      \!!dimenb \@@cpbottomoffset             % new ! % - removed
-      \hskip\!!dimena\lower\!!dimenb\box\nextbox}% new !
-   \wd\nextbox\!!dimena
-   \ht\nextbox\!!dimenb
+   \setbox\nextbox\hbox
+     {\hskip-\clippingparameter\c!leftoffset
+      \lower \clippingparameter\c!bottomoffset
+      \box\nextbox}%
+   \wd\nextbox\scratchwidth
+   \ht\nextbox\scratchheight
    \dp\nextbox\zeropoint
    \box\nextbox
    \egroup}
@@ -650,18 +695,18 @@
 
 \setupclipping
   [\c!state=\v!start,
-   \c!n=1, % was 2
-   \c!nx=\@@cpn,\c!x=1,\c!sx=1,
-   \c!ny=\@@cpn,\c!y=1,\c!sy=1,
+   \c!n=\plusone, % was \plustwo
+   \c!nx=\clippingparameter\c!n,\c!x=\plusone,\c!sx=\plusone,
+   \c!ny=\clippingparameter\c!n,\c!y=\plusone,\c!sy=\plusone,
    \c!width=\zeropoint,
    \c!height=\zeropoint,
    \c!hoffset=\zeropoint,
    \c!voffset=\zeropoint,
    \c!offset=\zeropoint,
-   \c!leftoffset=\@@cpoffset,  % \zeropoint,
-   \c!rightoffset=\@@cpoffset, % \zeropoint,
-   \c!topoffset=\@@cpoffset,   % \zeropoint,
-   \c!bottomoffset=\@@cpoffset,% \zeropoint,
+   \c!leftoffset=\clippingparameter\c!offset,
+   \c!rightoffset=\clippingparameter\c!offset,
+   \c!topoffset=\clippingparameter\c!offset,
+   \c!bottomoffset=\clippingparameter\c!offset,
    \c!mp=]
 
 %D \startbuffer
diff --git a/tex/context/base/lang-lab.mkiv b/tex/context/base/lang-lab.mkiv
index 0e0c4b31c..68458e069 100644
--- a/tex/context/base/lang-lab.mkiv
+++ b/tex/context/base/lang-lab.mkiv
@@ -133,8 +133,7 @@
      \let#7\firstofoneargument % to be checked
      \let#8\firstofoneargument % to be checked
      \let#9\firstofoneargument % to be checked
-   \to \simplifiedcommands
-  }
+   \to \everysimplifycommands}
 
 \let\flushleftlabelclass \firstoftwoarguments
 \let\flushrightlabelclass\secondoftwoarguments
@@ -262,15 +261,17 @@
 %D which expands to {\em something} or {\em iets}, depending on
 %D de current language.
 
+\installcorenamespace{translation}
+
 \unexpanded\def\translate
   {\dosingleempty\lang_translate}
 
 \def\lang_translate[#1]%
-  {\getparameters[\??lg][#1]%
-   \ifcsname\??lg\currentlanguage\endcsname
-     \csname\??lg\currentlanguage\endcsname
-   \else\ifcsname\??lg\s!en\endcsname
-     \csname\??lg\s!en\endcsname
+  {\getparameters[\??translation][#1]%
+   \ifcsname\??translation\currentlanguage\endcsname
+     \csname\??translation\currentlanguage\endcsname
+   \else\ifcsname\??translation\s!en\endcsname
+     \csname\??translation\s!en\endcsname
    \else
      [translation #1]%
    \fi\fi}
@@ -293,8 +294,8 @@
 %D \stoptyping
 
 \def\assigntranslation[#1]\to#2%
-  {\getparameters[\??lg][#1]%
-   \edef#2{\csname\??lg\currentlanguage\endcsname}}
+  {\getparameters[\??translation][#1]%
+   \edef#2{\csname\??translation\currentlanguage\endcsname}}
 
 %D \macros
 %D   {commalistsentence}
diff --git a/tex/context/base/lang-mis.mkiv b/tex/context/base/lang-mis.mkiv
index a537a2936..4d8b8e08a 100644
--- a/tex/context/base/lang-mis.mkiv
+++ b/tex/context/base/lang-mis.mkiv
@@ -683,7 +683,7 @@
 
     \doglobal \appendtoks
         \def|#1|{\ifx#1\empty\empty-\else#1\fi}%
-    \to \simplifiedcommands
+    \to \everysimplifycommands
 
 \egroup
 
diff --git a/tex/context/base/luat-ini.mkiv b/tex/context/base/luat-ini.mkiv
index 46b2d1f7f..094c4ee53 100644
--- a/tex/context/base/luat-ini.mkiv
+++ b/tex/context/base/luat-ini.mkiv
@@ -108,16 +108,18 @@
 %D Beware: because \type {\expanded} is een convert command, the error
 %D message will show \type{<inserted text>} as part of the message.
 
+\installcorenamespace{luacode}
+
 \def\luat_start_named_lua_code#1%
   {\begingroup
    \obeylualines
    \obeyluatokens
-   \csname\??lu:c:#1\endcsname}
+   \csname\??luacode#1\endcsname}
 
 \unexpanded\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet
-  {\ifcsname\??lu:c:#1\endcsname \else
+  {\ifcsname\??luacode#1\endcsname \else
      \scratchcounter\ctxlua{lua.registername("#1","#3")}%
-     \normalexpanded{\edef\csname\??lu:c:#1\endcsname##1\csname\e!stop#1\v!code\endcsname}%
+     \normalexpanded{\edef\csname\??luacode#1\endcsname##1\csname\e!stop#1\v!code\endcsname}%
        {\endgroup\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}%
      \expandafter\def \csname\e!start#1\v!code\endcsname   {\luat_start_named_lua_code{#1}}%
      \expandafter\edef\csname        #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}%
diff --git a/tex/context/base/lxml-ini.mkiv b/tex/context/base/lxml-ini.mkiv
index 83e0a6f71..73cd4be7e 100644
--- a/tex/context/base/lxml-ini.mkiv
+++ b/tex/context/base/lxml-ini.mkiv
@@ -313,7 +313,7 @@
     \xmlprocessingmode\executeifdefined{\??xmldefaults\directxmlparameter\c!default}\plusone
 \to \everysetupxml
 
-\unexpanded\def\xmlinitialize % is this still needed?
+\unexpanded\def\initializexmlprocessing % is this still needed?
   {\the\everysetupxml}
 
 \let\p_lxml_entities\empty
diff --git a/tex/context/base/math-ali.mkiv b/tex/context/base/math-ali.mkiv
index 94800b3ba..57727b03a 100644
--- a/tex/context/base/math-ali.mkiv
+++ b/tex/context/base/math-ali.mkiv
@@ -15,17 +15,6 @@
 
 \unprotect
 
-% helpers .. will move
-
-\def\doxxdoubleempty#1#2%
-  {\ifx#2[\expandafter\dodoxxdoubleempty\else\expandafter\noxxdoubleempty\fi#1#2}
-
-\def\dodoxxdoubleempty#1[#2]#3%
-  {\ifx#3[\else\expandafter\nonoxxdoubleempty\fi#1[#2]#3}
-
-\def\noxxdoubleempty      #1{#1[][]}
-\def\nonoxxdoubleempty#1[#2]{#1[#2][]}
-
 %D The code here has been moved from other files. Beware: the \MKII\ and
 %D \MKIV\ code is not gathered in files with the same name. In the
 %D meantime this code has been adapted to \MKIV\ but mnore is possible.
@@ -38,19 +27,25 @@
 
 % n>1 #### needed, strange # interaction in recurse
 
+\newtoks\c_math_align_a
+\newtoks\c_math_align_b
+\newtoks\c_math_align_c
+
 \def\math_build_eqalign
   {\scratchtoks\emptytoks
-   \dorecurse{\mathalignmentparameter\c!m}
-     {\ifnum\recurselevel>\plusone
-       %\appendtoks
-       %  \tabskip\mathalignmentparameter\c!distance&\tabskip\zeropoint
-       %\to\scratchtoks
-        \scratchtoks\expandafter{\the\scratchtoks\tabskip\mathalignmentparameter\c!distance&\tabskip\zeropoint}%
-      \fi
-      \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksa}}%
-      \dorecurse{\numexpr\mathalignmentparameter\c!n-\plusone\relax}
-        {\normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksb}}}}%
-   \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksc}}}
+   \dorecurse{\mathalignmentparameter\c!m}\def\math_build_eqalign
+   \normalexpanded{\scratchtoks{\the\scratchtoks\the\c_math_align_c}}}
+
+\def\math_build_eqalign_step
+  {\ifnum\recurselevel>\plusone
+    %\appendtoks
+    %  \tabskip\mathalignmentparameter\c!distance&\tabskip\zeropoint
+    %\to\scratchtoks
+     \scratchtoks\expandafter{\the\scratchtoks\tabskip\mathalignmentparameter\c!distance&\tabskip\zeropoint}%
+   \fi
+   \normalexpanded{\scratchtoks{\the\scratchtoks\the\c_math_align_a}}%
+   \dorecurse{\numexpr\mathalignmentparameter\c!n-\plusone\relax}
+     {\normalexpanded{\scratchtoks{\the\scratchtoks\the\c_math_align_b}}}}
 
 \def\math_math_in_eqalign#1{$\tabskip\zeropoint\everycr\emptytoks\displaystyle{{}#1{}}$}
 \def\math_text_in_eqalign#1{$\tabskip\zeropoint\everycr\emptytoks#1$}
@@ -73,14 +68,14 @@
 % use zeroskipplusfill
 
 \def\math_prepare_r_eqalign_no
-  {\!!toksa{\strut\math_first_in_eqalign\hfil\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}%
-   \!!toksb{&\math_next_in_eqalign\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}%
+  {\c_math_align_a{\strut\math_first_in_eqalign\hfil\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}%
+   \c_math_align_b{&\math_next_in_eqalign\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}%
    \ifnum\mathraggedstatus=\plusone
-     \!!toksc{\hfil&\span\math_text_in_eqalign{##}\tabskip\zeropoint}%
+     \c_math_align_c{\hfil&\span\math_text_in_eqalign{##}\tabskip\zeropoint}%
    \else\ifnum\mathraggedstatus=\plusthree
-     \!!toksc{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\span\math_text_in_eqalign{##}\tabskip\zeropoint}%
+     \c_math_align_c{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\span\math_text_in_eqalign{##}\tabskip\zeropoint}%
    \else
-     \!!toksc{\hfil\tabskip\centering&\llap{\span\math_text_in_eqalign{##}}\tabskip\zeropoint}%
+     \c_math_align_c{\hfil\tabskip\centering&\llap{\span\math_text_in_eqalign{##}}\tabskip\zeropoint}%
    \fi\fi
    \global\mathnumberstatus\zerocount
    \math_build_eqalign
@@ -88,15 +83,15 @@
    \tabskip\centering}
 
 \def\math_prepare_l_eqalign_no
-  {\!!toksa{\strut\math_first_in_eqalign\hfil\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}%
-   \!!toksb{&\math_next_in_eqalign\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}%
+  {\c_math_align_a{\strut\math_first_in_eqalign\hfil\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}%
+   \c_math_align_b{&\math_next_in_eqalign\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}%
    % problem: number is handled after rest and so ends up in the margin
    \ifnum\mathraggedstatus=\plusone
-     \!!toksc{\hfil&\kern-\displaywidth\rlap{\span\math_text_in_eqalign{##}}\tabskip\displaywidth}%
+     \c_math_align_c{\hfil&\kern-\displaywidth\rlap{\span\math_text_in_eqalign{##}}\tabskip\displaywidth}%
    \else\ifnum\mathraggedstatus=\plusthree
-     \!!toksc{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\kern-\displaywidth\span\math_rlap{\span\math_text_in_eqalign{##}}\tabskip\displaywidth}%
+     \c_math_align_c{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\kern-\displaywidth\span\math_rlap{\span\math_text_in_eqalign{##}}\tabskip\displaywidth}%
    \else
-     \!!toksc{\hfil\tabskip\centering&\kern-\displaywidth\rlap{\span\math_text_in_eqalign{##}}\tabskip\displaywidth}%
+     \c_math_align_c{\hfil\tabskip\centering&\kern-\displaywidth\rlap{\span\math_text_in_eqalign{##}}\tabskip\displaywidth}%
    \fi\fi
    \global\mathnumberstatus\zerocount
    \math_build_eqalign
@@ -112,7 +107,7 @@
      \let\math_finish_eqalign_no\relax
    \fi
    #1%
-   \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA {\the\scratchtoks\crcr#2\crcr}%
+   \halign \ifcase\eqalignmode \or to \displaywidth \fi \expandafter {\the\scratchtoks\crcr#2\crcr}%
    \math_finish_eqalign_no}
 
 \def\math_both_eqalign_no_aligned#1%
@@ -128,7 +123,7 @@
     \fi
    \fi
    #1%
-   \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA \bgroup\the\scratchtoks\crcr}
+   \halign \ifcase\eqalignmode \or to \displaywidth \fi \expandafter \bgroup\the\scratchtoks\crcr}
 
 \def\math_rlap#1%
   {\setbox\scratchbox\hbox{#1}%
@@ -221,7 +216,7 @@
 \setupmathalignment
   [\c!n=2,
    \c!m=1,
-   \c!distance=1em]
+   \c!distance=\emwidth]
 
 \definemathalignment[align]            % default case (this is what amstex users expect)
 \definemathalignment[\v!mathalignment] % prefered case (this is cleaner, less clashing)
@@ -408,8 +403,8 @@
 \installcommandhandler \??mathcases {mathcases} \??mathcases
 
 \setupmathcases
-  [\c!distance=1em,
-   \c!numberdistance=2.5em,
+  [\c!distance=\emwidth,
+   \c!numberdistance=2.5\emwidth,
    \c!left={\left\{\mskip\thinmuskip},
    \c!right={\right.}]
 
@@ -434,7 +429,7 @@
    \def\NC{\math_cases_NC}%
    \def\MC{\math_cases_NC\ifmmode\else$\def\endmath{$}\fi}%
    \global\let\math_cases_NC\math_cases_NC_indeed
-   \def\NR{\unskip\endmath&\global\let\math_cases_NC\math_cases_NC_indeed\doxxdoubleempty\math_cases_NR}%
+   \def\NR{\unskip\endmath&\global\let\math_cases_NC\math_cases_NC_indeed\dodirectdoubleempty\math_cases_NR}%
    \normalbaselines
    \mathsurround\zeropoint
    \everycr\emptytoks
@@ -515,7 +510,7 @@
 \installcommandhandler \??mathmatrix {mathmatrix} \??mathmatrix
 
 \setupmathmatrix
-  [\c!distance=1em,
+  [\c!distance=\emwidth,
    \c!left=,
    \c!right=,
    \c!align=\v!middle]
@@ -570,20 +565,20 @@
 \definemathmatrix[\v!mathmatrix]
 
 \def\math_matrix_prepare
-  {\!!toksa{\strut\math_first_in_eqalign\math_left_of_equalign\span
+  {\c_math_align_a{\strut\math_first_in_eqalign\math_left_of_equalign\span
             \math_text_in_eqalign{\mathmatrixparameter\c!style##}\math_right_of_eqalign}%
-   \!!toksb{&\hskip\mathmatrixparameter\c!distance
+   \c_math_align_b{&\hskip\mathmatrixparameter\c!distance
             \math_next_in_eqalign\math_left_of_equalign\span
             \math_text_in_eqalign{\mathmatrixparameter\c!style##}\math_right_of_eqalign}%
-   \!!toksc{&&\hskip\mathmatrixparameter\c!distance
+   \c_math_align_c{&&\hskip\mathmatrixparameter\c!distance
             \math_left_of_equalign\span
             \math_text_in_eqalign{\mathmatrixparameter\c!style##}\math_right_of_eqalign}%
    \scratchtoks\emptytoks
-   \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksa}}%
+   \normalexpanded{\scratchtoks{\the\scratchtoks\the\c_math_align_a}}%
    \dorecurse{\numexpr\scratchcounter-\plusone\relax}
-     {\normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksb}}}%
-   \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksc}}%
-   \halign \@EA \bgroup\the\scratchtoks \crcr}
+     {\normalexpanded{\scratchtoks{\the\scratchtoks\the\c_math_align_b}}}%
+   \normalexpanded{\scratchtoks{\the\scratchtoks\the\c_math_align_c}}%
+   \halign \expandafter \bgroup\the\scratchtoks \crcr}
 
 \unexpanded\def\dodomatrixNC
   {\gdef\domatrixNC{\endmath&}}
diff --git a/tex/context/base/math-arr.mkiv b/tex/context/base/math-arr.mkiv
index f18d6be2b..91bb7889b 100644
--- a/tex/context/base/math-arr.mkiv
+++ b/tex/context/base/math-arr.mkiv
@@ -40,146 +40,102 @@
 %    \smash-$
 %    $}
 
-\def\exmthfont#1{\mr} % \symbolicsizedfont#1\plusone{MathExtension}}
-
-\def\domthfrac#1#2#3#4#5#6#7%
+\def\math_stylebuilders_fract#1#2#3#4#5#6#7%
   {\begingroup
    \mathsurround\zeropoint
    \setbox0\hbox{$#1 #6$}%
    \setbox2\hbox{$#1 #7$}%
-   \dimen0\wd0
-   \ifdim\wd2>\dimen0 \dimen0\wd2 \fi
+   \dimen0\wd\ifdim\wd2>\wd0 2\else 0\fi
    \setbox4\hbox to \dimen0{\leaders\hbox{#4}\hss#5}%
    \mathord{\vcenter{{\offinterlineskip
      \hbox to \dimen0{\hss\box0\hss}%
-     \kern \ht4%
+     \kern\ht4%
      \hbox to \dimen0{\hss\copy4\hss}%
-     \kern \ht4%
+     \kern\ht4%
      \hbox to \dimen0{\hss\box2\hss}}}}%
    \endgroup}
 
-\def\domthsqrt#1#2#3#4#5%
+\def\math_stylebuilders_sqrt#1#2#3#4#5%
   {\begingroup
    \mathsurround\zeropoint
    \setbox0\hbox{$#1 #5$}%
-   \dimen0=1.05\ht0 \advance\dimen0 1pt  \ht0 \dimen0
-   \dimen0=1.05\dp0 \advance\dimen0 1pt  \dp0 \dimen0
-   \dimen0\wd0
-   \setbox4\hbox to \dimen0{\exmthfont#2\leaders\hbox{#3}\hfill#4}%
-   \delimitershortfall=0pt
-   \nulldelimiterspace=0pt
-   \setbox2\hbox{$\left\delimiter"0270370 \vrule height\ht0 depth \dp0 width0pt
-                  \right.$}%
-   \mathord{\vcenter{\hbox{\copy2
-                           \rlap{\raise\dimexpr\ht2-\ht4\relax\copy4}\copy0}}}%
+   \ht0\dimexpr1.05\ht0+\onepoint\relax
+   \dp0\dimexpr1.05\dp0+\onepoint\relax
+   \setbox4\hbox to \wd0{\mr#2\leaders\hbox{#3}\hfill#4}%
+   \delimitershortfall\zeropoint
+   \nulldelimiterspace\zeropoint
+   \setbox2\hbox{$\left\delimiter"0270370 \vrule \!!height\ht0 \!!depth \dp0 \!!width\zeropoint\right.$}% is this the right code point?
+   \mathord{\vcenter{\hbox{\copy2\rlap{\raise\dimexpr\ht2-\ht4\relax\copy4}\copy0}}}%
    \endgroup}
 
 \def\mthfrac#1#2#3#4#5{\mathchoice
-  {\domthfrac\displaystyle     \textface        {#1}{#2}{#3}{#4}{#5}}%
-  {\domthfrac\textstyle        \textface        {#1}{#2}{#3}{#4}{#5}}%
-  {\domthfrac\scriptstyle      \scriptface      {#1}{#2}{#3}{#4}{#5}}%
-  {\domthfrac\scriptscriptstyle\scriptscriptface{#1}{#2}{#3}{#4}{#5}}}
+  {\math_stylebuilders_frac\displaystyle     \textface        {#1}{#2}{#3}{#4}{#5}}%
+  {\math_stylebuilders_frac\textstyle        \textface        {#1}{#2}{#3}{#4}{#5}}%
+  {\math_stylebuilders_frac\scriptstyle      \scriptface      {#1}{#2}{#3}{#4}{#5}}%
+  {\math_stylebuilders_frac\scriptscriptstyle\scriptscriptface{#1}{#2}{#3}{#4}{#5}}}
 
 \def\mthsqrt#1#2#3{\mathchoice
-  {\domthsqrt\displaystyle     \textface    {#1}{#2}{#3}}%
-  {\domthsqrt\textstyle        \textface    {#1}{#2}{#3}}%
-  {\domthsqrt\scriptstyle      \textface    {#1}{#2}{#3}}%
-  {\domthsqrt\scriptscriptstyle\textface    {#1}{#2}{#3}}}
-
-% temp here
-
-%D We next define extensible arrows. Extensible arrows are arrows that
-%D change their length according to the width of the text to be placed
-%D above and below the arrow. Since we need to define a lot of arrows,
-%D we first define some helper macros. The basic idea is to measure
-%D the width of the box to be placed above and below the arrow, and
-%D make the \quotation{body} of the arrow as long as the bigger of the
-%D two widths.
-
-\def\mtharrfactor{1}
-\def\mtharrextra {0}
-
-% \def\domthxarr#1#2#3#4#5% hm, looks like we do a double mathrel
-%   {\begingroup
-%    \def\mtharrfactor{1}%
-%    \def\mtharrextra {0}%
-%    \processaction[#1] % will be sped up
-%      [  \v!none=>\def\mtharrfactor{0},
-%        \v!small=>\def\mtharrextra{10},
-%       \v!medium=>\def\mtharrextra{15},
-%          \v!big=>\def\mtharrextra{20},
-%       \v!normal=>,
-%      \v!default=>,
-%      \v!unknown=>\doifnumberelse{#1}{\def\mtharrextra{#1}}\donothing]%
-%    \mathsurround\zeropoint
-%    \muskip0=\thirdoffourarguments  #2mu
-%    \muskip2=\fourthoffourarguments #2mu
-%    \muskip4=\firstoffourarguments  #2mu
-%    \muskip6=\secondoffourarguments #2mu
-%    \muskip0=\mtharrfactor\muskip0 \advance\muskip0 \mtharrextra mu
-%    \muskip2=\mtharrfactor\muskip2 \advance\muskip2 \mtharrextra mu
-%    \setbox0\hbox{$\scriptstyle
-%                   \mkern\muskip4\relax
-%                   \mkern\muskip0\relax
-%                   #5\relax
-%                   \mkern\muskip2\relax
-%                   \mkern\muskip6\relax
-%                  $}%
-%    \setbox4\hbox{#3\displaystyle}%
-%    \dimen0\wd0
-%    \ifdim\wd4>\dimen0 \dimen0\wd4 \fi
-%    \setbox2\hbox{$\scriptstyle
-%                   \mkern\muskip4\relax
-%                   \mkern\muskip0\relax
-%                   #4\relax
-%                   \mkern\muskip2\relax
-%                   \mkern\muskip6\relax
-%                  $}%
-%    \ifdim\wd2>\dimen0 \dimen0\wd2 \fi
-%    \setbox4\hbox to \dimen0{#3\displaystyle}%
-%    \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}}\limits\normalsuperscript{\box0}\normalsubscript{\box2}}%
-%    \endgroup}
-
-\def\domthxarr#1#2#3#4#5% hm, looks like we do a double mathrel
+  {\math_stylebuilders_sqrt\displaystyle     \textface{#1}{#2}{#3}}%
+  {\math_stylebuilders_sqrt\textstyle        \textface{#1}{#2}{#3}}%
+  {\math_stylebuilders_sqrt\scriptstyle      \textface{#1}{#2}{#3}}%
+  {\math_stylebuilders_sqrt\scriptscriptstyle\textface{#1}{#2}{#3}}}
+
+%D We next define extensible arrows. Extensible arrows are arrows that change their
+%D length according to the width of the text to be placed above and below the arrow.
+%D Since we need to define a lot of arrows, we first define some helper macros. The
+%D basic idea is to measure the width of the box to be placed above and below the
+%D arrow, and make the \quote {body} of the arrow as long as the bigger of the two
+%D widths.
+
+\installcorenamespace{matharrowsettings}
+
+\def\m_math_arrows_factor{1}
+\def\m_math_arrows_extra {0}
+
+\setvalue{\??matharrowsettings\v!none   }{\def\m_math_arrows_factor{0}}
+\setvalue{\??matharrowsettings\v!small  }{\def\m_math_arrows_extra{10}}
+\setvalue{\??matharrowsettings\v!medium }{\def\m_math_arrows_extra{15}}
+\setvalue{\??matharrowsettings\v!big    }{\def\m_math_arrows_extra{20}}
+\setvalue{\??matharrowsettings\v!normal }{}
+\setvalue{\??matharrowsettings          }{}
+\setvalue{\??matharrowsettings\s!unknown}{\doifnumberelse\p_mathspacing{\let\m_math_arrows_extra\p_mathspacing}\donothing}
+
+\def\math_arrows_construct#1#2#3#4#5% hm, looks like we do a double mathrel (a bit cleaned up .. needs checking)
   {\begingroup
-   \def\mtharrfactor{1}%
-   \def\mtharrextra {0}%
-   \processaction[#1] % will be sped up
-     [  \v!none=>\def\mtharrfactor{0},
-       \v!small=>\def\mtharrextra{10},
-      \v!medium=>\def\mtharrextra{15},
-         \v!big=>\def\mtharrextra{20},
-      \v!normal=>,
-     \v!default=>,
-     \v!unknown=>\doifnumberelse{#1}{\def\mtharrextra{#1}}\donothing]%
+   \def\m_math_arrows_factor{1}%
+   \def\m_math_arrows_extra {0}%
+   \edef\p_math_spacing{#1}%
+   \csname\??matharrowsettings
+     \ifcsname\??matharrowsettings\p_mathspacing\endcsname\p_mathspacing\else\s!unknown\fi
+   \endcsname
    \mathsurround\zeropoint
-   \muskip0=\thirdoffourarguments  #2mu
-   \muskip2=\fourthoffourarguments #2mu
-   \muskip0=\mtharrfactor\muskip0
-   \muskip2=\mtharrfactor\muskip2
-   \advance\muskip0 \mtharrextra mu
-   \advance\muskip2 \mtharrextra mu
-   \advance\muskip0 \firstoffourarguments  #2mu
-   \advance\muskip2 \secondoffourarguments #2mu
+   \muskip0=\muexpr\m_math_arrows_factor\muexpr\thirdoffourarguments #2\onemuskip\relax+\m_math_arrows_extra\onemuskip+\firstoffourarguments #2\onemuskip\relax
+   \muskip2=\muexpr\m_math_arrows_factor\muexpr\fourthoffourarguments#2\onemuskip\relax+\m_math_arrows_extra\onemuskip+\secondoffourarguments#2\onemuskip\relax
    \setbox0\hbox{$\scriptstyle
                   \mkern\muskip0\relax
                   #5\relax
                   \mkern\muskip2\relax
                  $}%
-   \setbox4\hbox{#3\displaystyle}%
-   \dimen0\wd0
-   \ifdim\wd4>\dimen0 \dimen0\wd4 \fi
    \setbox2\hbox{$\scriptstyle
                   \mkern\muskip0\relax
                   #4\relax
                   \mkern\muskip2\relax
                  $}%
-   \ifdim\wd2>\dimen0 \dimen0\wd2 \fi
-   \setbox4\hbox to \dimen0{#3\displaystyle}%
+   \setbox4\hbox{#3\displaystyle}%
+   \dimen0\wd0\relax
+   \ifdim\wd2>\dimen0
+     \dimen0\wd2\relax
+   \fi
+   \ifdim\wd4>\dimen0
+     \dimen0\wd4\relax
+   \fi
+   \ifdim\wd4=\dimen0\else
+     \setbox4\hbox to \dimen0{#3\displaystyle}%
+   \fi
    \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}}\limits\normalsuperscript{\box0}\normalsubscript{\box2}}%
    \endgroup}
 
-\let\domthxarrsingle\domthxarr
+\let\math_arrows_construct_single\math_arrows_construct
 
 %D There are some arrows which are created by stacking two arrows. The next
 %D macro helps in defining such \quotation{double arrows}.
@@ -194,29 +150,27 @@
 %     \chemical{SO_2}
 % \stopchemicalformula
 
-\def\domthxarrdouble#1#2#3#4#5#6#7% opt l r sp rs top bot
+\def\math_arrows_construct_double#1#2#3#4#5#6#7% opt l r sp rs top bot
   {\mathrel
-     {\scratchdimen.32ex\relax % was .22, todo: make configurable
-      \setbox0\hbox{$\domthxarr{#1}{#2}{#4}{\phantom{#6}}{#7}$}%
-      \setbox2\hbox{$\domthxarr{#1}{#3}{#5}{#6}{\phantom{#7}}$}%
+     {\scratchdimen.32\exheight\relax % was .22, todo: make configurable
+      \setbox0\hbox{$\math_arrows_construct{#1}{#2}{#4}{\phantom{#6}}{#7}$}%
+      \setbox2\hbox{$\math_arrows_construct{#1}{#3}{#5}{#6}{\phantom{#7}}$}%
       \raise\scratchdimen\box0
       \kern-\wd2
       \lower\scratchdimen\box2}}
 
 %D \macros{definematharrow}
 %D
-%D Macro for defining new arrows. We can define two types of
-%D arrows|<|single arrows and double arrows. Single arrows are defined
-%D as
+%D Macro for defining new arrows. We can define two types of arrows|<|single arrows
+%D and double arrows. Single arrows are defined as
 %D
 %D \starttyping
 %D \definematharrow [xrightarrow]        [0359] [\rightarrowfill]
 %D \stoptyping
 %D
-%D The first argument is the name of the arrow (\tex{xrightarrow} in
-%D this case.) The second argument consists of a set of 4 numbers and
-%D specify the spacing correction in math units~\type{mu}. These
-%D numbers define:
+%D The first argument is the name of the arrow (\tex {xrightarrow} in this case.) The
+%D second argument consists of a set of 4 numbers and specify the spacing correction
+%D in math units~\type {mu}. These numbers define:
 %D
 %D \startlines
 %D   1st number: arrow||tip correction
@@ -225,9 +179,9 @@
 %D   4th number: space (multiplied by \tex{matharrfactor} and advanced by \tex{matharrextra})
 %D \stoplines
 %D
-%D The third argument is the name of the extensible fill. The third
-%D argument is optional when the arrow is redefined later (this is
-%D useful for font specific tweaking of the skips.) For example,
+%D The third argument is the name of the extensible fill. The third argument is optional
+%D when the arrow is redefined later (this is useful for font specific tweaking of the
+%D skips.) For example,
 %D
 %D \startbuffer
 %D \math{\xrightarrow{above}}
@@ -245,78 +199,80 @@
 %D                  [\rightharpoonupfill,\leftharpoondownfill]
 %D \stoptyping
 %D
-%D The second and the third set of arguments consist of comma
-%D separated values. The first element of the second argument
-%D (\type{3095}) corresponds to the spacing correction of top arrow
-%D fill (\tex{rightarrowupfill}).  Similarly, \type{0359} corresponds
-%D to bottom arrow fill \tex{leftharpoondownfill}). Stacking them on
-%D top of each other we get $\xrightleftharpoons[big]{above}{below}$.
-%D The following math arrows are defined
+%D The second and the third set of arguments consist of comma separated values. The
+%D first element of the second argument (\type {3095}) corresponds to the spacing
+%D correction of top arrow fill (\tex{rightarrowupfill}). Similarly, \type {0359}
+%D corresponds to bottom arrow fill \tex {leftharpoondownfill}). Stacking them on
+%D top of each other we get $\xrightleftharpoons [big] {above} {below}$. The
+%D following math arrows are defined
 %D
 %D \placetable[none]{}{\starttable[|l|m|]
-%D   \NC \tex{xrightarrow        }  \NC \xrightarrow        [big]  \NC \NR
-%D   \NC \tex{xleftarrow         }  \NC \xleftarrow         [big]  \NC \NR
-%D   \NC \tex{xequal             }  \NC \xequal             [big]  \NC \NR
-%D   \NC \tex{xRightarrow        }  \NC \xRightarrow        [big]  \NC \NR
-%D   \NC \tex{xLeftarrow         }  \NC \xLeftarrow         [big]  \NC \NR
-%D   \NC \tex{xLeftrightarrow    }  \NC \xLeftrightarrow    [big]  \NC \NR
-%D   \NC \tex{xleftrightarrow    }  \NC \xleftrightarrow    [big]  \NC \NR
-%D   \NC \tex{xmapsto            }  \NC \xmapsto            [big]  \NC \NR
-%D   \NC \tex{xtwoheadrightarrow }  \NC \xtwoheadrightarrow [big]  \NC \NR
-%D   \NC \tex{xtwoheadleftarrow  }  \NC \xtwoheadleftarrow  [big]  \NC \NR
-%D   \NC \tex{xrightharpoondown  }  \NC \xrightharpoondown  [big]  \NC \NR
-%D   \NC \tex{xrightharpoonup    }  \NC \xrightharpoonup    [big]  \NC \NR
-%D   \NC \tex{xleftharpoondown   }  \NC \xleftharpoondown   [big]  \NC \NR
-%D   \NC \tex{xleftharpoonup     }  \NC \xleftharpoonup     [big]  \NC \NR
-%D   \NC \tex{xhookleftarrow     }  \NC \xhookleftarrow     [big]  \NC \NR
-%D   \NC \tex{xhookrightarrow    }  \NC \xhookrightarrow    [big]  \NC \NR
-%D   \NC \tex{xleftrightharpoons }  \NC \xleftrightharpoons [big]  \NC \NR
-%D   \NC \tex{xrightleftharpoons }  \NC \xrightleftharpoons [big]  \NC \NR
+%D   \NC \tex{xrightarrow}        \NC \xrightarrow        [big] \NC \NR
+%D   \NC \tex{xleftarrow}         \NC \xleftarrow         [big] \NC \NR
+%D   \NC \tex{xequal}             \NC \xequal             [big] \NC \NR
+%D   \NC \tex{xRightarrow}        \NC \xRightarrow        [big] \NC \NR
+%D   \NC \tex{xLeftarrow}         \NC \xLeftarrow         [big] \NC \NR
+%D   \NC \tex{xLeftrightarrow}    \NC \xLeftrightarrow    [big] \NC \NR
+%D   \NC \tex{xleftrightarrow}    \NC \xleftrightarrow    [big] \NC \NR
+%D   \NC \tex{xmapsto}            \NC \xmapsto            [big] \NC \NR
+%D   \NC \tex{xtwoheadrightarrow} \NC \xtwoheadrightarrow [big] \NC \NR
+%D   \NC \tex{xtwoheadleftarrow}  \NC \xtwoheadleftarrow  [big] \NC \NR
+%D   \NC \tex{xrightharpoondown}  \NC \xrightharpoondown  [big] \NC \NR
+%D   \NC \tex{xrightharpoonup}    \NC \xrightharpoonup    [big] \NC \NR
+%D   \NC \tex{xleftharpoondown}   \NC \xleftharpoondown   [big] \NC \NR
+%D   \NC \tex{xleftharpoonup}     \NC \xleftharpoonup     [big] \NC \NR
+%D   \NC \tex{xhookleftarrow}     \NC \xhookleftarrow     [big] \NC \NR
+%D   \NC \tex{xhookrightarrow}    \NC \xhookrightarrow    [big] \NC \NR
+%D   \NC \tex{xleftrightharpoons} \NC \xleftrightharpoons [big] \NC \NR
+%D   \NC \tex{xrightleftharpoons} \NC \xrightleftharpoons [big] \NC \NR
 %D \stoptable}
 
+%D If needed this can be optimized (i.e. we can preexpand using \type
+%D {\docheckedpair}).
+
 \unexpanded\def\definematharrow
-  {\doquadrupleargument\dodefinematharrow}
+  {\doquadrupleargument\math_arrows_define}
 
-\def\dodefinematharrow[#1][#2][#3][#4]% name type[none|both] template command
+\def\math_arrows_define[#1][#2][#3][#4]% name type[none|both] template command
   {\iffourthargument
-      \executeifdefined{dodefine#2arrow}\gobblethreearguments{#1}{#3}{#4}%
+      \executeifdefined{math_arrows_define_#2}\gobblethreearguments{#1}{#3}{#4}%
    \else\ifthirdargument
-      \dodefinebotharrow{#1}{#2}{#3}%
+      \math_arrows_define_both{#1}{#2}{#3}%
    \else\ifsecondargument
-      \redefinebotharrow{#1}{#2}{#3}%
+      \math_arrows_define_both_again{#1}{#2}{#3}%
    \fi\fi\fi}
 
-\def\redefinebotharrow#1#2#3% real dirty, this overload!
-  {\doifdefined{#1}
-     {\pushmacro\dohandlemtharrow
-      \def\dohandlemtharrow[##1][##2]{\setuvalue{#1}{\dohandlemtharrow[#2][##2]}}%
-      % == \def\dohandlemtharrow[##1][##2]{\dodefinebotharrow{#1}{#2}{##2}}%
-      \getvalue{#1}%
-      \popmacro\dohandlemtharrow}}
+\def\math_arrows_define_both_again#1#2#3% real dirty, this overload!
+  {\ifcsname#1\endcsname
+     \pushmacro\math_arrows_do
+     \def\math_arrows_do[##1][##2]{\setuvalue{#1}{\math_arrows_do[#2][##2]}}%
+     \getvalue{#1}%
+     \popmacro\math_arrows_do
+   \fi}
 
-\def\dodefinebotharrow#1#2#3%
-  {\setuvalue{#1}{\dohandlemtharrow[#2][#3]}}
+\def\math_arrows_define_both#1#2#3%
+  {\setuvalue{#1}{\math_arrows_do[#2][#3]}}
 
-\def\dohandlemtharrow
-  {\dotripleempty\doxmtharrow}
+\unexpanded\def\math_arrows_do
+  {\dotripleempty\math_arrows_handle}
 
-\def\doxmtharrow[#1][#2][#3]% #3 == optional arg
-  {\def\dodoxmtharrow{\dododoxmtharrow[#1,\empty,\empty][#2,\empty,\empty][#3]}% {##1}{##2}
-   \dodoublegroupempty\dodoxmtharrow}
+\def\math_arrows_handle[#1][#2][#3]% #3 == optional arg .. \empty can be just 'empty'
+  {\def\math_arrows_handle_indeed{\math_arrows_handle_finalize[#1,\empty,\empty][#2,\empty,\empty][#3]}% {##1}{##2}
+   \dodoublegroupempty\math_arrows_handle_indeed}
 
-\def\dododoxmtharrow[#1,#2,#3][#4,#5,#6][#7]#8#9% [3] is the optional arg
+\def\math_arrows_handle_finalize[#1,#2,#3][#4,#5,#6][#7]#8#9% [3] is the optional arg
   {\edef\!!stringa{#2}%
    \ifx\!!stringa\empty
      \ifsecondargument
-       \mathrel{\domthxarrsingle{#7}{#1}{#4}{#8}{#9}}%
+       \mathrel{\math_arrows_construct_single{#7}{#1}{#4}{#8}{#9}}%
      \else
-       \mathrel{\domthxarrsingle{#7}{#1}{#4}{}{#8}}%
+       \mathrel{\math_arrows_construct_single{#7}{#1}{#4}{}{#8}}%
      \fi
    \else
      \ifsecondargument
-       \mathrel{\domthxarrdouble{#7}{#1}{#2}{#4}{#5}{#8}{#9}}%
+       \mathrel{\math_arrows_construct_double{#7}{#1}{#2}{#4}{#5}{#8}{#9}}%
      \else
-       \mathrel{\domthxarrdouble{#7}{#1}{#2}{#4}{#5}{}{#8}}%
+       \mathrel{\math_arrows_construct_double{#7}{#1}{#2}{#4}{#5}{}{#8}}%
      \fi
    \fi}
 
@@ -324,34 +280,32 @@
 
 %D \macros{mtharrowfill,defaultmtharrowfill}
 %D
-%D To extend the arrows we need to define a \quotation{math arrow
-%D fill}. This command takes 8 arguments: the first four correspond
-%D the second argument of \tex{definematharrow} explained above. The
-%D other three specify the tail, body and head of the arrow. The last
-%D argument specifies the math-mode in which the arrow is drawn.
-%D \tex{defaultmtharrowfill} has values tweaked to match Latin Modern
-%D fonts. For fonts that are significantly different (e.g.  cows) a
+%D To extend the arrows we need to define a \quotation {math arrow fill}. This
+%D command takes 8 arguments: the first four correspond the second argument of
+%D \tex {definematharrow} explained above. The other three specify the tail,
+%D body and head of the arrow. The last argument specifies the math-mode in which
+%D the arrow is drawn. \tex {defaultmtharrowfill} has values tweaked to match
+%D Latin Modern fonts. For fonts that are significantly different (e.g. cows) a
 %D different set of values need to be determined.
 
 \def\mtharrowfill#1#2#3#4#5#6#7#8%
-  {$\mathsurround 0pt
-    \thickmuskip0mu\medmuskip\thickmuskip\thinmuskip\thickmuskip
+  {$\mathsurround\zeropoint
+    \thickmuskip\zeromuskip\medmuskip\thickmuskip\thinmuskip\thickmuskip
     \relax#8#5%
-    \mkern-#1mu
-    \cleaders\hbox{$#8\mkern -#2mu#6\mkern -#3mu$}\hfill
-    \mkern-#4mu#7$}
+    \mkern-#1\onemuskip
+    \cleaders\hbox{$#8\mkern-#2\onemuskip#6\mkern-#3\onemuskip$}\hfill
+    \mkern-#4\onemuskip#7$}
 
 \def\defaultmtharrowfill{\mtharrowfill 7227}
 
-%D We now define some arrow fills that will be used for defining the
-%D arrows. Plain \TEX\ already defines \tex{leftarrowfill} and
-%D \tex{rightarrowfill}. The \tex{defaultmtharrowfill} command defines an
-%D arrowfill that takes an argument (so that it can also be used
-%D with over and under arrows). However the Plain \TEX\ definitions of
-%D \tex{leftarrowfill} and \tex{rightarrowfill} do not take this extra
-%D argument. To be backward compatible with Plain \TEX, we define two
-%D arrowfills: \tex{specrightarrowfill} which takes an extra argument, and
-%D \tex{rightarrowfill} which does not.
+%D We now define some arrow fills that will be used for defining the arrows. Plain
+%D \TEX\ already defines \tex {leftarrowfill} and \tex {rightarrowfill}. The \tex
+%D {defaultmtharrowfill} command defines an arrowfill that takes an argument (so
+%D that it can also be used with over and under arrows). However the Plain \TEX\
+%D definitions of \tex {leftarrowfill} and \tex {rightarrowfill} do not take this
+%D extra argument. To be backward compatible with Plain \TEX, we define two
+%D arrowfills: \tex {specrightarrowfill} which takes an extra argument, and \tex
+%D {rightarrowfill} which does not.
 
 \unexpanded\def\specrightarrowfill   {\defaultmtharrowfill \relbar               \relbar \rightarrow}
 \unexpanded\def\specleftarrowfill    {\defaultmtharrowfill \leftarrow            \relbar \relbar}
@@ -382,10 +336,9 @@
 \unexpanded\def\doublebond{{\xequal}}
 \unexpanded\def\triplebond{{\xtriplerel}}
 
-%D Now we define most commonly used arrows. These include arrows
-%D defined in \filename{amsmath.sty}, \filename{extarrows.sty},
-%D \filename{extpfel.sty} and \filename{mathtools.sty} packages for
-%D \LATEX\ (plus a few more).
+%D Now we define most commonly used arrows. These include arrows defined in \filename
+%D {amsmath.sty}, \filename {extarrows.sty}, \filename {extpfel.sty} and \filename
+%D {mathtools.sty} packages for \LATEX\ (plus a few more).
 
 \definematharrow [xrightarrow]         [0359]      [\specrightarrowfill]
 \definematharrow [xleftarrow]          [3095]      [\specleftarrowfill]
@@ -427,27 +380,27 @@
 
 %D \macros{definemathoverarrow,defineunderarrow}
 %D
-%D These macros for define math-overarrows are adapted from
-%D \filename{amsmath.sty}
+%D These macros for define math-overarrows are adapted from \filename
+%D {amsmath.sty}
 
 \unexpanded\def\definemathoverarrow
-  {\dotripleargument\dodefinemathoverarrow}
+  {\dotripleargument\math_arrows_define_over}
 
-\def\dodefinemathoverarrow[#1][#2][#3]%
+\def\math_arrows_define_over[#1][#2][#3]%
   {\ifthirdargument
-      \setuvalue{#1}{\dohandlemathoverarrow[#2][#3]}%
+      \setuvalue{#1}{\math_arrows_over_handle[#2][#3]}%
     \else
-      \setuvalue{#1}{\dohandlemathoverarrow[\zeropoint][#2]}%
+      \setuvalue{#1}{\math_arrows_over_handle[\zeropoint][#2]}%
     \fi}
 
-\def\dohandlemathoverarrow[#1][#2]%
-  {\mathpalette{\dodohandlemathoverarrow{#1}{#2}}}
+\def\math_arrows_over_handle[#1][#2]%
+  {\mathpalette{\math_arrows_over_handle_indeed{#1}{#2}}}
 
-%D Note: \filename{math-pln.tex} has \type{\kern-\onepoint} and
-%D \filename{amsmath.sty} does not. We keep the kern amount
-%D configurable. This is useful for harpoons.
+%D Note: \filename {math-pln.tex} has \type {\kern-\onepoint} and \filename
+%D {amsmath.sty} does not. We keep the kern amount configurable. This is useful
+%D for harpoons.
 
-\def\dodohandlemathoverarrow#1#2#3#4%
+\def\math_arrows_over_handle_indeed#1#2#3#4%
   {\vbox{\ialign{##\crcr
    #2#3\crcr
    \noalign{\kern#1\nointerlineskip}%
@@ -456,21 +409,21 @@
 %D Now the under arrows
 
 \unexpanded\def\definemathunderarrow
-  {\dotripleargument\dodefinemathunderarrow}
+  {\dotripleargument\math_arrows_define_over}
 
 %D For underarrows the default kern is 0.3ex
 
-\def\dodefinemathunderarrow[#1][#2][#3]%
+\def\math_arrows_define_over[#1][#2][#3]%
   {\ifthirdargument
-      \setuvalue{#1}{\dohandlemathunderarrow[#2][#3]}%
+      \setuvalue{#1}{\math_arrows_under_handle[#2][#3]}%
     \else
-      \setuvalue{#1}{\dohandlemathunderarrow[0.3ex][#2]}%
+      \setuvalue{#1}{\math_arrows_under_handle[0.3ex][#2]}%
     \fi}
 
-\def\dohandlemathunderarrow[#1][#2]%
-  {\mathpalette{\dodohandlemathunderarrow{#1}{#2}}}
+\def\math_arrows_under_handle[#1][#2]%
+  {\mathpalette{\math_arrows_under_handle_indeed{#1}{#2}}}
 
-\def\dodohandlemathunderarrow#1#2#3#4%
+\def\math_arrows_under_handle_indeed#1#2#3#4%
   {\vtop{\ialign{##\crcr
    $\mathsurround\zeropoint\hfil#3#4\hfil$\crcr
    \noalign{\nointerlineskip\kern#1}%
diff --git a/tex/context/base/math-for.mkiv b/tex/context/base/math-for.mkiv
index aee640572..0c8bd05ae 100644
--- a/tex/context/base/math-for.mkiv
+++ b/tex/context/base/math-for.mkiv
@@ -30,19 +30,4 @@
 \let\setupformulas   \setupformula
 \let\setupsubformulas\setupsubformula
 
-% D \macros
-% D   {setuptextformulas}
-% D
-% D This command sets up in||line math. Most features deals
-% D with grid snapping and are experimental.
-
-% \newtoks \everysetuptextformulas
-%
-% \unexpanded\def\setuptextformulas
-%   {\dosingleempty\dosetuptextformulas}
-%
-% \def\dosetuptextformulas[#1]%
-%   {\getparameters[\??mt][#1]%
-%    \the\everysetuptextformulas}
-
 \protect \endinput
diff --git a/tex/context/base/math-ini.mkiv b/tex/context/base/math-ini.mkiv
index 9a8dbef25..e6a3ae6f3 100644
--- a/tex/context/base/math-ini.mkiv
+++ b/tex/context/base/math-ini.mkiv
@@ -53,6 +53,8 @@
 \definesystemattribute[mathmode]       [public]
 \definesystemattribute[mathitalics]    [public]
 
+\definesystemattribute[displaymath]    [public]
+
 \appendtoks
     \attribute\mathmodeattribute\plusone
 \to \everydisplay
@@ -61,6 +63,10 @@
     \attribute\mathmodeattribute\plusone
 \to \everybeforedisplayformula
 
+\appendtoksonce
+    \attribute\displaymathattribute\plusone
+\to \everybeforedisplayformula
+
 \setnewconstant\defaultmathfamily \zerocount % 255
 
 %D Some measures (maybe spac-mth):
@@ -75,18 +81,6 @@
 %D Configuration for integrals. (If needed we can speed this up and make it
 %D installable; no processaction is needed then).
 
-% \newtoks\everysetupmathematics
-%
-% \unexpanded\def\setupmathematics
-%   {\dosingleargument\dosetupmathematics}
-%
-% \def\dosetupmathematics[#1]%
-%   {\getparameters[\??mo][#1]%
-%    \the\everysetupmathematics}
-%
-% \def\mathematicsparameter#1%
-%   {\ifcsname\??mo#1\endcsname\csname\??mo#1\endcsname\fi}
-
 \installcorenamespace{mathematics}
 
 \installswitchcommandhandler \??mathematics {mathematics} \??mathematics
diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv
index a62b81ccf..b1b8998a5 100644
--- a/tex/context/base/meta-ini.mkiv
+++ b/tex/context/base/meta-ini.mkiv
@@ -104,14 +104,6 @@
    \c!textstyle=,
    \c!textcolor=]
 
-% \unexpanded\def\defineMPinstance
-%   {\dodoubleargument\meta_define_instance}
-
-% \def\meta_define_instance[#1][#2]%
-%   {\ifcsname\??mpinstancetokens#1\endcsname\else\expandafter\newtoks\csname\??mpinstancetokens#1\endcsname\fi
-%    \t_meta_instance\emptytoks % in case we redefine
-%    \getparameters[\??mpinstance#1][\s!format=mpost,\s!extensions=\v!no,\s!initializations=\v!no,#2]}
-
 \appendtoks
     \ifcsname\??mpinstancetokens\currentMPinstance\endcsname \else
         \expandafter\newtoks\csname\??mpinstancetokens\currentMPinstance\endcsname
@@ -362,34 +354,36 @@
 \let \m_meta_current_variable         \empty
 \let \m_meta_current_variable_template\empty
 
+\installcorenamespace{graphicvariable}
+
 \def \meta_prepare_variable_default   {\MPcolor{black}} % just to be sure we use a color but ...
-\edef\meta_unknown_variable_template  {\??gv:\s!unknown}
+\edef\meta_unknown_variable_template  {\??graphicvariable:\s!unknown}
 
-\letvalue{\??gv:\s!unknown}\empty
+\letvalue{\??graphicvariable:\s!unknown}\empty
 
 \unexpanded\def\setupMPvariables
   {\dodoubleempty\meta_setup_variables}
 
 \def\meta_setup_variables[#1][#2]%
   {\ifsecondargument
-     \getrawparameters[\??gv#1:][#2]%
+     \getrawparameters[\??graphicvariable#1:][#2]%
    \else
-     \getrawparameters[\??gv:][#1]%
+     \getrawparameters[\??graphicvariable:][#1]%
    \fi}
 
 \unexpanded\def\presetMPvariable
   {\dodoubleargument\meta_preset_variable}
 
 \def\meta_preset_variable[#1][#2=#3]%
-  {\ifcsname\??gv#1:#2\endcsname \else
-     \setvalue{\??gv#1:#2}{#3}%
+  {\ifcsname\??graphicvariable#1:#2\endcsname \else
+     \setvalue{\??graphicvariable#1:#2}{#3}%
    \fi}
 
 \def\MPrawvar#1#2% no checking
-  {\csname\??gv#1:#2\endcsname}
+  {\csname\??graphicvariable#1:#2\endcsname}
 
 \def\MPvariable#1% todo: could be a framed chain
-  {\csname\??gv\currentmpvariableclass:#1\endcsname}
+  {\csname\??graphicvariable\currentmpvariableclass:#1\endcsname}
 
 \unexpanded\def\useMPvariables
   {\dodoubleargument\meta_use_variables}
@@ -403,7 +397,7 @@
 
 \unexpanded\def\meta_prepare_variable#1%
   {\edef\m_meta_current_variable_template
-     {\??gv\currentmpvariableclass:#1}%
+     {\??graphicvariable\currentmpvariableclass:#1}%
    \edef\m_meta_current_variable
      {\csname\ifcsname\m_meta_current_variable_template\endcsname
         \m_meta_current_variable_template\else\meta_unknown_variable_template
@@ -1172,11 +1166,9 @@
 %D
 %D Here is a generic setup command:
 
-\newtoks\everysetupMPgraphics
+\installcorenamespace{MPgraphics}
 
-\unexpanded\def\setupMPgraphics[#1]%
-  {\getparameters[\??mp][#1]%
-   \the\everysetupMPgraphics}
+\installsetuponlycommandhandler \??MPgraphics {MPgraphics}
 
 %D Here we hook in the outer color. When \type {color} is set to \type
 %D {global} we get the outer color automatically. If you change this
@@ -1184,7 +1176,7 @@
 %D behave in unexpected ways.
 
 \appendtoks
-    \doifelse\@@mpcolor\v!global{\MPcolormethod\plusone}{\MPcolormethod\zerocount}%
+    \doifelse{\directMPgraphicsparameter\c!color}\v!global{\MPcolormethod\plusone}{\MPcolormethod\zerocount}%
 \to \everysetupMPgraphics
 
 \setupMPgraphics
diff --git a/tex/context/base/mult-def.mkiv b/tex/context/base/mult-def.mkiv
index a2673f9d2..c7c3402a6 100644
--- a/tex/context/base/mult-def.mkiv
+++ b/tex/context/base/mult-def.mkiv
@@ -63,6 +63,10 @@
 \def\s!italics        {italics}
 \def\s!integral       {integral}
 
+\def\c!HL             {HL}
+\def\c!VL             {VL}
+\def\c!NL             {NL}
+
 \ifdefined\v!kerncharacters\else \def\v!kerncharacters{kerncharacters} \fi % no time now for translations should be a e! actually
 \ifdefined\v!stretched     \else \def\v!stretched     {stretched}      \fi
 \ifdefined\v!vulgarfraction\else \def\v!vulgarfraction{vulgarfraction} \fi
diff --git a/tex/context/base/mult-low.lua b/tex/context/base/mult-low.lua
index fb4e05d49..fbd5d585d 100644
--- a/tex/context/base/mult-low.lua
+++ b/tex/context/base/mult-low.lua
@@ -17,6 +17,7 @@ return {
         "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxdimen", "scaledpoint", "thousandpoint",
         "points", "halfpoint",
         "zeroskip",
+        "zeromuskip", "onemuskip",
         "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi",
         "normalpagebox",
         --        --
@@ -203,7 +204,7 @@ return {
         --
         "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to",
         --
-        "endgraf", "empty", "null", "space", "quad", "enspace", "obeyspaces", "obeylines", "normalspace",
+        "endgraf", "endpar", "everyendpar", "empty", "null", "space", "quad", "enspace", "obeyspaces", "obeylines", "normalspace",
         --
         "executeifdefined",
         --
diff --git a/tex/context/base/mult-sys.mkiv b/tex/context/base/mult-sys.mkiv
index f76840971..46d321632 100644
--- a/tex/context/base/mult-sys.mkiv
+++ b/tex/context/base/mult-sys.mkiv
@@ -452,108 +452,52 @@
 %D for instance is available as \type{\??ag} and expands to
 %D \type{@@ag} in composed variables.
 
-\definesystemvariable {ab}   % AlignedBoxes
-\definesystemvariable {ae}   % AttributEs
-\definesystemvariable {an}   % ANchor
-\definesystemvariable {as}   % AlignmentSwitch
-\definesystemvariable {bp}   % BreakPoint
-\definesystemvariable {bx}   % BackendExport
-\definesystemvariable {cb}   % CollectBox
-\definesystemvariable {cp}   % CliP
-\definesystemvariable {da}   % DAte
+\definesystemvariable {du}   % dummy, will stay
+
+% these will be replaced by namespaces / commandhandlers
+
 \definesystemvariable {db}   % Labels
 \definesystemvariable {dd}   % DoorDefinieren
-\definesystemvariable {de}   % DEel
-\definesystemvariable {dl}   % DunneLijnen
-\definesystemvariable {dn}   % DoorNummeren
-\definesystemvariable {dm}   % DefineMeasure
-\definesystemvariable {du}   % DUmmy
-\definesystemvariable {ef}   % ExternFiguur
-\definesystemvariable {en}   % ENvironments
-\definesystemvariable {ex}   % ExterneFiguren
-\definesystemvariable {fc}   % FramedContent
-\definesystemvariable {fi}   % FIle Once
-\definesystemvariable {fo}   % xml FO (xtag)
-\definesystemvariable {fu}   % FontSolution
-\definesystemvariable {fw}   % simpleFonts by Wolfgang
-\definesystemvariable {fx}   % FoXet
-\definesystemvariable {gb}   % Graphic Bitmaps
-\definesystemvariable {gv}   % Graphic Variable
-\definesystemvariable {ha}   % HAng
 \definesystemvariable {id}   % Index
-\definesystemvariable {ih}   % InHoudsopgave
-\definesystemvariable {il}   % stelInvulRegelsin
-\definesystemvariable {ip}   % InsertPages
-\definesystemvariable {it}   % stelInTerliniein
-\definesystemvariable {iv}   % stelInvulLijnenin
-\definesystemvariable {ka}   % KAntlijn
+
 \definesystemvariable {kl}   % KoLommen
-\definesystemvariable {km}   % KenMerk
-\definesystemvariable {kp}   % KopPelteken
 \definesystemvariable {ks}   % KolomSpan
-\definesystemvariable {kt}   % KonTakten
-\definesystemvariable {kw}   % KontaktWaarde
-\definesystemvariable {le}   % LinetablE
-\definesystemvariable {lf}   % LocalFigures
-\definesystemvariable {lg}   % taal (LanGuage)
-\definesystemvariable {lk}   % LinK
-\definesystemvariable {ll}   % Layers
-\definesystemvariable {lr}   % LayeR
-\definesystemvariable {lu}   % LUacode
-\definesystemvariable {ma}   % MargeAchtergrond
 \definesystemvariable {mc}   % MultiColumn
-\definesystemvariable {mt}   % inline MaTh
-\definesystemvariable {mt}   % multi column (!!! double usage)
-\definesystemvariable {mo}   % Math Options
-\definesystemvariable {mp}   % MetaPost
-\definesystemvariable {nn}   % structurenumbering
-\definesystemvariable {nm}   % Nummering
-\definesystemvariable {np}   % NaastPlaatsen
-\definesystemvariable {nr}   % Nummeren
+\definesystemvariable {mt}   % MulTicolumn
+
+\definesystemvariable {fc}   % FramedContent
+\definesystemvariable {od}   % Omlijnd Defaults (simple)
 \definesystemvariable {oi}   % OmlijndInstellingen
 \definesystemvariable {ol}   % OmLijnd
-\definesystemvariable {od}   % Omlijnd Defaults (simple)
-\definesystemvariable {pb}   % PuBlication
-\definesystemvariable {pc}   % PageComment
-\definesystemvariable {ph}   % ParagrapH
-\definesystemvariable {pn}   % PaginaNummer
-\definesystemvariable {pr}   % PRogrammas
-\definesystemvariable {py}   % PropertYs
+
+\definesystemvariable {le}   % LinetablE
+
+% bibl:
+
 \definesystemvariable {pv}   % PublicationVariable
-\definesystemvariable {ql}   % catcode table let     % already defined
-\definesystemvariable {qd}   % catcode table def     % already defined
-\definesystemvariable {qu}   % catcode table ued     % already defined
-\definesystemvariable {qm}   % catcode table meaning % already defined
-\definesystemvariable {rn}   % RegelNummer
-\definesystemvariable {rs}   % RaSters
-\definesystemvariable {rt}   % RoosTers
-\definesystemvariable {rw}   % RenderingWindow
-\definesystemvariable {sb}   % SectieBlok
-\definesystemvariable {sd}   % SounD
-\definesystemvariable {se}   % SEctie
-\definesystemvariable {sh}   % ShapeText
-\definesystemvariable {sp}   % SelecteerPapier
+\definesystemvariable {pb}   % PuBlication
+
+% needs checking (namespaces now)
+
+\definesystemvariable {fw}   % simpleFonts by Wolfgang
+
+% old pragma
+
+\definesystemvariable {kt}   % KonTakten
+\definesystemvariable {kw}   % KontaktWaarde
 \definesystemvariable {st}   % STickers
-\definesystemvariable {sx}   % Selector
-\definesystemvariable {ta}   % TAb
-\definesystemvariable {tb}   % TekstBlokken
-\definesystemvariable {te}   % TEmplate
-\definesystemvariable {ti}   % TabelInstellingen
-\definesystemvariable {tl}   % TekstLijnen
-\definesystemvariable {tt}   % TabulaTe
-\definesystemvariable {tx}   % TeXtflow
-\definesystemvariable {ur}   % URl
-\definesystemvariable {vn}   % VoetNoten
+\definesystemvariable {km}   % KenMerk
+
+% mkii
+
 \definesystemvariable {xf}   % XML File (xtag)
 \definesystemvariable {xp}   % XML Processing (xtag, so still needed)
-\definesystemvariable {za}   % layout adapt % ZetspiegelAanpassing
-\definesystemvariable {zc}   % columns
+\definesystemvariable {fo}   % xml FO (xtag)
+\definesystemvariable {fx}   % FoXet
 
 % still used but defined locally
 
-\definesystemvariable {cs}   % CharacterSpacing
 \definesystemvariable {ts}   % TypeScript
-\definesystemvariable {kk}   % Kapitalen
 
 % obsolete but kept for a while (core-obs)
 
@@ -621,8 +565,8 @@
 %definefileconstant {figureextension}    {tuf}
 %definefileconstant {inputextension}     {tui}
 %definefileconstant {outputextension}    {tuo} % tup for previous run
-\definefileconstant {optionextension}    {top}
-\definefileconstant {temporaryextension} {tmp}
+%definefileconstant {optionextension}    {top}
+%definefileconstant {temporaryextension} {tmp}
 %definefileconstant {patternsextension}  {pat}
 %definefileconstant {hyphensextension}   {hyp}
 %definefileconstant {fontmapextension}   {map}
diff --git a/tex/context/base/pack-bck.mkvi b/tex/context/base/pack-bck.mkvi
index fbe704fab..57d0ee456 100644
--- a/tex/context/base/pack-bck.mkvi
+++ b/tex/context/base/pack-bck.mkvi
@@ -209,7 +209,7 @@
 %    \c!color=,
 %    \c!background=\v!screen,
 %    \c!backgroundcolor=\backgroundparameter\c!color,
-%    \c!screen=\@@rsscreen,
+%    \c!screen=\defaultbackgroundscreen,
 %
    \c!background=\v!color,
    \c!backgroundcolor=lightgray,
diff --git a/tex/context/base/pack-mrl.mkiv b/tex/context/base/pack-mrl.mkiv
index dae6acf47..72b12d639 100644
--- a/tex/context/base/pack-mrl.mkiv
+++ b/tex/context/base/pack-mrl.mkiv
@@ -13,26 +13,24 @@
 
 \writestatus{loading}{ConTeXt Packaging Macros / More Rules}
 
-%D This module needs an overhaul.
+%D The (re)implementation of margin rules has been moved elsewhere.
 
 \unprotect
 
 %D \macros
 %D   {setupblackrules,blackrule}
 %D
-%D The graphic capabilities of \TEX\ do not go beyond simple
-%D filled rules, except of course when using specials. Let's
-%D start with a warning: using this commands is far more slower
-%D than using the \TEX\ primitives \type{\hrule} and
-%D \type{\vrule}, but they save us some tokens. The
+%D The graphic capabilities of \TEX\ do not go beyond simple filled rules, except of
+%D course when using specials or, in \MKIV, manipulate node lists. Let's start with
+%D a warning: using this commands is far more slower than using the \TEX\ primitives
+%D \type {\hrule} and \type {\vrule}, but they save us some tokens. The
 %D characteristics of these rule drawing command can be set by:
 %D
 %D \showsetup{setupblackrules}
 %D
-%D The simple command draws only one rule. Its optional
-%D argument can be used to specify the dimensions. By setting
-%D the width, height or depth to \type {max}, one gets the
-%D natural dimensions.
+%D The simple command draws only one rule. Its optional argument can be used to
+%D specify the dimensions. By setting the width, height or depth to \type {max}, one
+%D gets the natural dimensions.
 %D
 %D \showsetup{blackrule}
 
@@ -73,8 +71,8 @@
 %D \macros
 %D   {blackrules}
 %D
-%D One can call for a sequence of black rules, if needed
-%D equally spaced over the given width.
+%D One can call for a sequence of black rules, if needed equally spaced over the
+%D given width.
 %D
 %D \showsetup{blackrules}
 %D
@@ -93,9 +91,8 @@
 %D \getbuffer
 %D \stoplines
 %D
-%D We could of course have implemented this macro using
-%D \type{\leaders}, but this would probably have taken more
-%D tokens.
+%D We could of course have implemented this macro using \type {\leaders}, but this
+%D would probably have taken more tokens.
 
 \unexpanded\def\blackrules % probably never used
   {\hbox\bgroup
@@ -135,139 +132,19 @@
    \c!distance=.25\emwidth,
    \c!color=]
 
-%D Marginrules will either become obsolete or be redone.
-
-%D The next commands can be used to draw margin rules. We
-%D support two methods: \marginrule{one for in||line use} and
-%D one that acts on a paragraph. Drawing a margin rule is
-%D rather straightforward because we can use the commands that
-%D put text in the margin.
-
-\def\dodrawmarginrule
-  {\setbox\scratchbox\hbox
-     {\vrule\!!depth\strutdepth\!!height\strutheight\!!width\@@karulethickness}%
-   \smashbox\scratchbox % no \vsmash !!!
-   \box\scratchbox}
-
-\def\drawmarginrule
-  {\strut\inleft{\dodrawmarginrule}}
-
-%D \macros
-%D   {marginrule}
-%D
-%D The first method gobbles words and simply puts a bar in the
-%D margin. This method is not entirely robust.
-%D
-%D \showsetup{marginrule}
-
-\definecomplexorsimple\marginrule
-
-\def\simplemarginrule
-  {\let\processword\drawmarginrule
-   \processwords}
-
-\def\complexmarginrule[#1]%
-  {\ifnum#1<\@@kalevel\relax \else
-     \def\@@kadefaultwidth{#1}%
-     \expandafter\simplemarginrule
-   \fi}
-
-%D We need an auxiliary variable
-
-\def\@@kadefaultwidth{1}
-
-%D \macros
-%D   {setupmarginrules}
-%D
-%D This macro definitions show us that we can pass an optional
-%D level, which is matched against the previous set one. The
-%D level can be set up with
-%D
-%D \showsetup{setupmarginrules}
-
-% \unexpanded\def\setupmarginrules
-%   {\dodoubleargument\getparameters[\??ka]}
-%
-% %D \macros
-% %D   {startmarginrule}
-% %D
-% %D The second method collects text and reformats it afterwards,
-% %D using the shapebox macros. We prevent local margin rules.
-% %D
-% %D \showsetup{startmarginrule}
-%
-% \definecomplexorsimple\startmarginrule
-%
-% \def\simplestartmarginrule
-%   {\bgroup
-%    \let\drawmarginrule\relax
-%    \let\stopmarginrule\dostopmarginrule
-%    \beginofshapebox}
-%
-% \def\complexstartmarginrule[#1]%
-%   {\bgroup
-%    \let\drawmarginrule\relax
-%    \ifnum#1<\@@kalevel\relax
-%      \let\stopmarginrule\egroup
-%    \else
-%      \def\@@kadefaultwidth{#1}%
-%      \let\stopmarginrule\dostopmarginrule
-%      \expandafter\beginofshapebox
-%    \fi}
-%
-% \def\dostopmarginrule
-%   {\endofshapebox
-%    \reshapebox
-%      {\hbox{\inleftmargin{\dodrawmarginrule}\box\shapebox}}%
-%    \flushshapebox
-%    \egroup}
-
-%D \startbuffer
-%D \setupmarginrules[level=5]
-%D
-%D \startmarginrule[1]
-%D First we set the level at~5. Next we typeset this first
-%D paragraph as a level~1 one. As expected no rule show up.
-%D \stopmarginrule
-%D
-%D \startmarginrule[5]
-%D The second paragraph is a level~5 one. As we can see here,
-%D the marginal rule gets a width according to its level.
-%D \stopmarginrule
-%D
-%D \startmarginrule[8]
-%D It will of course be no surprise that this third paragraph
-%D has a even thicker margin rule. This behavior can be
-%D overruled by specifying the width explictly.
-%D \stopmarginrule
-%D \stopbuffer
-%D
-%D In next example we show most features. Watch the rule
-%D thickness adapting itself to the level.
-%D
-%D \startexample
-%D \getbuffer
-%D \stopexample
-%D
-%D We just said:
-%D
-%D \typebuffer
-
 %D \macros
 %D   {vl, hl}
 %D
-%D The command \type{\vl} draws a vertical rule \vl\ with strut
-%D dimensions, multiplied with the factor specified in the
-%D optional argument. The height and depth are clipped \vl[3]
-%D to the baselinedistance. Its horizontal counterpart
-%D \type{\hl} draws a horizontal rule \hl\ with a width of 1em,
-%D multiplied with the optional factor. The horizontal rule is
-%D drawn on top of the baseline.
+%D The command \type {\vl} draws a vertical rule \vl\ with strut dimensions,
+%D multiplied with the factor specified in the optional argument. The height and
+%D depth are clipped \vl [3] to the baselinedistance. Its horizontal counterpart
+%D \type {\hl} draws a horizontal rule \hl\ with a width of 1em, multiplied with the
+%D optional factor. The horizontal rule is drawn on top of the baseline.
 %D
 %D \showsetup{vl}
 %D \showsetup{hl}
 
-\unexpanded\def\dovlwdhtdp#1#2#3% used elsewhere
+\unexpanded\def\pack_rule_vl_indeed#1#2#3%
   {\bgroup
    \setbox\scratchbox\hbox
      {\vrule
@@ -279,25 +156,27 @@
    \box\scratchbox
    \egroup}
 
-\def\complexvl[#1]%
-  {\dovlwdhtdp\plusone{#1}{#1}}
+\def\pack_rule_vl[#1]%
+  {\pack_rule_vl_indeed{#1}{#1}{#1}}
 
-\def\complexhl[#1]%
+\def\pack_rule_hl[#1]%
   {\hbox
      {\vrule
         \!!width #1\emwidth
         \!!height\linewidth
         \!!depth \zeropoint}}
 
-\definecomplexorsimple\vl \def\simplevl{\complexvl[\plusone]}
-\definecomplexorsimple\hl \def\simplehl{\complexhl[\plusone]}
+\unexpanded\def\vl{\dosingleempty\pack_rule_vl}
+\unexpanded\def\hl{\dosingleempty\pack_rule_hl}
+
+\let\dovlwdhtdp\pack_rule_vl_indeed % used elsewhere
 
 %D \macros
 %D   {hairline, thinrule, thinrules, setupthinrules}
 %D
-%D Drawing thin lines can of course easily be accomplished by
-%D the \TEX\ primitives \type{\hrule} and \type{\vrule}. The
-%D next few macros however free us from some specifications.
+%D Drawing thin lines can of course easily be accomplished by the \TEX\
+%D primitives \type{\hrule} and \type{\vrule}. The next few macros however
+%D free us from some specifications.
 %D
 %D \startbuffer
 %D some text
@@ -338,112 +217,158 @@
 %D
 %D which looks like: \thinrules[n=2]
 
-\newconstant\ruletype
+\installcorenamespace{thinrules}
+\installcorenamespace{thinrulealternatives}
+
+\installdirectcommandhandler \??thinrules {thinrules}
+
+\setupthinrules
+  [\c!interlinespace=\v!small,
+   \c!n=3,
+   \c!before=,
+   \c!inbetween={\blank[\v!white]},
+   \c!after=,
+   \c!color=,
+   \c!height=.5\linewidth,
+   \c!depth=.5\linewidth,
+   \c!frame=\v!on, % compatible with textbackgrounds
+   \c!alternative=\v!b,
+   \c!backgroundcolor=,
+   \c!background=,
+   \c!rulethickness=\linewidth]
+
+\letvalue{\??thinrulealternatives\v!a   }\zerocount
+\letvalue{\??thinrulealternatives\v!b   }\plusone
+\letvalue{\??thinrulealternatives\v!c   }\plustwo
+\letvalue{\??thinrulealternatives\v!none}\zerocount
+
+\newconstant\c_pack_thinrules_type
 
 \def\thinrule
   {\strut
    \bgroup
-   \ruletype\plusone
-   \processaction
-     [\@@dlalternative]
-     [ \v!a=>\ruletype\zerocount,% no line
-      %\v!b=>\ruletype\plusone  ,% height/depth
-       \v!c=>\ruletype\plustwo  ,% topheight/botdepth
-      %  11=>\ruletype\plusone  ,% fallback for  backgrounds
-          0=>\ruletype\zerocount,% compatible with backgrounds
-      %   1=>\ruletype\plusone  ,% compatible with backgrounds
-          2=>\ruletype\plustwo  ]% compatible with backgrounds
-   \doifsomething\@@dlrulethickness
-     {\linewidth\@@dlrulethickness}%
+   \edef\p_height    {\directthinrulesparameter\c!height}%
+   \edef\p_depth     {\directthinrulesparameter\c!depth}%
+   \edef\p_background{\directthinrulesparameter\c!background}%
+   \edef\p_frame     {\directthinrulesparameter\c!frame}%
+   \linewidth\dimexpr\directthinrulesparameter\c!rulethickness/\plustwo\relax
    \ifdim\linewidth=\zeropoint
-     \ruletype\zerocount
+     \c_pack_thinrules_type\zerocount
+   \else\ifx\p_frame\v!on
+     \c_pack_thinrules_type\expandcheckedcsname\??thinrulealternatives{\directthinrulesparameter\c!alternative}\v!b\relax
+   \else
+     \c_pack_thinrules_type\zerocount
+   \fi\fi
+   \ifnum\c_pack_thinrules_type=\plusone
+     \ifx\p_height\v!max
+       \scratchheight\strutht
+     \else
+       \setdimensionwithunit\scratchheight\p_height\strutht
+     \fi
+     \ifx\p_depth\v!max
+        \scratchdepth\strutdp
+     \else
+        \setdimensionwithunit\scratchdepth\p_depth\strutdp
+     \fi
    \else
-     \doifnot\@@dlframe\v!on{\ruletype\zerocount}%
+     \scratchheight\strutht
+     \scratchdepth \strutdp
    \fi
-   \ifnum\ruletype=\plusone
-     \doif\@@dlheight\v!max{\let\@@dlheight\!!plusone}%
-     \doif\@@dldepth \v!max{\let\@@dldepth \!!plusone}%
+   \ifx\p_background\v!color
+     \startcolor[\directthinrulesparameter\c!backgroundcolor]%
+       \ifnum\c_pack_thinrules_type=\plustwo % prevent overshoot due to rounding
+         \leaders
+           \hrule
+             \!!height\dimexpr\scratchheight-\linewidth\relax
+             \!!depth \dimexpr\scratchdepth -\linewidth\relax
+           \hfill
+       \else
+         \leaders
+           \hrule
+             \!!height\scratchheight
+             \!!depth \scratchdepth
+           \hfill
+       \fi
+     \stopcolor
+     \ifcase\c_pack_thinrules_type
+       % no rule
+     \or
+       \startcolor[\directthinrulesparameter\c!color]%
+         \hfillneg
+         \leaders
+           \hrule
+             \!!height\linewidth
+             \!!depth \linewidth
+           \hfill
+       \stopcolor
+     \or
+       \startcolor[\directthinrulesparameter\c!color]%
+         \hfillneg
+         \leaders
+           \hrule
+             \!!height\dimexpr-\scratchdepth+\linewidth\relax
+             \!!depth \scratchdepth
+           \hfill
+         \hfillneg
+         \leaders
+           \hrule
+             \!!height\scratchheight
+             \!!depth \dimexpr-\scratchheight+\linewidth\relax
+           \hfill
+       \stopcolor
+     \fi
    \else
-     \let\@@dlheight\!!plusone
-     \let\@@dldepth\!!plusone
+     \ifcase\c_pack_thinrules_type
+       % no rule
+     \else
+       \startcolor[\directthinrulesparameter\c!color]%
+         \leaders
+           \hrule
+             \!!height\scratchheight
+             \!!depth \scratchdepth
+           \hfill
+       \stopcolor
+     \fi
    \fi
-   \freezedimensionwithunit\@@dlheight\strutht
-   \freezedimensionwithunit\@@dldepth\strutdp
-   \divide\linewidth \plustwo
-   \doifelse\@@dlbackground\v!color
-     {\startcolor[\@@dlbackgroundcolor]%
-      \ifnum\ruletype=\plustwo % prevent overshoot due to rounding
-        \leaders
-          \hrule
-            \!!height\dimexpr\@@dlheight-.5\linewidth\relax
-            \!!depth \dimexpr\@@dldepth -.5\linewidth\relax
-          \hfill
-      \else
-        \leaders
-          \hrule
-            \!!height\@@dlheight
-            \!!depth \@@dldepth
-          \hfill
-      \fi
-      \stopcolor
-      \ifcase\ruletype
-        % no rule
-      \or
-        \startcolor[\@@dlcolor]%
-        \hfillneg
-        \leaders\hrule\!!height\linewidth\!!depth\linewidth\hfill
-        \stopcolor
-      \or
-        \startcolor[\@@dlcolor]%
-        \hfillneg\leaders\hrule\!!height\dimexpr-\@@dldepth+\linewidth\relax\!!depth\@@dldepth\hfill
-        \hfillneg\leaders\hrule\!!height\@@dlheight\!!depth\dimexpr-\@@dlheight+\linewidth\relax\hfill
-        \stopcolor
-      \fi}
-     {\ifcase\ruletype \else
-        \startcolor[\@@dlcolor]%
-        \leaders\hrule\!!height\@@dlheight\!!depth\@@dldepth\hfill
-        \stopcolor
-      \fi}%
    \strut
    \carryoverpar\egroup}
 
-\def\hairline
+\unexpanded\def\hairline
   {\endgraf
    \thinrule
    \endgraf}
 
-\def\dosetupthinrules[#1]%
-  {\getparameters[\??dl][#1]}
+\unexpanded\def\thinrules
+  {\dosingleempty\pack_thinrules}
 
-\unexpanded\def\setupthinrules
-  {\dosingleargument\dosetupthinrules}
-
-\def\dothinrules[#1]%
+\def\pack_thinrules[#1]%
   {\bgroup
-   \dosetupthinrules[#1]%
-   \@@dlbefore
-   \assignvalue\@@dlinterlinespace\@@dlinterlinespace{1.0}{1.5}{2.0}%
-   \spacing\@@dlinterlinespace
-   \dorecurse\@@dln
-     {\ifnum\recurselevel=\@@dln \dothinrulesnobreak \else
-      \ifnum\recurselevel=2      \dothinrulesnobreak \fi\fi
-                                 \thinrule
-      \ifnum\recurselevel<\@@dln\relax
+   \setupcurrentthinrules[#1]%
+   \assignvalue{\directthinrulesparameter\c!interlinespace}\m_pack_thinrules_interlinespace{1.0}{1.5}{2.0}%
+   \spacing\m_pack_thinrules_interlinespace
+   \edef\p_after    {\directthinrulesparameter\c!after}%
+   \edef\p_inbetween{\directthinrulesparameter\c!inbetween}%
+   \directthinrulesparameter\c!before
+   \scratchcounter\directthinrulesparameter\c!n\relax
+   \dorecurse\scratchcounter
+     {\ifnum\recurselevel=\scratchcounter \penalty500 \else
+      \ifnum\recurselevel=\plustwo        \penalty500 \fi\fi
+      \thinrule
+      \ifnum\recurselevel<\scratchcounter\relax
         % test needed, else messed up whitespace
-        \ifx\@@dlinbetween\empty
-          \softbreak
+        \ifx\p_inbetween\empty
+          \softbreak % \ifhmode \hskip \parfillskip \break \fi
         \else
           \endgraf
           \nowhitespace
-          \@@dlinbetween
+          \p_inbetween
         \fi
       \fi}%
-   \doifelsenothing\@@dlafter
-     {\carryoverpar\egroup}
-     {\@@dlafter\egroup}}
-
-\def\thinrules
-  {\dosingleempty\dothinrules}
+   \ifx\p_after\empty
+     \carryoverpar\egroup
+   \else
+     \p_after\egroup
+   \fi{}}
 
 %D A couple of examples are given below.
 %D
@@ -464,11 +389,10 @@
 %D
 %D \typebuffer {\getbuffer}
 %D
-%D There are a couple of alternative ways to visualize rules
-%D using backgrounds. At first sight these may look strange,
-%D but they make sense in educational settings. The
-%D alternatives are more or less compatible with the more
-%D advanced \METAPOST\ based implementation.
+%D There are a couple of alternative ways to visualize rules using backgrounds. At
+%D first sight these may look strange, but they make sense in educational settings.
+%D The alternatives are more or less compatible with the more advanced \METAPOST\
+%D based implementation.
 %D
 %D \startbuffer[a]
 %D \setupthinrules
@@ -506,23 +430,11 @@
 %D
 %D \typebuffer[b] \getbuffer[a,b]
 
-%D \macros
-%D   {optimizethinrules}
-%D
-%D By saying \type {\thinrulestrue} or \type {-false}, we
-%D can influence the way dangling lines are handled.
-
-\newif\ifoptimizethinrules \optimizethinrulestrue
-
-\def\dothinrulesnobreak
-  {\ifoptimizethinrules\penalty500\fi}
-
 %D \macros
 %D   {textrule, starttextrule, setuptextrules}
 %D
-%D Putting rules before and after a paragraph is very space
-%D sensitive, but the next command handles that quite well. It
-%D comes in two disguises:
+%D Putting rules before and after a paragraph is very space sensitive, but the
+%D next command handles that quite well. It comes in two disguises:
 %D
 %D \startbuffer
 %D \textrule[top]{fragments}
@@ -562,132 +474,143 @@
 %D \showsetup{starttextrule}
 %D \showsetup{setuptextrules}
 %D
-%D The implementation looks a bit complicated due to the
-%D optional arguments.
+%D The implementation looks a bit complicated due to the optional arguments.
+
+\installcorenamespace{textrules}
+\installcorenamespace{textrulealternatives}
+
+\installdirectcommandhandler \??textrules {textrules}
+
+\setuptextrules
+  [\c!location=\v!left,
+   \c!before=\blank,
+   \c!after=\blank,
+   \c!inbetween=,
+   \c!width=2\emwidth,
+   \c!style=\v!bold,
+   \c!color=,
+   \c!rulecolor=,
+   \c!bodyfont=,
+   \c!rulethickness=\linewidth,
+   \c!distance=.5\emwidth]
+
+\unexpanded\def\textrule
+  {\dosingleempty\pack_textrule}
+
+\def\pack_textrule
+  {\iffirstargument
+     \expandafter\pack_textrule_yes
+   \else
+     \expandafter\pack_textrule_nop
+   \fi}
+
+\def\pack_textrule_yes[#1]%
+  {\expandcheckedcsname\??textrulealternatives{#1}\v!bottom}
+
+\def\pack_textrule_nop[#1]%
+  {\dosinglegroupempty\pack_textrule_nop_indeed}
+
+\def\pack_textrule_nop_indeed
+  {\iffirstargument
+     \expandafter\pack_textrule_nop_indeed_yes
+   \else
+     \expandafter\pack_textrule_nop_indeed_nop
+   \fi}
+
+\def\pack_textrule_nop_indeed_yes
+  {\csname\??textrulealternatives\v!top\endcsname}
 
-\unexpanded\def\setuptextrules
-  {\dodoubleargument\getparameters[\??tl]}
+\def\pack_textrule_nop_indeed_nop
+  {\csname\??textrulealternatives\v!bottom\endcsname\empty}
 
-\def\complextextrule[#1]% if needed we can make it installable
-  {\let\next\dobottomtextrule
-   \processaction
-     [#1]
-     [    \v!top=>\let\next\dotoptextrule,
-       \v!middle=>\let\next\domiddletextrule,
-       \v!bottom=>\let\next\dobottomtextrule]%
-   \dosinglegroupempty\next}
+\setvalue{\??textrulealternatives\v!top}#1%
+  {\page[\v!preference] % interferes
+   \directtextrulesparameter\c!before\relax
+   \pack_textrule_with_text{#1}%
+   \nowhitespace
+   \directtextrulesparameter\c!inbetween\relax
+   \endgraf}
 
-\definecomplexorsimple\textrule
+\setvalue{\??textrulealternatives\v!bottom}#1%
+  {\pack_textrule_following{#1}%
+   \directtextrulesparameter\c!after\relax
+   \page[\v!preference]}
 
-\def\simpletextrule
-  {\dosinglegroupempty\dounknowntextrule}
+\setvalue{\??textrulealternatives\v!middle}#1%
+  {\pack_textrule_following{#1}%
+   \directtextrulesparameter\c!inbetween\relax
+   \page[\v!preference]}
 
-\def\docomplextextrule#1%
+\def\pack_textrule_with_text#1%
   {\bgroup
-   \advance\hsize\dimexpr-\rightskip-\leftskip\relax
-   \setbox\scratchbox\hbox to \hsize
-     {\dimen4\dimexpr .5ex+.5\linewidth\relax
-      \dimen6\dimexpr-.5ex+.5\linewidth\relax
+   \setbox\scratchbox\hbox to \availablehsize
+     {\scratchwidth \directtextrulesparameter\c!rulethickness\relax
+      \scratchheight\dimexpr .5\exheight+.5\scratchwidth\relax
+      \scratchdepth \dimexpr-.5\exheight+.5\scratchwidth\relax
       \doifsomething{#1}
-        {\doifelse\@@tllocation\v!inmargin
+        {\doifelse{\directtextrulesparameter\c!location}\v!inmargin
            {\llap
-              {\dousestyleparameter\@@tlstyle
-               \dousecolorparameter\@@tlcolor
+              {\usetextrulesstyleandcolor\c!style\c!color
                #1%
                \hskip\leftmargindistance}}
-           {\color[\@@tlrulecolor]
-              {\vrule\!!height\dimen4\!!depth\dimen6\!!width\@@tlwidth}%
-            \hbox spread 2\dimexpr\@@tldistance\relax
+           {\color[\directtextrulesparameter\c!rulecolor]
+              {\vrule\!!height\scratchheight\!!depth\scratchdepth\!!width\directtextrulesparameter\c!width}%
+            \hbox spread 2\dimexpr\directtextrulesparameter\c!distance\relax
               {\hss
-               \dousestyleparameter\@@tlstyle
-               \dousecolorparameter\@@tlcolor
+               \usetextrulesstyleandcolor\c!style\c!color
                \strut#1%
                \hss}}}%
-      \color[\@@tlrulecolor]
-        {\leaders\hrule\!!height\dimen4\!!depth\dimen6\hfill}}%
+      \color[\directtextrulesparameter\c!rulecolor]
+        {\leaders\hrule\!!height\scratchheight\!!depth\scratchdepth\hfill}}%
    \ht\scratchbox\strutht
    \dp\scratchbox\strutdp
    \noindent\box\scratchbox
-%\nobreak\verticalstrut\kern-\struttotal
-% evt \witruimte
    \egroup}
 
-\def\dotoptextrule#1%
-  {\page[\v!preference] % interferes
-   %\whitespace % no
-   \@@tlbefore
-   \docomplextextrule{#1}%
-% todo, option: \doifnothing{#1}{\ruledvskip-.5ex}
-   \nowhitespace
-   \@@tlinbetween
-   \endgraf}
-
-\def\dodobottomtextrule#1#2%
+\def\pack_textrule_following#1%
   {\ifhmode
      \endgraf
    \fi
-   \dimen0\strutdp
-   \ifdim\prevdepth>\strutdp\else % was <\strutdp
-     \ifdim\prevdepth>\zeropoint
-       \advance\dimen0 -\prevdepth
+   \vskip\dimexpr \strutdp +.5\exheight
+     \ifdim\prevdepth>\strutdp\else % was <\strutdp
+       \ifdim\prevdepth>\zeropoint
+         -\prevdepth
+       \fi
      \fi
-   \fi
-   \advance\dimen0 .5ex
-   \vskip\dimen0
-% ==
-%    \vskip\dimexpr \strutdp + .5ex
-%       \ifdim\prevdepth>\strutdp\else\ifdim\prevdepth>\zeropoint-\prevdepth\fi\fi\relax
-%
-   \@@tlinbetween
-   \doifelsenothing{#2}
-     {\bgroup
-      \advance\hsize\dimexpr-\rightskip-\leftskip\relax
-      \nointerlineskip
-      \moveleft-\leftskip\vbox
-        {\color[\@@tlrulecolor]
-           {\hrule\!!depth\linewidth\!!height\zeropoint\!!width\hsize}}%
-      \egroup}
-     {\docomplextextrule{#2}}%
-   \ifvmode\prevdepth\zeropoint\fi
-   #1%
-   \page[\v!preference]}
-
-\def\dobottomtextrule
-  {\dodobottomtextrule\@@tlafter}
-
-\def\domiddletextrule
-  {\dodobottomtextrule\@@tlinbetween}
-
-\def\dounknowntextrule
-  {\iffirstargument
-     \@EA\dotoptextrule
-   \else
-     \@EA\dobottomtextrule\@EA\empty
+   \relax
+   \directtextrulesparameter\c!inbetween\relax
+   \doifelsenothing{#1}
+     {\nointerlineskip
+      \dontleavehmode\vbox
+        {\color[\directtextrulesparameter\c!rulecolor]
+           {\hrule\!!depth\directtextrulesparameter\c!rulethickness\!!height\zeropoint\!!width\availablehsize}}}
+     {\pack_textrule_with_text{#1}}%
+   \ifvmode
+     \prevdepth\zeropoint
    \fi}
 
 %D The grouped commands also supports bodyfont switching:
 
 \unexpanded\def\starttextrule#1%
   {\bgroup
-   \def\dounknowntextrule{\domiddletextrule}
-   \dotoptextrule{#1}
+   \def\pack_textrule_nop_indeed{\csname\??textrulealternatives\v!middle\endcsname}%
+   \csname\??textrulealternatives\v!top\endcsname{#1}%
    \bgroup
-   \doifsomething\@@tlbodyfont{\switchtobodyfont[\@@tlbodyfont]}}
+   \doifsomething{\directtextrulesparameter\c!bodyfont}{\switchtobodyfont[\directtextrulesparameter\c!bodyfont]}}
 
 \unexpanded\def\stoptextrule
   {\par
    \egroup
-   \dobottomtextrule\empty
+   \csname\??textrulealternatives\v!bottom\endcsname\empty
    \egroup}
 
 %D \macros
 %D   {fillinrules, setupfillinrules}
 %D
-%D The next few commands do not really deserve a place in a
-%D core module, because they deal with specific typography.
-%D Nevertheless I decided to make them part of the core,
-%D because they permit us to make questionaires. Let's start
-%D with some examples.
+%D The next few commands do not really deserve a place in a core module, because
+%D they deal with specific typography. Nevertheless I decided to make them part of
+%D the core, because they permit us to make questionaires. Let's start with some
+%D examples.
 %D
 %D \fillinrules[n=2,width=fit]{first}
 %D \fillinrules[n=2,width=broad]{first}
@@ -696,85 +619,112 @@
 %D \fillinrules[n=2]{first}{last}
 %D \fillintext{first}{last} \input reich \par
 %D
-%D The main command is \type{\fillinrules}. This command takes
-%D one and an optional second argument and sets a paragraph with
-%D empty visualized lines.
+%D The main command is \type{\fillinrules}. This command takes one and an optional
+%D second argument and sets a paragraph with empty visualized lines.
 %D
 %D \showsetup{fillinrules}
 %D \showsetup{setupfillinrules}
 
-\unexpanded\def\setupfillinrules
-  {\dodoubleargument\getparameters[\??il]}
 
-\definecomplexorsimpleempty\fillinrules
+\installcorenamespace{fillinrules}
+
+\installdirectcommandhandler \??fillinrules {fillinrules}
+
+\setupfillinrules
+  [\c!width=\v!broad,
+   \c!distance=\emwidth,
+   \c!before=\blank,
+   \c!after=\blank,
+   \c!n=\plusone,
+   \c!interlinespace=\v!small,
+   \c!separator=,
+   \c!style=,
+   \c!color=]
 
-\def\complexfillinrules[#1]%
-  {\def\docomplexfillinrules##1##2%
-     {\dodocomplexfillinrules[#1]{##1}{##2}{\thinrules
-        [\c!n=\@@iln,\c!interlinespace=\@@ilinterlinespace,\c!before=,\c!after=]}}%
-   \dodoublegroupempty\docomplexfillinrules}
+\unexpanded\def\fillinrules
+  {\dosingleempty\pack_fillinrules}
 
-\def\dodocomplexfillinrules[#1]#2#3#4%
+\def\pack_fillinrules[#1]%
   {\endgraf
-   \@@ilbefore
    \begingroup
-   \setupfillinrules[#1]%
+   \setupcurrentfillinrules[#1]%
+   \let\pack_fillinrules_rule\thinrules
+   \dodoublegroupempty\pack_fillinrules_indeed}
+
+\def\pack_fillinrules_indeed#1#2%
+  {\directfillinrulesparameter\c!before
+   \setupcurrentthinrules
+     [\c!n=\directfillinrulesparameter\c!n,
+      \c!interlinespace=\directfillinrulesparameter\c!interlinespace,
+      \c!before=,
+      \c!after=]%
+   \scratchdistance\directfillinrulesparameter\c!distance\relax
+   \edef\m_fillinrules_one{#1}%
+   \edef\m_fillinrules_two{#2}%
    \noindent
-   \doifsomething{#2}
-     {\doifelse\@@ilwidth\v!fit
-        {\let\@@ildistance\!!zeropoint
-         \hbox}
-        {\doifelse\@@ilwidth\v!broad
-           {\hbox}
-           {\hbox to \@@ilwidth}}%
-        \bgroup
-          \dousestyleparameter\@@ilstyle
-          \dousecolorparameter\@@ilcolor
-          \strut#2\hfill\@@ilseparator\hskip\@@ildistance
-        \egroup}%
-  %\hangindent=\wd0\relax % tzt hang=yes,n
-  %\parindent=\hangindent
-  %\box0\relax
+   \ifx\m_fillinrules_one\empty \else
+     \edef\p_width{\directfillinrulesparameter\c!width}%
+     \ifx\p_width\v!fit
+       \scratchdistance\zeropoint
+       \hbox
+     \else\ifx\p_width\v!broad
+       \hbox
+     \else
+       \hbox to \directfillinrulesparameter\c!width
+     \fi\fi
+     \bgroup
+       \usefillinrulesstyleandcolor\c!style\c!color
+       \strut
+       \m_fillinrules_one
+       \hfill\directfillinrulesparameter\c!separator
+       \hskip\scratchdistance
+     \egroup
+   \fi
    \setupwhitespace[\v!big]%
    \ignorespaces
-   #4%
-   \doifsomething{#3}
-     {\kern\@@ildistance
-      \dousestyleparameter\@@ilstyle
-      \dousecolorparameter\@@ilcolor
-      #3\strut}%
-   \endgroup
+   \pack_fillinrules_rule
+   \ifx\m_fillinrules_two\empty \else
+     \kern\scratchdistance
+     \usefillinrulesstyleandcolor\c!style\c!color
+     \m_fillinrules_two
+     \strut
+   \fi
    \endgraf
-   \@@ilafter}
+   \directfillinrulesparameter\c!after
+   \endgroup}
 
 %D \macros
 %D   {fillintext}
 %D
-%D To provide compatible layouts when texts and lines are
-%D mixed, one can typeset a paragraph by using the command
-%D \type{\fillintext}.
+%D To provide compatible layouts when texts and lines are mixed, one can typeset
+%D a paragraph by using the command \type {\fillintext}.
 %D
 %D \showsetup{fillintext}
 
-\definecomplexorsimpleempty\fillintext
+\unexpanded\def\fillintext
+  {\dosingleempty\pack_fillintext}
+
+\def\pack_fillintext[#1]% ugly
+  {\endgraf
+   \begingroup
+   \setupcurrentfillinrules[#1]%
+   \dodoublegroupempty\pack_fillintext_indeed}
 
-\def\complexfillintext[#1]% rather rough, using an \unhbox is suboptimal
-  {\def\docomplexfillintext##1##2%
-     {\dowithnextbox
-        {\dodocomplexfillinrules[#1]{##1}{\hfill##2}{\unhbox\nextbox\unskip}}%
-      \hbox\bgroup\let\par\egroup\ignorespaces}%
-   \dodoublegroupempty\docomplexfillintext}
+\def\pack_fillintext_indeed#1#2%
+  {\def\pack_fillinrules_rule{\unhbox\nextbox\unskip}%
+   \dowithnextbox{\pack_fillinrules_indeed{#1}{\hfill#2}}%
+   \hbox\bgroup\let\par\egroup\ignorespaces}
 
 %D \macros
 %D   {fillinline, setupfillinlines}
 %D
-%D Another member of the family takes care of putting a (often
-%D small) rule after a piece of text, like
+%D Another member of the family takes care of putting a (often small) rule after
+%D a piece of text, like
 %D
 %D \startbuffer
-%D \fillinline \input reich \par
+%D
+%D \stopbuffer\fillinline \input reich \par
 %D \fillinline[margin=0cm] \input reich \par
-%D \stopbuffer
 %D
 %D \startexample
 %D \getbuffer
@@ -789,82 +739,71 @@
 %D \showsetup{fillinline}
 %D \showsetup{setupfillinlines}
 
-\unexpanded\def\setupfillinlines
-  {\dodoubleargument\getparameters[\??iv]}
+\installcorenamespace{fillinlines}
 
-\definecomplexorsimpleempty\fillinline
+\installdirectcommandhandler \??fillinlines {fillinlines}
 
-\def\complexfillinline[#1]%
-  {%\endgraf % interferes with \definedescription cum suis
-   \@@ivbefore
-   \begingroup
-   \setupfillinlines[#1]%
-   \advance\rightskip \@@ivmargin
-   \parfillskip\zeropoint
-   \def\par % very dangerous
-     {\let\par\endgraf % -)
-      \ifhmode\unskip\hfill\fi
-      \scratchdimen\dimexpr\@@ivwidth-\@@ivdistance\relax
-      \ifdim\scratchdimen>\@@ivmargin\else\expandafter\rlap\fi
-        {\kern\@@ivdistance
-         \vrule
-           \!!width   \scratchdimen
-           \!!height.5\linewidth
-           \!!depth .5\linewidth}%
-      \endgraf % !
-      \endgroup
-      \endgraf % !
-      \@@ilafter}}
-
-%D Will move up:
-
-% \setupmarginrules
-%   [\c!level=0,
-%    \c!rulethickness=\@@kadefaultwidth\linewidth]
-
-\setupthinrules
-  [\c!interlinespace=\v!small,
-   \c!n=3,
-   \c!before=,
-   \c!inbetween={\blank[\v!white]},
-   \c!after=,
+\setupfillinlines
+  [\c!width=8\emwidth, % was 3cm
+   \c!margin=\directfillinlinesparameter\c!width,
+   \c!rulethickness=\linewidth,
    \c!color=,
-   \c!height=.5\linewidth,
-   \c!depth=.5\linewidth,
-   \c!frame=\v!on, % compatible with textbackgrounds
-   \c!alternative=\v!b,
-   \c!backgroundcolor=,
-   \c!background=,
-   \c!rulethickness=]
-
-\setuptextrules
-  [\c!location=\v!left,
+   \c!distance=\emwidth,
    \c!before=\blank,
-   \c!after=\blank,
-   \c!inbetween=,
-   \c!width=2em,
-   \c!style=\v!bold,
-   \c!color=,
-   \c!rulecolor=,
-   \c!bodyfont=,
-   \c!distance=.5em]
+   \c!after=\blank]
 
-\setupfillinrules
-  [\c!width=\v!broad,
-   \c!distance=1em,
-   \c!before=\blank,
-   \c!after=\blank,
-   \c!n=1,
-   \c!interlinespace=\v!small,
-   \c!separator=,
-   \c!style=\v!normal,
-   \c!color=]
+\unexpanded\def\fillinline
+  {\dosingleempty\pack_fillinline}
+
+\ifdefined\endpar % experiment with \endpar
+
+    \def\pack_fillinline[#1]%
+      {% \endpar % no, as it interferes with \definedescription cum suis
+       \begingroup
+       \setupcurrentfillinlines[#1]%
+       \directfillinlinesparameter\c!before
+       \begingroup
+       \advance\rightskip \directfillinlinesparameter\c!margin\relax
+       \parfillskip\zeropoint
+       \pushmacro\endpar
+       \def\endpar
+         {\popmacro\endpar
+          \ifhmode\unskip\hfill\fi
+          \scratchwidth\dimexpr\directfillinlinesparameter\c!width-\directfillinlinesparameter\c!distance\relax
+          \ifdim\scratchwidth>\directfillinlinesparameter\c!margin\else\expandafter\rlap\fi
+            {\kern\directfillinlinesparameter\c!distance
+             \scratchheight\dimexpr\directfillinlinesparameter\c!rulethickness/\plustwo\relax
+             \color[\directfillinlinesparameter\c!color]{\vrule\!!width\scratchwidth\!!height\scratchheight\!!depth\scratchheight}}%
+          \endpar
+          \endgroup
+          \endpar
+          \directfillinlinesparameter\c!after
+          \endgroup}} % carryover ?
+
+\else
+
+    \def\pack_fillinline[#1]%
+      {%\endgraf % no, as it interferes with \definedescription cum suis
+       \begingroup
+       \setupcurrentfillinlines[#1]%
+       \directfillinlinesparameter\c!before
+       \begingroup
+       \advance\rightskip \directfillinlinesparameter\c!margin\relax
+       \parfillskip\zeropoint
+       \def\par
+         {\let\par\endgraf
+          \ifhmode\unskip\hfill\fi
+          \scratchwidth\dimexpr\directfillinlinesparameter\c!width-\directfillinlinesparameter\c!distance\relax
+          \ifdim\scratchwidth>\directfillinlinesparameter\c!margin\else\expandafter\rlap\fi
+            {\kern\directfillinlinesparameter\c!distance
+             \scratchheight\dimexpr\directfillinlinesparameter\c!rulethickness/\plustwo\relax
+             \color[\directfillinlinesparameter\c!color]{\vrule\!!width\scratchwidth\!!height\scratchheight\!!depth\scratchheight}}%
+          \endgraf
+          \endgroup
+          \endgraf
+          \directfillinlinesparameter\c!after
+          \endgroup}} % carryover ?
 
-\setupfillinlines
-  [\c!width=3cm,
-   \c!margin=\@@ivwidth,
-   \c!distance=1em,
-   \c!before=\blank,
-   \c!after=\blank]
+\fi
 
 \protect \endinput
diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv
index 16b4460e9..e0be2db13 100644
--- a/tex/context/base/pack-rul.mkiv
+++ b/tex/context/base/pack-rul.mkiv
@@ -54,8 +54,16 @@
 %D
 %D \showsetup{setupscreens}
 
-\unexpanded\def\setupscreens
-  {\dodoubleargument\getparameters[\??rs]}
+\installcorenamespace{screens}
+
+\installsetuponlycommandhandler \??screens {screens}
+
+\appendtoks
+    \edef\defaultbackgroundscreen{\directscreensparameter\c!screen}
+\to \everysetupscreens
+
+\setupscreens
+  [\c!screen=0.90] % was 0.95 but that's hardly visible
 
 %D The parameter handler:
 
@@ -2492,7 +2500,7 @@
   %\c!foregroundstyle=,
   %\c!background=,
   %\c!backgroundcolor=,
-   \c!backgroundscreen=\@@rsscreen,
+   \c!backgroundscreen=\defaultbackgroundscreen,
    \c!linecorrection=\v!on,
    \c!depthcorrection=\v!on,
    \c!margin=\v!standard]
@@ -2861,7 +2869,7 @@
   %\c!foregroundcolor=,
   %\c!foregroundstyle=,
   %\c!background=,
-   \c!backgroundscreen=\@@rsscreen,
+   \c!backgroundscreen=\defaultbackgroundscreen,
   %\c!backgroundcolor=,
    \c!backgroundoffset=\zeropoint,
   %\c!framecolor=,
@@ -2890,7 +2898,4 @@
    %\c!toffset=\zeropoint,
    ]%\c!boffset=\zeropoint]
 
-\setupscreens
-  [\c!screen=0.95]
-
 \protect \endinput
diff --git a/tex/context/base/page-bck.mkiv b/tex/context/base/page-bck.mkiv
index 100c186dd..4fbbba9f4 100644
--- a/tex/context/base/page-bck.mkiv
+++ b/tex/context/base/page-bck.mkiv
@@ -42,6 +42,12 @@
     \fi
 \to \everybeforepagebody
 
+\unexpanded\def\initializepagebackgrounds
+  {\setfalse\c_page_backgrounds_new
+   \setfalse\c_page_backgrounds_new_right
+   \setfalse\c_page_backgrounds_new_left
+   \setfalse\c_page_backgrounds_some}
+
 %D We keep calculations and checks to a minimum and also
 %D try to minimize the amount of tracing due to expansion.
 
@@ -122,22 +128,27 @@
      \page_backgrounds_set_nop
    \fi}
 
-\def\page_backgrounds_check#1%
-  {\edef\currentotrbackground{\??ma#1}%
+%D We don't use the commandhandler code as we want these multitude of backgrounds to be
+%D as fast as possible.
+
+\installcorenamespace{layoutbackgrounds}
+
+\unexpanded\def\page_backgrounds_check#1%
+  {\edef\currentotrbackground{\??layoutbackgrounds#1}%
    \page_backgrounds_check_background}
 
 \def\ifsomebackgroundfound#1%
-  {\ifcsname\??ma#1\endcsname}
+  {\ifcsname\??layoutbackgrounds#1\endcsname}
 
 \def\doifsomebackgroundelse#1%
-  {\ifcsname\??ma#1\endcsname
+  {\ifcsname\??layoutbackgrounds#1\endcsname
      \expandafter\firstoftwoarguments
    \else
      \expandafter\secondoftwoarguments
    \fi}
 
 \def\doifsomebackground#1%
-  {\ifcsname\??ma#1\endcsname
+  {\ifcsname\??layoutbackgrounds#1\endcsname
      \expandafter\firstofoneargument
    \else
      \expandafter\gobbleoneargument
@@ -148,7 +159,7 @@
 %D features can be used.
 
 \def\page_backgrounds_add_to_box#1% area
-  {\ifcsname\??ma#1\endcsname
+  {\ifcsname\??layoutbackgrounds#1\endcsname
      \expandafter\page_backgrounds_add_to_box_indeed
    \else
      \expandafter\gobblefourarguments
@@ -158,11 +169,11 @@
 % need a real framed or can we use a fake (i.e. no foreground, only for hidden)
 
 \def\page_backgrounds_add_to_box_indeed#1#2#3#4% area box width height / always non zero
-  {\ifcsname\??ma#1\c!setups\endcsname % to be done
-     \doprocesslocalsetups{\csname\??ma#1\c!setups\endcsname}% should not produce funny spaces !
+  {\ifcsname\??layoutbackgrounds#1\c!setups\endcsname % to be done
+     \doprocesslocalsetups{\csname\??layoutbackgrounds#1\c!setups\endcsname}% should not produce funny spaces !
    \fi
    % #2 has the right dimensions already
-   \setbox#2\hbox{\localbackgroundframed{\??ma#1}#1#2}}% a real framed (including foreground)
+   \setbox#2\hbox{\localbackgroundframed{\??layoutbackgrounds#1}#1#2}}% a real framed (including foreground)
 
 %D There are quite some backgrounds. At the bottom layer,
 %D there is the {\em paper} background. This one is only
@@ -230,7 +241,7 @@
      \page_backgrounds_set_boxes_a
      \page_backgrounds_set_boxes_b
      \page_backgrounds_set_boxes_c
-   \ifx\@@mastate\v!repeat\else
+   \ifx\p_page_backgrounds_state\v!repeat\else
      \global\setfalse\c_page_backgrounds_new
    \fi}
 
@@ -284,9 +295,9 @@
    \fi \fi}
 
 \def\page_backgrounds_set_offsets_indeed
-  {\ifcsname\??ma\v!text\v!text\endcsname
+  {\ifcsname\??layoutbackgrounds\v!text\v!text\endcsname
      \page_backgrounds_set_offsets_yes
-   \else\ifcsname\??ma\v!text\endcsname
+   \else\ifcsname\??layoutbackgrounds\v!text\endcsname
      \page_backgrounds_set_offsets_yes
    \else
      \page_backgrounds_set_offsets_nop
@@ -299,26 +310,26 @@
    \global\pagebackgroundcompensation\zeropoint}
 
 \def\page_backgrounds_set_offsets_yes
-  {\global\pagebackgroundcompensation\csname\??ma\v!page\c!offset\endcsname\relax
+  {\global\pagebackgroundcompensation\csname\??layoutbackgrounds\v!page\c!offset\endcsname\relax
    \ifzeropt\pagebackgroundcompensation
      \page_backgrounds_set_offsets_nop
    \else
-     \ifcsname\??ma\v!top\v!text\endcsname
+     \ifcsname\??layoutbackgrounds\v!top\v!text\endcsname
        \global\pagebackgroundhoffset\zeropoint
-     \else\ifcsname\??ma\v!bottom\v!text\endcsname
+     \else\ifcsname\??layoutbackgrounds\v!bottom\v!text\endcsname
        \global\pagebackgroundhoffset\zeropoint
      \else
        \global\pagebackgroundhoffset\pagebackgroundcompensation
      \fi\fi
-     \ifcsname\??ma\v!text\v!rightedge\endcsname
+     \ifcsname\??layoutbackgrounds\v!text\v!rightedge\endcsname
        \global\pagebackgroundvoffset\zeropoint
        \global\pagebackgrounddepth  \zeropoint
-     \else\ifcsname\??ma\v!text\v!leftedge\endcsname
+     \else\ifcsname\??layoutbackgrounds\v!text\v!leftedge\endcsname
        \global\pagebackgroundvoffset\zeropoint
        \global\pagebackgrounddepth  \zeropoint
      \else
        \global\pagebackgroundvoffset\pagebackgroundcompensation
-       \global\pagebackgrounddepth  \csname\??ma\v!page\c!depth\endcsname\relax
+       \global\pagebackgrounddepth  \csname\??layoutbackgrounds\v!page\c!depth\endcsname\relax
      \fi\fi
    \fi}
 
@@ -370,7 +381,7 @@
      \bgroup\hbox\bgroup
        \goleftonpage
        \ifdim\leftedgewidth>\zeropoint
-         \ifcsname\??ma#1\v!leftedge\endcsname
+         \ifcsname\??layoutbackgrounds#1\v!leftedge\endcsname
            \page_backgrounds_set_box_cell#1\v!leftedge\leftedgewidth#2%
          \else
            \kern\leftedgewidth
@@ -378,21 +389,21 @@
          \kern\leftedgedistance
        \fi
        \ifdim\leftmarginwidth>\zeropoint
-         \ifcsname\??ma#1\v!leftmargin\endcsname
+         \ifcsname\??layoutbackgrounds#1\v!leftmargin\endcsname
            \page_backgrounds_set_box_cell#1\v!leftmargin\leftmarginwidth#2%
          \else
            \kern\leftmarginwidth
          \fi
          \kern\leftmargindistance
        \fi
-       \ifcsname\??ma#1\v!text\endcsname
+       \ifcsname\??layoutbackgrounds#1\v!text\endcsname
          \page_backgrounds_set_box_cell#1\v!text\makeupwidth#2%
        \else
          \kern\makeupwidth
        \fi
        \ifdim\rightmarginwidth>\zeropoint
          \kern\rightmargindistance
-         \ifcsname\??ma#1\v!rightmargin\endcsname
+         \ifcsname\??layoutbackgrounds#1\v!rightmargin\endcsname
            \page_backgrounds_set_box_cell#1\v!rightmargin\rightmarginwidth#2%
          \else
            \kern\rightmarginwidth
@@ -400,7 +411,7 @@
        \fi
        \ifdim\rightedgewidth>\zeropoint
          \kern\rightedgedistance
-         \ifcsname\??ma#1\v!rightedge\endcsname
+         \ifcsname\??layoutbackgrounds#1\v!rightedge\endcsname
            \page_backgrounds_set_box_cell#1\v!rightedge\rightedgewidth#2%
          \else
            \kern\rightedgewidth
@@ -415,15 +426,15 @@
 
 \def\page_backgrounds_set_box_cell#1#2#3#4% pos pos width height
   {\begingroup
-   \ifcsname\??ma#1#2\c!setups\endcsname
-     \doprocesslocalsetups{\csname\??ma#1#2\c!setups\endcsname}% should not produce funny spaces !
+   \ifcsname\??layoutbackgrounds#1#2\c!setups\endcsname
+     \expandafter\doprocesslocalsetups\csname\??layoutbackgrounds#1#2\c!setups\endcsname % should not produce funny spaces !
    \fi
-   \ifcsname\??ma#1#2\c!command\endcsname
+   \ifcsname\??layoutbackgrounds#1#2\c!command\endcsname
      \expandafter\page_backgrounds_set_box_cell_nop
    \else
      \expandafter\page_backgrounds_set_box_cell_yes
    \fi#1#2#3#4%
-   \localbackgroundframed{\??ma#1#2}{#1:#2}\scratchbox
+   \localbackgroundframed{\??layoutbackgrounds#1#2}{#1:#2}\scratchbox
    \endgroup}
 
 \def\page_backgrounds_set_box_cell_nop#1#2#3#4%
@@ -432,7 +443,7 @@
    \ht\scratchbox#4}
 
 \def\page_backgrounds_set_box_cell_yes#1#2#3#4%
-  {\setbox\scratchbox\vbox to #4{\vss\hbox to#3{\hss\csname\??ma#1#2\c!command\endcsname\hss}\vss}%
+  {\setbox\scratchbox\vbox to #4{\vss\hbox to#3{\hss\csname\??layoutbackgrounds#1#2\c!command\endcsname\hss}\vss}%
    \dp\scratchbox\zeropoint}
 
 %D The background mechanism is quite demanding in terms or
@@ -456,53 +467,58 @@
 \unexpanded\def\setupbackgrounds
   {\dotripleempty\page_backgrounds_setup}
 
-\def\page_backgrounds_setup[#1][#2][#3]%
+\def\page_backgrounds_setup
   {\ifthirdargument
-     \page_backgrounds_setup_double{#1}{#2}{#3}%
+     \expandafter\page_backgrounds_setup_double
    \else\ifsecondargument
-     \page_backgrounds_setup_single{#1}{#2}%
+     \doubleexpandafter\page_backgrounds_setup_single
    \else\iffirstargument
-     \page_backgrounds_setup_basics{#1}%
-   \fi\fi\fi
-   \the\everybackgroundssetup}
+     \tripleexpandafter\page_backgrounds_setup_basics
+   \fi\fi\fi}
 
 \appendtoks
-   \doifelsevalue{\??ma\v!page\c!offset}\v!overlay
+   \doifelsevalue{\??layoutbackgrounds\v!page\c!offset}\v!overlay
      {\global\pageoffset\zeropoint}
-     {\global\pageoffset\csname\??ma\v!page\c!offset\endcsname}%
-   \global\pagedepth\csname\??ma\v!page\c!depth\endcsname
+     {\global\pageoffset\csname\??layoutbackgrounds\v!page\c!offset\endcsname}%
+   \global\pagedepth\csname\??layoutbackgrounds\v!page\c!depth\endcsname
    \global\pagebackgroundoffset\pageoffset
    \global\pagebackgrounddepth\pagedepth
-   \doifelse\@@mastate\v!stop
-     {\global\setfalse\c_page_backgrounds_new}
-     {\global\settrue \c_page_backgrounds_new}%
+   \edef\p_page_backgrounds_state{\csname\??layoutbackgrounds\c!state\endcsname}%
+   \ifx\p_page_backgrounds_state\v!stop
+     \global\setfalse\c_page_backgrounds_new
+   \else
+     \global\settrue \c_page_backgrounds_new
+   \fi
 \to \everybackgroundssetup
 
 \def\v_page_backgrounds_double_set{\v!paper,\v!page,\v!leftpage,\v!rightpage}
 \def\v_page_backgrounds_single_set{\v!text,\v!hidden,\v!paper,\v!page,\v!leftpage,\v!rightpage}
 \def\v_page_backgrounds_common_set{\v!leftedge,\v!leftmargin,\v!text,\v!rightmargin,\v!rightedge}
 
-\def\page_backgrounds_setup_double#1#2#3%
+\def\page_backgrounds_setup_double[#1][#2][#3]% if needed we can speed this up
   {\global\settrue\c_page_backgrounds_some
-   \def\docommand##1%
+   \def\page_backgrounds_setup_step##1%
      {\doifinsetelse{##1}\v_page_backgrounds_double_set
         {\page_backgrounds_setup_and_check{##1}{#3}}
-        {\def\dodocommand####1{\page_backgrounds_setup_and_check{##1####1}{#3}}%
-         \processcommalist[#2]\dodocommand}}%
-   \processcommalist[#1]\docommand}
+        {\def\page_backgrounds_setup_step_nested####1{\page_backgrounds_setup_and_check{##1####1}{#3}}%
+         \processcommalist[#2]\page_backgrounds_setup_step_nested}}%
+   \processcommalist[#1]\page_backgrounds_setup_step
+   \the\everybackgroundssetup}
 
-\def\page_backgrounds_setup_single#1#2%
+\def\page_backgrounds_setup_single[#1][#2][#3]%
   {\global\settrue\c_page_backgrounds_some
    \doifcommonelse{#1}\v_page_backgrounds_single_set
-     {\def\docommand##1{\page_backgrounds_setup_and_check{##1}{#2}}%
-      \processcommalist[#1]\docommand}%
-     {\page_backgrounds_setup_double{#1}\v_page_backgrounds_common_set{#2}}}
+     {\def\page_backgrounds_setup_step##1{\page_backgrounds_setup_and_check{##1}{#2}}%
+      \processcommalist[#1]\page_backgrounds_setup_step
+      \the\everybackgroundssetup}%
+     {\page_backgrounds_setup_double[#1][\v_page_backgrounds_common_set][#2]}}
 
-\def\page_backgrounds_setup_basics#1%
-  {\getparameters[\??ma][#1]}
+\def\page_backgrounds_setup_basics[#1][#2][#3]%
+  {\getparameters[\??layoutbackgrounds][#1]%
+   \the\everybackgroundssetup}
 
 \def\page_backgrounds_setup_and_check#1#2% tag settings
-  {\edef\currentotrbackground{\??ma#1}%
+  {\edef\currentotrbackground{\??layoutbackgrounds#1}%
    \getparameters[\currentotrbackground][#2]%
    \page_backgrounds_check_background}
 
@@ -511,7 +527,7 @@
 
 % hm, we can delay them
 
-\unexpanded\def\installsomebackground#1#2{\inheritlocalframed[\??ma#1#2][\??od]}
+\unexpanded\def\installsomebackground#1#2{\inheritlocalframed[\??layoutbackgrounds#1#2][\??od]}
 
 \installsomebackground \v!paper     \empty
 \installsomebackground \v!page      \empty
@@ -551,7 +567,7 @@
 \installsomebackground \v!rightpage \empty
 
 \getparameters
-  [\??ma\v!page]
+  [\??layoutbackgrounds\v!page]
   [\c!offset=\zeropoint, % hm, so we need to force overlay elsewhere
    \c!depth=\zeropoint]
 
@@ -567,12 +583,12 @@
 % todo page-2   .. page+2   achter pagina -> bleed
 %      spread-2 .. spread+2 achter spread -> spread (repeat 2 times)
 
-\def\enablehiddenbackground
+\unexpanded\def\enablehiddenbackground
   {\global\settrue\c_page_backgrounds_hidden_enabled
    \global\settrue\c_page_backgrounds_some
    \page_backgrounds_recalculate}
 
-\def\disablehiddenbackground
+\unexpanded\def\disablehiddenbackground
   {\global\setfalse\c_page_backgrounds_hidden_enabled}
 
 \def\hiddenbackgroundlist
@@ -598,7 +614,7 @@
 % \installsomebackground \v!local \empty % not really a background, invisible for users
 %
 % \getparameters
-%   [\??ma\v!local]
+%   [\??layoutbackgrounds\v!local]
 %   [\c!component=local,
 %    \c!background=\localbackgroundlist]
 %
@@ -618,7 +634,7 @@
 %    \fi}
 %
 % \def\page_backgrounds_add_local_to_box_indeed#1%
-%   {\setbox#1\hbox{\localbackgroundframed{\??ma\v!local}\v!local#1}%
+%   {\setbox#1\hbox{\localbackgroundframed{\??layoutbackgrounds\v!local}\v!local#1}%
 %    \global\advance\localpositionnumber\plusone} % afterwards !
 %
 % \let\page_backgrounds_add_local_to_box\gobbleoneargument
diff --git a/tex/context/base/page-col.mkiv b/tex/context/base/page-col.mkiv
index 87591e336..3143cadd2 100644
--- a/tex/context/base/page-col.mkiv
+++ b/tex/context/base/page-col.mkiv
@@ -13,22 +13,23 @@
 
 \writestatus{loading}{ConTeXt Page Macros / Column Helpers}
 
-%D Here we implement a couple of helpers for dealing with
-%D columns. For the moment we keep the names.
+%D Here we implement a couple of helpers for dealing with columns. For
+%D the moment we keep the names. When the mul and set modules are redone
+%D these can be adapted or disappear.
 
 \unprotect
 
-%D The next two registers can be used to store pre column
-%D material as well as footnotes or so.
+%D The next two registers can be used to store pre column material as well
+%D as footnotes or so.
 
 \newbox\precolumnbox   \newdimen\precolumnboxheight
 \newbox\postcolumnbox  \newdimen\postcolumnboxheight
 
-%D We reserve a counter for the number of columns as well as
-%D the current column. Both are not to be changed by users!
+%D We reserve a counter for the number of columns as well as the current
+%D column. Both are not to be changed by users!
 
-\newcount\nofcolumns \nofcolumns = 1
-\newcount\mofcolumns \mofcolumns = 1
+\newcount\nofcolumns \nofcolumns\plusone
+\newcount\mofcolumns \mofcolumns\plusone
 
 \setnewconstant\maxnofcolumns       50
 \setnewconstant\allocatednofcolumns  0
@@ -38,14 +39,13 @@
 \newdimen\finalcolumnheights
 \newcount\finalcolumnlines
 
-%D This register can be used as a temporary storage for page
-%D content.
+%D This register can be used as a temporary storage for page content.
 
 \newbox\restofpage
 
 %D A few more (some might go away):
 
-\newif\ifintermediatefootnotes
+\newif\ifintermediatefootnotes % seems to be obsolete
 \newif\ifcarryoverfootnotes  %\carryoverfootnotestrue
 \newif\iflastcolumnfootnotes %\lastcolumnfootnotestrue
 \newif\ifbalancecolumns      %\balancecolumnstrue
@@ -70,7 +70,6 @@
 
 \newif\ifrecentercolumnbox    \recentercolumnboxtrue
 \newif\ifrerecentercolumnbox  \rerecentercolumnboxtrue
-\newif\ifpackcolumnfloats     \packcolumnfloatstrue
 
 %D During initialization the temporary boxes are allocated.
 %D This enables us to use as much columns as we want, without
@@ -80,7 +79,12 @@
 %D Two sets of boxes are declared, the txtboxes are used for
 %D the text, the topboxes are for moved column floats.
 
-\def\initializecolumns#1%
+\installcorenamespace{columntext}
+\installcorenamespace{columnfooter}
+\installcorenamespace{columntop}
+\installcorenamespace{columnbottom}
+
+\unexpanded\def\initializecolumns#1%
   {\ifnum#1>\maxnofcolumns
      \showmessage\m!columns1\maxnofcolumns
      \nofcolumns\maxnofcolumns
@@ -90,11 +94,10 @@
    \ifnum\nofcolumns>\allocatednofcolumns
      \dorecurse\nofcolumns
        {\ifnum\recurselevel>\allocatednofcolumns\relax
-          % \newbox\next \letgvalue{\??zc-\recurselevel-t}=\next
-          \expandafter\newbox\csname\??zc-\recurselevel-t\endcsname % text
-          \expandafter\newbox\csname\??zc-\recurselevel-f\endcsname % foot
-          \expandafter\newbox\csname\??zc-\recurselevel-h\endcsname % top insert
-          \expandafter\newbox\csname\??zc-\recurselevel-l\endcsname % top insert
+          \expandafter\newbox\csname\??columntext  \recurselevel\endcsname % text
+          \expandafter\newbox\csname\??columnfooter\recurselevel\endcsname % footer
+          \expandafter\newbox\csname\??columntop   \recurselevel\endcsname % top insert
+          \expandafter\newbox\csname\??columnbottom\recurselevel\endcsname % bottom insert
         \fi}%
      \global\allocatednofcolumns\nofcolumns
    \fi}
@@ -107,10 +110,10 @@
 \def\currenttopcolumnbox {\columntopbox \mofcolumns}
 \def\lasttopcolumnbox    {\columntopbox \nofcolumns}
 
-\def\columntextbox     #1{\csname\??zc-\number#1-t\endcsname}
-\def\columnfootbox     #1{\csname\??zc-\number#1-f\endcsname}
-\def\columntopbox      #1{\csname\??zc-\number#1-h\endcsname}
-\def\columnbotbox      #1{\csname\??zc-\number#1-l\endcsname}
+\def\columntextbox     #1{\csname\??columntext  \number#1\endcsname}
+\def\columnfootbox     #1{\csname\??columnfooter\number#1\endcsname}
+\def\columntopbox      #1{\csname\??columntop   \number#1\endcsname}
+\def\columnbotbox      #1{\csname\??columnbottom\number#1\endcsname}
 
 \def\columnsettextbox    {\global\setbox\columntextbox}
 \def\columnsetfootbox    {\global\setbox\columnfootbox}
@@ -122,30 +125,30 @@
 \def\columngettopbox     {\copy\columntopbox}
 \def\columngetbotbox     {\copy\columnbotbox}
 
-\def\columnerasetextboxes{\dorecurse\allocatednofcolumns{\columnsettextbox\recurselevel\emptybox}}
-\def\columnerasefootboxes{\dorecurse\allocatednofcolumns{\columnsetfootbox\recurselevel\emptybox}}
-\def\columnerasetopboxes {\dorecurse\allocatednofcolumns{\columnsettopbox \recurselevel\emptybox}}
-\def\columnerasebotboxes {\dorecurse\allocatednofcolumns{\columnsetbotbox \recurselevel\emptybox}}
+\unexpanded\def\columnerasetextboxes{\dorecurse\allocatednofcolumns{\columnsettextbox\recurselevel\emptybox}}
+\unexpanded\def\columnerasefootboxes{\dorecurse\allocatednofcolumns{\columnsetfootbox\recurselevel\emptybox}}
+\unexpanded\def\columnerasetopboxes {\dorecurse\allocatednofcolumns{\columnsettopbox \recurselevel\emptybox}}
+\unexpanded\def\columnerasebotboxes {\dorecurse\allocatednofcolumns{\columnsetbotbox \recurselevel\emptybox}}
+
+%D Without going in details we present two macro's which handle the columns. The
+%D action which is transfered by the the first and only parameter can do something
+%D with \type {\currentcolumnbox}. In case of the mid columns, \type
+%D {\firstcolumnbox} and \type {\lastcolumnbox} are handled outside these macro's.
 
-%D Without going in details we present two macro's which handle
-%D the columns. The action which is transfered by the the first
-%D and only parameter can do something with \type
-%D {\currentcolumnbox}. In case of the mid columns, \type
-%D {\firstcolumnbox} and \type {\lastcolumnbox} are handled
-%D outside these macro's.
+%D If needed these can be sped up by using a dedicated loop macro.
 
-\def\dohandlecolumn#1%
+\unexpanded\def\dohandlecolumn#1%
   {\mofcolumns\recurselevel
    \let\currentcolumn\recurselevel
    #1\relax}
 
-\def\dohandleallcolumns#1%
+\unexpanded\def\dohandleallcolumns#1%
   {\dorecurse\nofcolumns{\dohandlecolumn{#1}}}
 
-\def\dohandlerevcolumns#1%
+\unexpanded\def\dohandlerevcolumns#1%
   {\dostepwiserecurse\nofcolumns\plusone\minusone{\dohandlecolumn{#1}}}
 
-\def\dohandlemidcolumns#1%
+\unexpanded\def\dohandlemidcolumns#1%
   {\dohandleallcolumns
      {\ifnum\recurselevel>\plusone
         \ifnum\recurselevel<\nofcolumns
diff --git a/tex/context/base/page-com.mkiv b/tex/context/base/page-com.mkiv
index 80012dd14..61cb49e89 100644
--- a/tex/context/base/page-com.mkiv
+++ b/tex/context/base/page-com.mkiv
@@ -30,79 +30,141 @@
 %D \stoppagecomment
 %D \stoptyping
 
-\unexpanded\def\setuppagecomment
-  {\dosingleempty\dosetuppagecomment}
-
-\def\dosetuppagecomment[#1]%
-  {\getparameters[\??pc][#1]%
-   \doifelse\@@pcstate\v!start
-     {\doifinsetelse\@@pclocation{\v!bottom,\v!top}
-        {\setuppapersize[\c!left=\hskip\@@pcoffset]%
-         \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcheight}%
-         \edef\@@pcpaperwidth {\the\dimexpr\paperwidth +\@@pcoffset+\@@pcoffset}%
-         \defineoverlay[\v!pagecomment][\placepagecommentTB]}
-        {\setuppapersize[\c!top=\vskip\@@pcoffset]%
-         \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset}%
-         \edef\@@pcpaperwidth {\the\dimexpr\paperwidth +\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcwidth}%
-         \defineoverlay[\v!pagecomment][\placepagecommentLR]}%
-      \processaction
-        [\@@pclocation]
-        [ \v!bottom=>{\setuplayout[\c!location=]\setuppapersize[\c!bottom=\vss,\c!top   =\vskip\@@pcoffset]},
-             \v!top=>{\setuplayout[\c!location=]\setuppapersize[\c!top   =\vss,\c!bottom=\vskip\@@pcoffset]},
-            \v!left=>{\setuplayout[\c!location=]\setuppapersize[\c!left  =\hss,\c!right =\hskip\@@pcoffset]},
-           \v!right=>{\setuplayout[\c!location=]\setuppapersize[\c!right =\hss,\c!left  =\hskip\@@pcoffset]}]%
-      \definepapersize
-        [\v!pagecomment]
-        [\c!height=\@@pcpaperheight,
-          \c!width=\@@pcpaperwidth]%
-      \let\@@pcprintpapersize\printpapersize
-      \setuppapersize[\papersize][\v!pagecomment]%
-      \setupbackgrounds[\v!paper][\c!background=\v!pagecomment]}% todo append if already set
-    {\doif\@@pcstate\v!stop % else initialization  invokes backgrounds
-       {% this should be tested first
-        % \normalexpanded{\noexpand\setuppapersize[\papersize][\@@pcprintpapersize]}%
-        \setupbackgrounds[\v!paper][\c!background=]}}}
-
-\def\@@pcprintpapersize{\printpapersize}
-
-\unexpanded\def\placepagecommentTB
+\installcorenamespace{pagecomment}
+\installcorenamespace{pagecommentlocations}
+\installcorenamespace{pagecommentstates}
+
+\newdimen\d_page_comments_offset
+\newdimen\d_page_comments_page_width
+\newdimen\d_page_comments_page_height
+\newdimen\d_page_comments_width
+\newdimen\d_page_comments_height
+\newdimen\d_page_comments_distance
+
+\newconditional\c_page_comment_enabled
+
+\let\p_page_commands_location\v!none
+\let\p_page_commands_state   \v!stop
+
+\installsetuponlycommandhandler \??pagecomment {pagecomment}
+
+\appendtoks
+    \edef\p_page_commands_location{\directpagecommentparameter\c!location}%
+    \edef\p_page_commands_state   {\directpagecommentparameter\c!state}%
+    \expandcheckedcsname\??pagecommentstates\p_page_commands_state\v!none
+\to \everysetuppagecomment
+
+\ifdefined\scrn_canvas_synchronize_simple
+
+    \appendtoks
+        \ifx\p_page_commands_state\v!start
+            \scrn_canvas_synchronize_simple
+        \else
+            \scrn_canvas_synchronize_complex
+        \fi
+    \to \everyshipout
+
+\fi
+
+\setvalue{\??pagecommentstates\v!start}%
+  {\d_page_comments_offset  \directpagecommentparameter\c!offset  \relax
+   \d_page_comments_distance\directpagecommentparameter\c!distance\relax
+   \d_page_comments_width   \directpagecommentparameter\c!width   \relax
+   \d_page_comments_height  \directpagecommentparameter\c!height  \relax
+   \expandcheckedcsname\??pagecommentlocations\p_page_commands_location\v!none
+   \definepapersize[\v!pagecomment][\c!height=\d_page_comments_page_height,\c!width=\d_page_comments_page_width]%
+   \setuppapersize[\papersize][\v!pagecomment]%
+   \setupbackgrounds[\v!paper][\c!background=\v!pagecomment]} % maybe append if already set
+
+\setvalue{\??pagecommentstates\v!stop}%
+  {\setupbackgrounds[\v!paper][\c!background=]}
+
+\setvalue{\??pagecommentstates\v!none}%
+  {}
+
+\setvalue{\??pagecommentlocations\v!bottom}%
+  {\setuplayout[\c!location=]%
+   \setuppapersize[\c!top=\vskip\d_page_comments_offset,\c!bottom=\vss,\c!left=\hskip\d_page_comments_offset,\c!right=]%
+   \d_page_comments_page_height\dimexpr\paperheight+2\d_page_comments_offset+\d_page_comments_distance+\d_page_comments_height\relax
+   \d_page_comments_page_width \dimexpr\paperwidth +2\d_page_comments_offset\relax
+   \defineoverlay[\v!pagecomment][\page_comments_top_bottom]}
+
+\setvalue{\??pagecommentlocations\v!top}%
+  {\setuplayout[\c!location=]%
+   \setuppapersize[\c!top=\vss,\c!bottom=\vskip\d_page_comments_offset,\c!left=\hskip\d_page_comments_offset,\c!right=]%
+   \d_page_comments_page_height\dimexpr\paperheight+2\d_page_comments_offset+\d_page_comments_distance+\d_page_comments_height\relax
+   \d_page_comments_page_width \dimexpr\paperwidth +2\d_page_comments_offset\relax
+   \defineoverlay[\v!pagecomment][\page_comments_top_bottom]}
+
+\setvalue{\??pagecommentlocations\v!left}%
+  {\setuplayout[\c!location=]%
+   \setuppapersize[\c!top=\vskip\d_page_comments_offset,\c!bottom=,\c!left=\hss,\c!right=\hskip\d_page_comments_offset]%
+   \d_page_comments_page_height\dimexpr\paperheight+2\d_page_comments_offset\relax
+   \d_page_comments_page_width \dimexpr\paperwidth +2\d_page_comments_offset+\d_page_comments_distance+\d_page_comments_width\relax
+   \defineoverlay[\v!pagecomment][\page_comments_left_right]}
+
+\setvalue{\??pagecommentlocations\v!right}%
+  {\setuplayout[\c!location=]%
+   \setuppapersize[\c!top=\vskip\d_page_comments_offset,\c!bottom=,\c!left=\hskip\d_page_comments_offset,\c!right =\hss]%
+   \d_page_comments_page_height\dimexpr\paperheight+2\d_page_comments_offset\relax
+   \d_page_comments_page_width \dimexpr\paperwidth +2\d_page_comments_offset+\d_page_comments_distance+\d_page_comments_width\relax
+   \defineoverlay[\v!pagecomment][\page_comments_left_right]}
+
+\setvalue{\??pagecommentlocations\v!none}%
+  {}% \setuppapersize[\c!bottom=,\c!top=,\c!left=,\c!right=]}
+
+\unexpanded\def\page_comments_top_bottom
   {\vbox to \printpaperheight
      {%\forgetall
-      \hsize\printpaperwidth
-      \vskip\@@pcoffset
-      \doifelse\@@pclocation\v!bottom{\vskip\dimexpr\paperheight+\@@pcdistance\relax}\vss
-      \hskip\@@pcoffset
-      \vbox to \@@pcheight
+      \hsize\printpaperwidth\relax
+      \ifx\p_page_commands_location\v!bottom
+        \vskip\dimexpr\paperheight+\d_page_comments_distance+\d_page_comments_offset\relax
+      \else
+        \vskip\d_page_comments_offset
+        \vss
+      \fi
+      \hskip\d_page_comments_offset
+      \vbox to \d_page_comments_height
         {%\forgetall
          \hsize\paperwidth
-         \ifpagecomment
+         \ifconditional\c_page_comment_enabled
            \getbuffer[\v!pagecomment]%
-           \global\pagecommentfalse
+           \global\setfalse\c_page_comment_enabled
          \fi}%
       \hfill
-      \doifelse\@@pclocation\v!bottom\vss{\vskip\dimexpr\paperheight+\@@pcdistance\relax}%
-      \vskip\@@pcoffset}}
+      \ifx\p_page_commands_location\v!bottom
+        \vss
+        \vskip\d_page_comments_offset
+      \else
+        \vskip\dimexpr\paperheight+\d_page_comments_distance+\d_page_comments_offset\relax
+      \fi}}
 
-\unexpanded\def\placepagecommentLR
+\unexpanded\def\page_comments_left_right
   {\hbox to \printpaperwidth
-     {\hskip\@@pcoffset
-      \doifelse\@@pclocation\v!right{\hskip\paperwidth\hskip\@@pcdistance}\hss
+     {\ifx\p_page_commands_location\v!right
+        \hskip\dimexpr\paperwidth+\d_page_comments_distance+\d_page_comments_offset\relax
+      \else
+        \hskip\d_page_comments_offset
+        \hss
+      \fi
       \vbox to \printpaperheight
         {%\forgetall
-         \vskip\@@pcoffset
-         \hsize\@@pcwidth
-         \ifpagecomment
+         \vskip\d_page_comments_offset
+         \hsize\d_page_comments_width
+         \ifconditional\c_page_comment_enabled
            \getbuffer[\v!pagecomment]%
-           \global\pagecommentfalse
+           \global\setfalse\c_page_comment_enabled
          \fi
          \vss}%
-      \doifelse\@@pclocation\v!right\hss{\hskip\paperwidth\hskip\@@pcdistance}%
-      \hskip\@@pcoffset}}
-
-\newif\ifpagecomment
+      \ifx\p_page_commands_location\v!right
+        \hss
+        \hskip\d_page_comments_offset
+      \else
+        \hskip\dimexpr\paperwidth+\d_page_comments_distance+\d_page_comments_offset\relax
+      \fi}}
 
 \setvalue{\e!start\v!pagecomment}%
-  {\global\pagecommenttrue
+  {\global\settrue\c_page_comment_enabled
    \grabbufferdatadirect\v!pagecomment{\e!start\v!pagecomment}{\e!stop\v!pagecomment}}
 
 \setuppagecomment
diff --git a/tex/context/base/page-fac.mkiv b/tex/context/base/page-fac.mkiv
index fef1cd5ac..88789abe9 100644
--- a/tex/context/base/page-fac.mkiv
+++ b/tex/context/base/page-fac.mkiv
@@ -25,19 +25,21 @@
 %D \stoptext
 %D \stoptyping
 
-\newbox\b_page_facings_content
+\newbox        \b_page_facings_content
+\newconditional\c_page_facings_busy
 
-\unexpanded\def\setupoppositeplacing
-  {\dodoubleargument\getparameters[\??np]}
+\installcorenamespace{oppositeplacing}
+
+\installsetuponlycommandhandler \??oppositeplacing {oppositeplacing}
 
 \unexpanded\def\startopposite
   {\dowithnextboxcontent
      {\hsize\makeupwidth}%
      {\global\setbox\b_page_facings_content\vbox
         {\ifvoid\b_page_facings_content
-           \@@npbefore
+           \directoppositeplacingparameter\c!before
          \else
-           \@@npinbetween
+           \directoppositeplacingparameter\c!inbetween
            \unvbox\b_page_facings_content
          \fi
          \box\nextbox}}%
@@ -47,26 +49,34 @@
   {\egroup}
 
 \def\page_facings_finish
-  {\ifvoid\b_page_facings_content\else
+  {\ifvoid\b_page_facings_content \else
      \global\setbox\b_page_facings_content\vbox to \makeupheight
        {\unvbox\b_page_facings_content
-        \@@npafter
+        \directoppositeplacingparameter\c!after
         \vss}%
    \fi}
 
 \def\page_facings_flush
-  {\doif\@@npstate\v!start
-     {\ifvoid\b_page_facings_content\else
-        \ifnum\realpageno>\plusone
-          \begingroup
-          \pageornamentstate\plusone % tricky
-          \page_facings_finish
-          \page_boxes_shipout{\page_boxes_constructed_page\box\b_page_facings_content}%
-          \endgroup
-        \else
-          \global\setbox\b_page_facings_content\emptybox
-        \fi
-      \fi}}
+  {\ifconditional\c_page_facings_busy
+     \ifvoid\b_page_facings_content \else
+        \page_facings_flush_indeed
+     \fi
+   \fi}
+
+\def\page_facings_flush_indeed
+  {\ifnum\realpageno>\plusone
+     \begingroup
+     \pageornamentstate\plusone % tricky
+     \page_facings_finish
+     \page_boxes_shipout{\page_boxes_constructed_page\box\b_page_facings_content}%
+     \endgroup
+   \else
+     \global\setbox\b_page_facings_content\emptybox
+   \fi}
+
+\appendtoks
+    \doifelse{\directoppositeplacingparameter\c!state}\v!start\settrue\setfalse\c_page_facings_busy
+\to \everysetupoppositeplacing
 
 \setupoppositeplacing
   [\c!state=\v!start,
diff --git a/tex/context/base/page-flt.mkiv b/tex/context/base/page-flt.mkiv
index 18c0ad263..4655d92af 100644
--- a/tex/context/base/page-flt.mkiv
+++ b/tex/context/base/page-flt.mkiv
@@ -20,31 +20,28 @@
 
 \unprotect
 
-%D To be checked and removed
-
-%def\dosavefloatinfo   {\showmessage\m!floatblocks2{\the\totalnoffloats}}
-\def\doinsertfloatinfo {\showmessage\m!floatblocks4{\the\totalnoffloats}}
-\def\dofloatflushedinfo{\showmessage\m!floatblocks3{\the\numexpr\totalnoffloats-\savednoffloats\relax}}
+%def\page_floats_report_saved  {\showmessage\m!floatblocks2{\the\totalnoffloats}}
+\def\page_floats_report_total  {\showmessage\m!floatblocks4{\the\totalnoffloats}}
+\def\page_floats_report_flushed{\showmessage\m!floatblocks3{\the\numexpr\totalnoffloats-\savednoffloats\relax}}
 
 %D Extra float registers.
 
-\newif\ifsomefloatwaiting     \somefloatwaitingfalse
-\newif\ifroomforfloat         \roomforfloattrue
-\newif\ifnofloatpermitted     \nofloatpermittedfalse
-\newif\ifcenterfloatbox       \centerfloatboxtrue
-\newif\iflocalcenterfloatbox  \localcenterfloatboxfalse
-\newif\ifglobalcenterfloatbox \globalcenterfloatboxfalse
-\newif\ifflushingfloats       \flushingfloatsfalse
-\newif\ifpackflushedfloats    \packflushedfloatstrue % for the moment
-\newif\ifpackcolumnfloats     \packcolumnfloatstrue
-
-\newcount\totalnoffloats
-\newcount\savednoffloats
-\newcount\noffloatinserts
+\newconditional\c_page_floats_room
+\newconditional\c_page_floats_some_waiting
+\newconditional\c_page_floats_not_permitted
+\newconditional\c_page_floats_flushing
+\newconditional\c_page_floats_center_box          \settrue\c_page_floats_center_box
+\newconditional\c_page_floats_center_box_local
+\newconditional\c_page_floats_center_box_global
+\newconditional\c_page_floats_pack_flushed        \settrue\c_page_floats_pack_flushed
+
+%D For the moment we keep this but they will become private too.
+
+\newcount\totalnoffloats     % these will be redone ... handled at the lua end anyway
+\newcount\savednoffloats     % these will be redone ... handled at the lua end anyway
+\newcount\noffloatinserts    % these will be redone ... handled at the lua end anyway
 \newcount\nofcollectedfloats % communication channel
 
-\newbox  \floatlist
-\newbox  \savedfloatlist
 \newbox  \floattext
 
 \newdimen\floatwidth
@@ -65,55 +62,55 @@
 
 \appendtoks
    \ifcase\savednoffloats
-     \global\somefloatwaitingfalse
+     \global\setfalse\c_page_floats_some_waiting
    \else
-     \global\somefloatwaitingtrue
+     \global\settrue\c_page_floats_some_waiting
    \fi
 \to \everyfloatscheck
 
-\def\dofloatsflush#1#2%
+\unexpanded\def\page_floats_flush#1#2%
   {\ctxcommand{flushfloat("#1",\number#2)}%
    \the\everyfloatscheck}
 
-\def\dofloatsflushbylabel#1#2%
+\unexpanded\def\page_floats_flush_by_label#1#2%
   {\ctxcommand{flushfloat("#1","#2",true)}%
    \the\everyfloatscheck}
 
-\def\dofloatssave#1%
+\unexpanded\def\page_floats_save#1%
   {\ctxcommand{savefloat("#1")}%
    \the\everyfloatscheck}
 
-\def\dofloatsresave#1%
+\unexpanded\def\page_floats_resave#1%
   {\ctxcommand{resavefloat("#1")}%
    \the\everyfloatscheck}
 
-\def\dopushsavedfloats
+\unexpanded\def\page_floats_push_saved
   {\ctxcommand{pushfloat()}%
    \the\everyfloatscheck}
 
-\def\dopopsavedfloats
+\unexpanded\def\page_floats_pop_saved
   {\ctxcommand{popfloat()}%
    \the\everyfloatscheck}
 
-\def\dofloatsgetinfo#1%
+\unexpanded\def\page_floats_get_info#1%
   {\ctxcommand{consultfloat("#1")}}
 
-\def\doifelsesavedfloat#1%
+\unexpanded\def\page_floats_if_else#1%
   {\ctxcommand{doifelsesavedfloat("#1")}}
 
-\def\dofloatscollect#1#2#3%
+\unexpanded\def\page_floats_collect#1#2#3%
   {\ctxcommand{collectfloat("#1",\number\dimexpr#2,\number\dimexpr#3)}}
 
-\def\nofstackedfloatincategory#1%
+\unexpanded\def\nofstackedfloatincategory#1%
   {\ctxcommand{nofstackedfloats("#1")}}
 
-\let\dopushcolumnfloats\dopushsavedfloats
-\let\dopopcolumnfloats \dopopsavedfloats
+\let\page_floats_column_push_saved\page_floats_push_saved % overloaded in page-mul
+\let\page_floats_column_pop_saved \page_floats_pop_saved  % overloaded in page-mul
 
-\def\dofloatssavepagefloat#1#2%
+\unexpanded\def\page_floats_save_page_float#1#2%
   {\ctxcommand{savefloat("#1", { specification = "#2" })}}
 
-\def\dofloatssavesomewherefloat#1#2% #1=method
+\unexpanded\def\page_floats_save_somewhere_float#1#2% #1=method
   {\ctxcommand{savefloat("#1", { specification = "#2", label = "\floatlabel" })}}
 
 %D This is an experimental new feature (for Alan Braslau), a prelude to more:
@@ -133,12 +130,12 @@
 %D \placenamedfloat[figure][beta]
 %D \stoptyping
 
-\def\placenamedfloat
-  {\dodoubleargument\doplacenamedfloat}
+\unexpanded\def\placenamedfloat
+  {\dodoubleargument\page_floats_place_named}
 
-\def\doplacenamedfloat[#1][#2]%
+\def\page_floats_place_named[#1][#2]%
   {\doloop
-     {\dofloatsflushbylabel\s!somewhere{#2}%
+     {\page_floats_flush_by_label\s!somewhere{#2}%
       \ifvoid\floatbox
         \exitloop
       \else
@@ -162,10 +159,10 @@
 %
 % \placefloatwithsetups[somefigure]{}{\externalfigure[dummy][width=5cm,height=2cm]}
 
-\def\placefloatwithsetups
-  {\dotripleempty\doplacefloatwithsetups}
+\unexpanded\def\placefloatwithsetups
+  {\dotripleempty\page_floats_place_with_setups}
 
-\long\def\doplacefloatwithsetups[#1][#2][#3]#4%
+\def\page_floats_place_with_setups[#1][#2][#3]#4%
   {\def\floatsetupcaption   {#4}%
    \def\floatsetupcontent   {\copy\nextbox}%
    \def\floatsetupwidth     {\wd\nextbox}%
@@ -178,10 +175,10 @@
 %D
 %D First we reimplement some helpers.
 
-\def\dogetfloat
-  {\ifsomefloatwaiting
-     \dofloatsflush\s!text{1}%
-     \ifcenterfloatbox
+\unexpanded\def\page_floats_get
+  {\ifconditional\c_page_floats_some_waiting
+     \page_floats_flush\s!text\plusone
+     \ifconditional\c_page_floats_center_box
        \ifdim\wd\globalscratchbox<\hsize
          \global\setbox\floatbox\hbox to \hsize{\hss\box\floatbox\hss}%
        \else
@@ -198,40 +195,30 @@
      \global\setbox\floatbox\emptybox
    \fi}
 
-\def\dosavefloat
-  {\dofloatssave\s!text
-   \nonoindentation} % brrr nonoindentation here
-
-\def\doresavefloat
-  {\dofloatsresave\s!text}
-
-\def\doreversesavefloat
-  {\dofloatsresave\s!text}
-
-\def\doflushsavedfloats
+\unexpanded\def\page_floats_flush_saved
   {\doloop
-     {\ifsomefloatwaiting
+     {\ifconditional\c_page_floats_some_waiting
         \page_otr_command_check_if_float_fits
-        \ifroomforfloat
-          \dogetfloat
+        \ifconditional\c_page_floats_room
+          \page_floats_get
           \doplacefloatbox
         \else
           \exitloop
         \fi
       \else
-%         \ifconditional\c_page_margin_blocks_present % not here, here just as many floats as fit
-%           \page_otr_command_flush_margin_blocks
-%         \else
+      % \ifconditional\c_page_margin_blocks_present % not here, here just as many floats as fit
+      %   \page_otr_command_flush_margin_blocks
+      % \else
           \exitloop
-%         \fi
+      % \fi
       \fi}}
 
 %D Page floats use different stacks.
 
-\newtoks \everybeforeflushedpagefloat
+\newtoks\everybeforeflushedpagefloat
 
-\def\doflushsomepagefloat#1% future releases can do more clever things
-  {\dofloatsflush{#1}{1}%
+\def\page_floats_flush_page_floats_indeed#1% future releases can do more clever things
+  {\page_floats_flush{#1}\plusone
    \edef\floatspecification{\ctxcommand{getfloatvariable("specification")}}% Is this okay?
    \the\everybeforeflushedpagefloat
    \vbox to \textheight
@@ -240,38 +227,15 @@
       \doifnotinset\v!low\floatspecification\vfill}%
    \page_otr_fill_and_eject_page}
 
-\def\doflushpagefloats
+\unexpanded\def\page_floats_flush_page_floats % used in postpone
   {\edef\m_page_otf_checked_page_float{\ctxcommand{checkedpagefloat()}}% (true) for packed
    \ifx\m_page_otf_checked_page_float\empty
      % nothing
    \else\ifx\m_page_otf_checked_page_float\v!empty
       \emptyhbox \page_otr_fill_and_eject_page % why not dummy_page
    \else
-      \doflushsomepagefloat\m_page_otf_checked_page_float
+      \page_floats_flush_page_floats_indeed\m_page_otf_checked_page_float
    \fi\fi}
-
-\def\uncenteredfloatbox % hm, where is this one used (was in save/restore, see old implementation)
-  {\ifcenterfloatbox
-     \ifhbox\floatbox\relax % remove centering
-       \ifdim\wd\floatbox=\hsize
-         \ifhbox\floatbox
-           \setbox\scratchbox\hbox
-             {\unhbox\floatbox
-              \unskip\unskip
-              \global\setbox\globalscratchbox\lastbox}%
-           \box\globalscratchbox
-         \else
-           \box\floatbox
-         \fi
-       \else
-         \box\floatbox
-       \fi
-     \else
-       \box\floatbox
-     \fi
-   \else
-     \box\floatbox
-   \fi}
 
 % temp hack, needed to prevent floatbox being forgotten during
 % output, this will change to using another box for flushing
@@ -291,3 +255,28 @@
 \to \everyafteroutput
 
 \protect \endinput
+
+% hm, where is this one used (was in save/restore, see old implementation)
+%
+% \unexpanded\def\uncenteredfloatbox
+%   {\ifconditional\c_page_floats_center_box
+%      \ifhbox\floatbox\relax % remove centering
+%        \ifdim\wd\floatbox=\hsize
+%          \ifhbox\floatbox
+%            \setbox\scratchbox\hbox
+%              {\unhbox\floatbox
+%               \unskip\unskip
+%               \global\setbox\globalscratchbox\lastbox}%
+%            \box\globalscratchbox
+%          \else
+%            \box\floatbox
+%          \fi
+%        \else
+%          \box\floatbox
+%        \fi
+%      \else
+%        \box\floatbox
+%      \fi
+%    \else
+%      \box\floatbox
+%    \fi}
diff --git a/tex/context/base/page-flw.mkiv b/tex/context/base/page-flw.mkiv
index 9afacf584..ec1fa636d 100644
--- a/tex/context/base/page-flw.mkiv
+++ b/tex/context/base/page-flw.mkiv
@@ -14,93 +14,127 @@
 \writestatus{loading}{ConTeXt Page Macros / Text Flows}
 
 %D This is high experimental and especially flushing may change (proper
-%D spacing is the driving force here).
+%D spacing is the driving force here). It's an old mechanism used for
+%D playing with stepping through document threads. As it's a simple and
+%D effective mechanism we keep it around. It's not to be confused with
+%D upcoming stream support.
+%D
+%D \starttyping
+%D \setuppapersize [S6]
+%D \setuptolerance [verytolerant,stretch]
+%D \setupfooter    [strut=no]
+%D \setupwhitespace[big]
+%D
+%D \setuplayout
+%D   [rightedge=5cm,width=fit,margin=0pt,edgedistance=1cm,
+%D    footer=4cm,footerdistance=1cm,header=0cm]
+%D
+%D \setuptexttexts  [edge][][\vbox{\flushtextflow{alpha}}]
+%D \setupfootertexts[edge][][\vbox{\flushtextflow{beta}}]
+%D \setupfootertexts        [\vbox{\flushtextflow{gamma}}][]
+%D
+%D \definetextflow [alfa]  [width=\rightedgewidth]
+%D \definetextflow [beta]  [width=\rightedgewidth]
+%D \definetextflow [gamma] [width=\footerheight]
+%D
+%D \starttext
+%D
+%D \dorecurse{50}
+%D   {\getrandomnumber{\funny}{0}{8}
+%D    \ifcase\funny \starttextflow[alfa]  \input tufte.tex   \stoptextflow
+%D    \or           \starttextflow[beta]  \input knuth.tex   \stoptextflow
+%D    \or           \starttextflow[gamma] \input materie.tex \stoptextflow
+%D    \or          {\bf   TUFTE}\quad \input tufte   \par
+%D    \or          {\bf   TUFTE}\quad \input tufte   \par
+%D    \or          {\bf   KNUTH}\quad \input knuth   \par
+%D    \or          {\bf   KNUTH}\quad \input knuth   \par
+%D    \or          {\bf MATERIE}\quad \input materie \par
+%D    \else        {\bf MATERIE}\quad \input materie \par
+%D    \fi}
+%D
+%D \stoptext
+%D \stoptyping
 
 \unprotect
 
-\unexpanded\def\definetextflow
-  {\dodoubleempty\dodefinetextflow}
+\installcorenamespace{textflow}
+\installcorenamespace{textflowbox}
 
-\def\dodefinetextflow[#1][#2]% flow settings
-  {\iffirstargument
-     \doiftextflowcollectorelse{#1}
-       {\setbox\textflowcollector{#1}\emptybox}
-       {\@EA\newbox\csname\??tx:c:#1\endcsname}%
-     \getparameters[\??tx:p:#1]
-       [\c!width=\hsize,\c!style=,#2]%
-   \fi}
+\installcommandhandler \??textflow {textflow} \??textflow
 
-\def\textflowparameter#1#2{\csname\??tx:p:#1#2\endcsname}
-\def\textflowcollector  #1{\csname\??tx:c:#1\endcsname}
+\setuptextflow
+  [%c!style=,
+   %c!color=,
+   \c!width=\availablehsize]
 
-\def\doiftextflowcollectorelse#1{\doifdefinedelse{\??tx:c:#1}}
+\appendtoks
+    \ifcsname\??textflowbox\currenttextflow\endcsname
+       \setbox\csname\??textflowbox\currenttextflow\endcsname\emptybox
+    \else
+       \expandafter\newbox\csname\??textflowbox\currenttextflow\endcsname
+    \fi
+\to \everydefinetextflow
 
-\def\doiftextflowelse#1%
-  {\doiftextflowcollectorelse{#1}
-     {\ifvoid\textflowcollector{#1}%
-        \expandafter\secondoftwoarguments
-      \else
-        \expandafter\firstoftwoarguments
-      \fi}
-     {\secondoftwoarguments}}
+\let\b_page_textflow_box\zerocount
 
-\def\doiftextflow#1%
-  {\doiftextflowelse{#1}\firstofoneargument\gobbleoneargument}
+\def\textflowcollector#1%
+  {\csname\??textflowbox#1\endcsname}
+
+\unexpanded\def\doiftextflowcollectorelse#1%
+  {\ifcsname\??textflowbox#1\endcsname
+     \expandafter\firstoftwoarguments
+   \else
+     \expandafter\secondoftwoarguments
+   \fi}
+
+\unexpanded\def\doiftextflowelse#1%
+  {\ifcsname\??textflowbox#1\endcsname
+     \ifvoid\csname\??textflowbox#1\endcsname
+       \doubleexpandafter\secondoftwoarguments
+     \else
+       \doubleexpandafter\firstoftwoarguments
+     \fi
+   \else
+     \expandafter\secondoftwoarguments
+   \fi}
+
+% \unexpanded\def\doiftextflow#1%
+%   {\doiftextflowelse{#1}\firstofoneargument\gobbleoneargument}
 
 \unexpanded\def\starttextflow[#1]%
-  {\doiftextflowcollectorelse{#1}
-     {\global\setbox\textflowcollector{#1}\vbox
-        \bgroup
-        \unvbox\textflowcollector{#1}%
-        \hsize\textflowparameter{#1}\c!width
-        \dousestyleparameter{\textflowparameter{#1}\c!style}%
-        \unexpanded\def\stoptextflow{\endgraf\egroup}}
-     {\let\stoptextflow\relax}}
+  {\begingroup
+   \edef\currenttextflow{#1}%
+   \ifcsname\??textflowbox\currenttextflow\endcsname
+     \b_page_textflow_box\csname\??textflowbox\currenttextflow\endcsname
+     \global\setbox\b_page_textflow_box\vbox
+       \bgroup
+       \dontcomplain
+       \ifvoid\b_page_textflow_box\else
+         \unvbox\b_page_textflow_box
+       \fi
+       \hsize\textflowparameter\c!width\relax
+       \usetextflowstyleandcolor\c!style\c!color
+       \unexpanded\def\stoptextflow{\endgraf\egroup\endgroup}%
+   \else
+     \let\stoptextflow\endgroup
+   \fi}
 
-\def\flushtextflow#1%
-  {\doiftextflow{#1}
-     {\ifdim\ht\textflowcollector{#1}>\vsize
-        \setbox\scratchbox\vsplit\textflowcollector{#1} to \vsize
-        \unvbox\scratchbox
+\unexpanded\def\flushtextflow#1%
+  {\begingroup
+   \edef\currenttextflow{#1}%
+   \ifcsname\??textflowbox\currenttextflow\endcsname
+     \b_page_textflow_box\csname\??textflowbox\currenttextflow\endcsname
+     \ifvoid\b_page_textflow_box
+       % sorry
+     \else\ifdim\ht\b_page_textflow_box>\vsize
+        \setbox\scratchbox\vsplit\b_page_textflow_box to \vsize
+        \ifvoid\scratchbox\else
+          \unvbox\scratchbox
+        \fi
       \else
-        \unvbox\textflowcollector{#1}%
-      \fi}}
+        \unvbox\b_page_textflow_box
+      \fi\fi
+   \fi
+   \endgroup}
 
 \protect \endinput
-
-% Example (dutch)
-%
-% \stelpapierformaatin [S6]
-% \steltolerantiein    [soepel,rek]
-% \stelkleurenin       [status=start]
-% \stelvoetin          [strut=nee]
-% \stelwitruimtein     [groot]
-%
-% \stellayoutin
-%   [rechterrand=5cm,breedte=passend,marge=0pt,randafstand=1cm,
-%    voet=4cm,voetafstand=1cm,hoofd=0cm]
-%
-% \stelteksttekstenin[rand][][\vbox{\flushtextflow{alpha}}]
-% \stelvoettekstenin [rand][][\vbox{\flushtextflow{beta}}]
-% \stelvoettekstenin         [\vbox{\flushtextflow{gamma}}][]
-%
-% \definetextflow [alfa]  [breedte=\rechterrandbreedte]
-% \definetextflow [beta]  [breedte=\rechterrandbreedte]
-% \definetextflow [gamma] [breedte=\voethoogte]
-%
-% \starttekst
-%
-% \dorecurse{50}
-%   {\getrandomnumber{\funny}{0}{8}
-%    \ifcase\funny \starttextflow[alfa]  \input tufte.tex   \stoptextflow
-%    \or           \starttextflow[beta]  \input knuth.tex   \stoptextflow
-%    \or           \starttextflow[gamma] \input materie.tex \stoptextflow
-%    \or          {\bf   TUFTE}\quad \input tufte   \par
-%    \or          {\bf   TUFTE}\quad \input tufte   \par
-%    \or          {\bf   KNUTH}\quad \input knuth   \par
-%    \or          {\bf   KNUTH}\quad \input knuth   \par
-%    \or          {\bf MATERIE}\quad \input materie \par
-%    \else        {\bf MATERIE}\quad \input materie \par
-%    \fi}
-%
-% \stoptekst
diff --git a/tex/context/base/page-imp.mkiv b/tex/context/base/page-imp.mkiv
index 9d0f722fe..5eb587b7b 100644
--- a/tex/context/base/page-imp.mkiv
+++ b/tex/context/base/page-imp.mkiv
@@ -148,8 +148,7 @@
        \donetrue
      \fi
    \else % testen, aangepast / expanded nodig ?
-     \normalexpanded{\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}%
-       \donetrue\donefalse
+     \normalexpanded{\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}\donetrue\donefalse
    \fi
    \ifdone
      \setbox\shipoutscratchbox\hbox{#1}%
diff --git a/tex/context/base/page-ini.mkiv b/tex/context/base/page-ini.mkiv
index 78d7f892e..59fcb38b6 100644
--- a/tex/context/base/page-ini.mkiv
+++ b/tex/context/base/page-ini.mkiv
@@ -64,7 +64,7 @@
 
 \def\page_otr_flush_all_floats
   {%\flushnotes already done
-   \ifsomefloatwaiting
+   \ifconditional\c_page_floats_some_waiting
      \begingroup
      \noftopfloats\plusthousand
      \nofbotfloats\zerocount
@@ -107,7 +107,7 @@
    \doincrementpageboundcounters % should hook into an every
    \page_adapts_synchronize
    \page_otr_check_for_pending_inserts
-   \doflushspread
+   \page_spread_flush % defined later
    \page_postponed_blocks_flush}
 
 % Can't we get rid of this hackery? It's used in some widgets
diff --git a/tex/context/base/page-ins.mkiv b/tex/context/base/page-ins.mkiv
index 793e28d4c..33c50451b 100644
--- a/tex/context/base/page-ins.mkiv
+++ b/tex/context/base/page-ins.mkiv
@@ -13,20 +13,17 @@
 
 \writestatus{loading}{ConTeXt Core Macros / Insertions}
 
-%D Insertions are special data collections that are associated
-%D to \TEX's internal page builder. When multiple footnote
-%D classes were introduced, I decided to isolate some of the
-%D functionality in a module.
+%D Insertions are special data collections that are associated to \TEX's internal
+%D page builder. When multiple footnote classes were introduced, I decided to
+%D isolate some of the functionality in a module.
 
 \unprotect
 
-\newtoks\@@insertionlist
-
-\def\processinsertions{\the\@@insertionlist}
+\newtoks\t_page_inserts_list
 
 \let\doprocessinsert\gobbleoneargument
 
-\def\installinsertion#1%
+\unexpanded\def\installinsertion#1%
   {\ifdefined#1\else
      \let#1\relax
    \fi
@@ -35,56 +32,61 @@
      \count#1\plusthousand
      \skip #1\zeropoint
      \dimen#1\maxdimen
-     \appendtoks\doprocessinsert#1\to\@@insertionlist
+     \appendtoks\doprocessinsert#1\to\t_page_inserts_list
    \fi}
 
-\def\synchronizeinsertions
-  {\def\doprocessinsert##1{\ifvoid##1\else\insert##1{\unvbox##1}\fi}%
+\unexpanded\def\processinsertions
+  {\the\t_page_inserts_list}
+
+\unexpanded\def\synchronizeinsertions
+  {\let\doprocessinsert\page_inserts_synchronize
    \processinsertions}
 
-%D For instance, when we postpone footnotes, we need to save
-%D some data related to the inserts. The next methods are
-%D far from ideal, but better than nothing. We save and
-%D restore box content and associated data independently.
-%D The box content is only restores when non||void.
-
-\def\backupinsertion#1%
-  {\csname\string#1\endcsname}
-
-\def\installbackupinsertion#1%
-  {\expandafter\newinsert\csname\string#1\endcsname
-   \count\backupinsertion#1\zerocount
-   \skip \backupinsertion#1\zeropoint
-   \dimen\backupinsertion#1\maxdimen}
-
-\def\saveinsertionbox#1%
-  {\ifdim\ht#1>\zeropoint % hm, actually unknown
-     \global\setbox\backupinsertion#1\box#1%
-   \else
-     \global\setbox\backupinsertion#1\emptybox
+\def\page_inserts_synchronize#1%
+  {\ifvoid#1\else
+     \insert#1{\unvbox#1}%
+   \fi}
+
+%D For instance, when we postpone footnotes, we need to save some data related to
+%D the inserts. The next methods are far from ideal, but better than nothing. We
+%D save and restore box content and associated data independently. The box content
+%D is only restores when non||void.
+
+\installcorenamespace{insertionbackup}
+
+\unexpanded\def\installbackupinsertion#1%
+  {\ifcsname\??insertionbackup\string#1\endcsname \else
+     \expandafter\newinsert\csname\??insertionbackup\string#1\endcsname
+     \count\csname\??insertionbackup\string#1\endcsname\zerocount
+     \skip \csname\??insertionbackup\string#1\endcsname\zeropoint
+     \dimen\csname\??insertionbackup\string#1\endcsname\maxdimen
    \fi}
 
-\def\restoreinsertionbox#1%
+\unexpanded\def\saveinsertionbox#1% hm, actually unknown
+  {\global\setbox\csname\??insertionbackup\string#1\endcsname
+     \ifdim\ht#1>\zeropoint\box#1\else\emptybox\fi}
+
+\unexpanded\def\restoreinsertionbox#1%
   {\ifvoid\backupinsertion#1\else % if void, we keep the content
-     \global\setbox#1\box\backupinsertion#1%
+     \global\setbox#1\box\csname\??insertionbackup\string#1\endcsname
    \fi}
 
-\def\eraseinsertionbackup#1%
-  {\global\setbox\backupinsertion#1\emptybox}
+\unexpanded\def\eraseinsertionbackup#1%
+  {\global\setbox\csname\??insertionbackup\string#1\endcsname\emptybox}
 
-\def\saveinsertiondata#1%
-  {\global\skip \backupinsertion#1\skip #1%
-   \global\count\backupinsertion#1\count#1%
-   \global\dimen\backupinsertion#1\dimen#1}
+\unexpanded\def\saveinsertiondata#1%
+  {\global\skip \csname\??insertionbackup\string#1\endcsname\skip #1%
+   \global\count\csname\??insertionbackup\string#1\endcsname\count#1%
+   \global\dimen\csname\??insertionbackup\string#1\endcsname\dimen#1}
 
-\def\restoreinsertiondata#1%
-  {\global\skip #1\skip \backupinsertion#1%
-   \global\count#1\count\backupinsertion#1%
-   \global\dimen#1\dimen\backupinsertion#1}
+\unexpanded\def\restoreinsertiondata#1%
+  {\global\skip #1\skip \csname\??insertionbackup\string#1\endcsname
+   \global\count#1\count\csname\??insertionbackup\string#1\endcsname
+   \global\dimen#1\dimen\csname\??insertionbackup\string#1\endcsname}
 
 %D Auxiliary macros:
 
-\def\addinsertionheight#1\to#2%
+\unexpanded\def\addinsertionheight#1\to#2%
   {\ifvoid#1\else
      \advance#2 1\skip#1\relax
      \advance#2  \ht  #1\relax
diff --git a/tex/context/base/page-lay.mkiv b/tex/context/base/page-lay.mkiv
index 78839ea70..504478e5e 100644
--- a/tex/context/base/page-lay.mkiv
+++ b/tex/context/base/page-lay.mkiv
@@ -576,7 +576,7 @@
   %\writestatus{layout target}{(\the\paperwidth,\the\paperheight) -> (\the\printpaperwidth,\the\printpaperheight)}%
    \page_layouts_synchronize}
 
-\ifx\page_paper_set_offsets\undefined
+\ifdefined\page_paper_set_offsets \else
 
   \def\page_paper_set_offsets % will move
     {\global\paperoffset\v_page_target_offset
@@ -585,8 +585,13 @@
 
 \fi
 
-\ifdefined\setups                  \else \unexpanded\def\setups[#1]{\setdefaultpenalties} \fi % still needed?
-\ifdefined\synchronizegridsnapping \else \let\synchronizegridsnapping\relax               \fi
+\ifdefined\setups \else
+    \unexpanded\def\setups[#1]{\setdefaultpenalties}  % still needed?
+\fi
+
+\ifdefined\synchronizegridsnapping \else
+    \let\synchronizegridsnapping\relax
+\fi
 
 \let\p_page_layouts_width \empty
 \let\p_page_layouts_height\empty
@@ -806,7 +811,7 @@
      \page_layouts_check_revert
    \fi\fi\fi\fi\fi\fi}
 
-\def\installlayoutmethod#1#2%
+\unexpanded\def\installlayoutmethod#1#2%
   {\setgvalue{\??layoutmethod#1}{#2}}
 
 \installlayoutmethod\v!default{\page_layouts_check_default}
@@ -926,8 +931,11 @@
 %D \macros
 %D   {adaptlayout}
 
+\installcorenamespace{adaptlayout}
 \installcorenamespace{pageadaptations}
 
+\installsetuponlycommandhandler \??adaptlayout {adaptlayout}
+
 \newdimen\d_page_adepts_pushed_text_height
 \newdimen\d_page_adepts_pushed_footer_height
 \newdimen\d_page_adepts_height
@@ -946,21 +954,28 @@
 \def\page_adapts_layout_register#1#2%
   {\setgvalue{\??pageadaptations#2}{\page_adapts_layout_indeed{#1}}}
 
+\let\p_adapts_height\zeropoint
+\let\p_adapts_lines \zerocount
+
 \def\page_adapts_layout_indeed#1%
-  {\getparameters[\??za][\c!height=\zeropoint,\c!lines=0,#1]%
+  {\setupcurrentadaptlayout[\c!height=\zeropoint,\c!lines=\zerocount,#1]%
    \page_adepts_push
-   \doifelse\@@zaheight\v!max
-     {\global\d_page_adepts_height\footerheight}
-     {\global\d_page_adepts_height\dimexpr
-        \ifnum\@@zalines=\zerocount
-          \@@zaheight
+   \edef\p_adapts_height{\adaptlayoutparameter\c!height}%
+   \edef\p_adapts_lines {\adaptlayoutparameter\c!lines}%
+   \ifx\p_adapts_height\v!max
+     \global\d_page_adepts_height\footerheight
+   \else
+     \global\d_page_adepts_height\dimexpr
+        \ifnum\p_adapts_lines=\zerocount
+          \p_adapts_height
         \else
-          \@@zalines\openlineheight
+          \p_adapts_lines\openlineheight
         \fi
       \relax
       \ifdim\d_page_adepts_height>\footerheight
         \global\d_page_adepts_height\footerheight
-      \fi}
+      \fi
+   \fi
    \global\advance\textheight   \d_page_adepts_height
    \global\advance\footerheight-\d_page_adepts_height
    \showmessage\m!layouts1{\the\d_page_adepts_height,\the\realpageno}%
@@ -1105,33 +1120,50 @@
 
 % #single #left #right
 
-\def\doifoddpageelse   {\ifodd\pagenoshift\expandafter\doifoddpageelseyes  \else\expandafter\doifoddpageelsenop  \fi}
-\def\doifoddpageelseyes{\ifodd\realpageno \expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments \fi}
-\def\doifoddpageelsenop{\ifodd\realpageno \expandafter\firstoftwoarguments \else\expandafter\secondoftwoarguments\fi}
+\def\doifoddpageelse
+  {\ifodd\pagenoshift
+     \expandafter\page_layouts_if_odd_else_yes
+   \else
+     \expandafter\page_layouts_if_odd_else_nop
+   \fi}
+
+\def\page_layouts_if_odd_else_yes
+  {\ifodd\realpageno
+     \expandafter\secondoftwoarguments
+   \else
+     \expandafter\firstoftwoarguments
+   \fi}
+
+\def\page_layouts_if_odd_else_nop
+  {\ifodd\realpageno
+     \expandafter\firstoftwoarguments
+   \else
+     \expandafter\secondoftwoarguments
+   \fi}
 
 \let\doifonevenpaginaelse\doifoddpageelse
 
-\def\redoifoddpageelse#1{\doifoddpageelse}
+\def\page_layouts_if_odd_else_again#1{\doifoddpageelse}
 
 \def\doifbothsidesoverruled
   {\ifdoublesided
-     \expandafter\redoifoddpageelse
+     \expandafter\page_layouts_if_odd_else_again
    \else
      \expandafter\firstofthreearguments
    \fi}
 
 \def\doifbothsides% #1 #2 #3
   {\ifdoublesided
-     \expandafter\doifbothsidesindeed
+     \expandafter\page_layouts_if_both_sides
    \else
      \expandafter\firstofthreearguments
    \fi}
 
-\def\doifbothsidesindeed
+\def\page_layouts_if_both_sides
   {\ifsinglesided
      \expandafter\firstofthreearguments
    \else
-     \expandafter\redoifoddpageelse
+     \expandafter\page_layouts_if_odd_else_again
    \fi}
 
 \newdimen\texthoffset
@@ -1179,12 +1211,12 @@
 
 \def\rightorleftpageaction
   {\ifdoublesided
-     \expandafter\rightorleftpageactionindeed
+     \expandafter\page_layouts_right_or_left_page_action
    \else
      \expandafter\firstoftwoarguments
    \fi}
 
-\def\rightorleftpageactionindeed
+\def\page_layouts_right_or_left_page_action
   {\ifsinglesided
      \expandafter\firstoftwoarguments
    \else
diff --git a/tex/context/base/page-lin.lua b/tex/context/base/page-lin.lua
index b830dbbb9..4dec0deec 100644
--- a/tex/context/base/page-lin.lua
+++ b/tex/context/base/page-lin.lua
@@ -134,6 +134,10 @@ function boxed.register(configuration)
     return last
 end
 
+function commands.registerlinenumbering(configuration)
+    context(boxed.register(configuration))
+end
+
 function boxed.setup(n,configuration)
     local d = data[n]
     if d then
@@ -152,6 +156,8 @@ function boxed.setup(n,configuration)
     return n
 end
 
+commands.setuplinenumbering = boxed.setup
+
 local function check_number(n,a,skip,sameline)
     local d = data[a]
     if d then
@@ -280,3 +286,6 @@ function boxed.stage_two(n,m)
        end
     end
 end
+
+commands.linenumbersstageone = boxed.stage_one
+commands.linenumbersstagetwo = boxed.stage_two
diff --git a/tex/context/base/page-lin.mkiv b/tex/context/base/page-lin.mkiv
index 671d4c712..a26fc2c74 100644
--- a/tex/context/base/page-lin.mkiv
+++ b/tex/context/base/page-lin.mkiv
@@ -26,20 +26,6 @@
 %
 % we should use normal counters but then we need to sync settings
 
-% not yet ok, we need to give the top line a proper height
-%
-% \newbox\locallinenumberbox
-%
-% \unexpanded\def\startlocallinenumbering
-%   {\setbox\locallinenumberbox\vbox\bgroup
-%    \startlinenumbering}
-%
-% \unexpanded\def\stoplocallinenumbering
-%   {\stoplinenumbering
-%    \egroup
-%    \mkdoprocessdeepboxcontents\locallinenumberbox
-%    \unvbox\locallinenumberbox}
-
 % some line
 %
 % \startlocallinenumbering
@@ -55,137 +41,96 @@
 \definesystemattribute[linenumber]   [public]
 \definesystemattribute[linereference][public]
 
-\appendtoksonce \attribute\linenumberattribute \attributeunsetvalue \to \everyforgetall
-\appendtoksonce \attribute\displaymathattribute\plusone             \to \everybeforedisplayformula
+\appendtoksonce
+    \attribute\linenumberattribute\attributeunsetvalue
+\to \everyforgetall
 
 \newcount   \linenumber % not used
-\newbox     \linenumberscratchbox
-\newcount   \linenumberchunk
-\newcount   \linerefcounter
-\newconstant\linenumbernesting
+\newbox     \b_page_lines_scratch
+\newcount   \c_page_lines_reference
+\newconstant\c_page_lines_nesting
 
 \newconditional\tracelinenumbering
 
-\def\mkprocesstextlinenumbers#1#2%
-  {\setbox\linenumberscratchbox\vbox
-     {\forgetall
-      \offinterlineskip
-      \ctxlua{nodes.lines.boxed.stage_one(\number#1,\ifcase\linenumbernesting false\else true\fi)}}% #2
-   \ctxlua{nodes.lines.boxed.stage_two(\number#1,\number\linenumberscratchbox)}}% can move to lua code
-
 % id nr shift width leftskip dir
 
-\let\makelinenumber\gobblesevenarguments
+\installcorenamespace{linenumberinginstance}
+
+\let\makelinenumber\gobblesevenarguments % used at lua end
 
 \newconditional\boxcontentneedsprocessing
 
-\def\mkdoprocesspagecontents   #1{\mkaddtextlinenumbers{#1}\plusone      \plusone   \zerocount}
-\def\mkdoprocessboxcontents    #1{\mkaddtextlinenumbers{#1}\plusone      \plusone   \zerocount}
-\def\mkdoprocessdeepboxcontents#1{\mkaddtextlinenumbers{#1}\plusone      \plusone   \plusone  }
-\def\mkdoprocesscolumncontents #1{\mkaddtextlinenumbers{#1}\currentcolumn\nofcolumns\zerocount}
+\def\mkdoprocesspagecontents   #1{\page_lines_add_numbers_to_box{#1}\plusone      \plusone   \zerocount}
+\def\mkdoprocessboxcontents    #1{\page_lines_add_numbers_to_box{#1}\plusone      \plusone   \zerocount}
+\def\mkdoprocessdeepboxcontents#1{\page_lines_add_numbers_to_box{#1}\plusone      \plusone   \plusone  }
+\def\mkdoprocesscolumncontents #1{\page_lines_add_numbers_to_box{#1}\currentcolumn\nofcolumns\zerocount}
 
-\def\mklinenumberparameters
-  {continue = "\linenumberparameter\c!continue",
-   start    = \linenumberparameter\c!start,
-   step     = \linenumberparameter\c!step,
-   method   = "\linenumberparameter\c!method",
+\def\page_lines_parameters_regular
+  {continue = "\linenumberingparameter\c!continue",
+   start    = \number\linenumberingparameter\c!start,
+   step     = \number\linenumberingparameter\c!step,
+   method   = "\linenumberingparameter\c!method",
    tag      = "\currentlinenumbering"}
 
-\def\mklinenumberupdateparameters
-  {continue = "\linenumberparameter\c!continue"}
-
-\def\mkdefinetextlinenumbering
-  {\setxvalue{ln:c:\currentlinenumbering}{\number\cldcontext{nodes.lines.boxed.register({\mklinenumberparameters})}}}
+\def\page_lines_parameters_update
+  {continue = "\linenumberingparameter\c!continue"}
 
-\def\mkupdatetextlinenumbering
-  {\ctxlua{nodes.lines.boxed.setup(\getvalue{ln:c:\currentlinenumbering},{\mklinenumberupdateparameters})}}
+\def\page_lines_start_define
+  {\setxvalue{\??linenumberinginstance\currentlinenumbering}{\ctxcommand{registerlinenumbering({\page_lines_parameters_regular})}}}
 
-\def\mkstarttextlinenumbering#1#2% always when assignment
-  {\globallet\mkprocesspagecontents  \mkdoprocesspagecontents
-   \globallet\mkprocesscolumncontents\mkdoprocesscolumncontents
-   \global\settrue\boxcontentneedsprocessing % see core-rul.mkiv
-   \edef\currentlinenumbering{#1}%
-   \ifcase#2\relax
-     \mkupdatetextlinenumbering % continue
-   \or
-     \mkdefinetextlinenumbering % only when assignment
-   \fi
-   \attribute\linenumberattribute\getvalue{ln:c:\currentlinenumbering}\relax}
+\def\page_lines_start_update
+  {\ctxcommand{setuplinenumbering(\csname\??linenumberinginstance\currentlinenumbering\endcsname,{\page_lines_parameters_update})}}
 
-\def\mksetuptextlinenumbering
-  {\ifcsname ln:c:\currentlinenumbering\endcsname
-     \ctxlua{nodes.lines.boxed.setup(\getvalue{ln:c:\currentlinenumbering},{\mklinenumberparameters})}%
+\def\page_lines_setup
+  {\ifcsname \??linenumberinginstance\currentlinenumbering\endcsname
+     \ctxcommand{setuplinenumbering(\csname\??linenumberinginstance\currentlinenumbering\endcsname,{\page_lines_parameters_regular})}%
    \fi}
 
-\def\mkstoptextlinenumbering
-  {\attribute\linenumberattribute\attributeunsetvalue}
-
 % we could make this a bit more efficient by putting the end reference
 % in the same table as the start one but why make things complex ...
 
-\let\dofinishlinereference\dofinishfullreference
+\let\dofinishlinereference\dofinishfullreference % at lua end
 
-\def\mksomelinereference#1#2#3%
+\unexpanded\def\page_lines_some_reference#1#2#3%
   {\dontleavehmode\begingroup
-   \global\advance\linerefcounter\plusone
-   \attribute\linereferenceattribute\linerefcounter
+   \global\advance\c_page_lines_reference\plusone
+   \attribute\linereferenceattribute\c_page_lines_reference
    #3%
    % for the moment we use a simple system i.e. no prefixes etc .. todo: store as number
-   \expanded{\strc_references_set_named_reference{line}{#2}{conversion=\linenumberparameter\c!conversion}{\the\linerefcounter}}% kind labels userdata text
+   \normalexpanded{\strc_references_set_named_reference{line}{#2}{conversion=\linenumberingparameter\c!conversion}{\the\c_page_lines_reference}}% kind labels userdata text
    \endgroup}
 
-\def\mkstartlinereference#1{\mksomelinereference{#1}{lr:b:#1}{}\ignorespaces}
-\def\mkstoplinereference #1{\removeunwantedspaces\mksomelinereference{#1}{lr:e:#1}{}}
+\def\page_lines_reference_start#1{\page_lines_some_reference{#1}{lr:b:#1}{}\ignorespaces}
+\def\page_lines_reference_stop #1{\removeunwantedspaces\page_lines_some_reference{#1}{lr:e:#1}{}}
+
+% \def\mklinestartreference#1[#2]{\in{#1}[lr:b:#2]} % not interfaced/ not used
+% \def\mklinestopreference #1[#2]{\in{#1}[lr:e:#2]} % not interfaced/ not used
 
-\def\mklinestartreference#1[#2]{\in{#1}[lr:b:#2]} % not interfaced
-\def\mklinestopreference #1[#2]{\in{#1}[lr:e:#2]} % not interfaced
+\newif\ifnumberinglines   % will change
+\newif\iftypesettinglines % will change
 
-% high level interface
+\installcorenamespace{linenumbering}
 
-\newif\ifnumberinglines
-\newif\iftypesettinglines
+\installcommandhandler \??linenumbering {linenumbering} \??linenumbering
 
-\let\currentlinenumbering\empty
+\setnewconstant\c_page_lines_mode     \plusone  % 0=continue, 1=restart
+\setnewconstant\c_page_lines_location \plusone  % 0=middle, 1=left, 2=right, 3=inner, 4=outer, 5=text, 6=begin, 7=end
+\setnewconstant\c_page_lines_alignment\plusfive % 0=middle, 1=left, 2=right, 5=auto
 
-\setnewconstant\linenumbermode     \plusone  % 0=continue, 1=restart
-\setnewconstant\linenumberlocation \plusone  % 0=middle, 1=left, 2=right, 3=inner, 4=outer, 5=text, 6=begin, 7=end
-\setnewconstant\linenumberalignment\plusfive % 0=middle, 1=left, 2=right, 5=auto
+\newdimen\d_page_lines_width
+\newdimen\d_page_lines_distance
 
 \newevery \beforeeverylinenumbering \relax
 \newevery \aftereverylinenumbering  \relax
 \newevery \everylinenumber          \relax
 
-\newdimen\linenumberwidth
-\newdimen\linenumberdistance
-
-\unexpanded\def\definelinenumbering
-  {\dosingleempty\dodefinelinenumbering}
-
-\def\dodefinelinenumbering[#1]%
-  {\edef\currentlinenumbering{#1}%
-   \mkdefinetextlinenumbering}
-
-\unexpanded\def\setuplinenumbering
-  {\dodoubleempty\dosetuplinenumbering}
-
-\def\dosetuplinenumbering[#1][#2]%
-  {\ifsecondargument
-     \def\currentlinenumbering{#1}%
-     \getparameters[\??rn#1][#2]%
-   \else
-     \let\currentlinenumbering\empty
-     \getparameters[\??rn][#1]%
-   \fi
-   \mksetuptextlinenumbering}
-
-% some day commandhandler
-
-\def\linenumberparameter#1%
-  {\csname\??rn\ifcsname\??rn\currentlinenumbering#1\endcsname\currentlinenumbering\fi#1\endcsname}
+\appendtoks
+   \page_lines_setup
+\to \everysetuplinenumbering
 
-\unexpanded\def\dolinenumberattributes#1#2%
-  {\dousestyleparameter{\linenumberparameter#1}%
-   \dousecolorparameter{\linenumberparameter#2}}
+\appendtoks
+   \page_lines_start_define
+\to \everydefinelinenumbering
 
 \setuplinenumbering
   [\c!conversion=\v!numbers,
@@ -204,253 +149,270 @@
    \c!align=\v!auto]
 
 \definelinenumbering
-
-\unexpanded\def\startlinenumbering
-  {\dodoubleempty\dostartlinenumbering}
+  []
 
 % no intermediate changes in values, define a class, otherwise each range
 % would need a number
 
 % todo: text
 
-\expandafter\let\csname\??rn:l:\v!middle    \endcsname \zerocount
-\expandafter\let\csname\??rn:l:\v!left      \endcsname \plusone
-\expandafter\let\csname\??rn:l:\v!margin    \endcsname \plusone
-\expandafter\let\csname\??rn:l:\v!inmargin  \endcsname \plusone
-\expandafter\let\csname\??rn:l:\v!inleft    \endcsname \plusone
-\expandafter\let\csname\??rn:l:\v!right     \endcsname \plustwo
-\expandafter\let\csname\??rn:l:\v!inright   \endcsname \plustwo
-\expandafter\let\csname\??rn:l:\v!inner     \endcsname \plusthree
-\expandafter\let\csname\??rn:l:\v!outer     \endcsname \plusfour
-\expandafter\let\csname\??rn:l:\v!text      \endcsname \plusfive
-\expandafter\let\csname\??rn:l:\v!begin     \endcsname \plussix
-\expandafter\let\csname\??rn:l:\v!end       \endcsname \plusseven
-
-\expandafter\let\csname\??rn:a:\v!middle    \endcsname \zerocount
-\expandafter\let\csname\??rn:a:\v!right     \endcsname \plusone
-\expandafter\let\csname\??rn:a:\v!flushleft \endcsname \plusone
-\expandafter\let\csname\??rn:a:\v!left      \endcsname \plustwo
-\expandafter\let\csname\??rn:a:\v!flushright\endcsname \plustwo
-\expandafter\let\csname\??rn:a:\v!auto      \endcsname \plusfive
-
-\def\dostartlinenumbering[#1][#2]% todo: c!continue
+\installcorenamespace{linennumberinglocation}
+\installcorenamespace{linennumberingalternative}
+
+\expandafter\let\csname\??linennumberinglocation\v!middle       \endcsname \zerocount
+\expandafter\let\csname\??linennumberinglocation\v!left         \endcsname \plusone
+\expandafter\let\csname\??linennumberinglocation\v!margin       \endcsname \plusone
+\expandafter\let\csname\??linennumberinglocation\v!inmargin     \endcsname \plusone
+\expandafter\let\csname\??linennumberinglocation\v!inleft       \endcsname \plusone
+\expandafter\let\csname\??linennumberinglocation\v!right        \endcsname \plustwo
+\expandafter\let\csname\??linennumberinglocation\v!inright      \endcsname \plustwo
+\expandafter\let\csname\??linennumberinglocation\v!inner        \endcsname \plusthree
+\expandafter\let\csname\??linennumberinglocation\v!outer        \endcsname \plusfour
+\expandafter\let\csname\??linennumberinglocation\v!text         \endcsname \plusfive
+\expandafter\let\csname\??linennumberinglocation\v!begin        \endcsname \plussix
+\expandafter\let\csname\??linennumberinglocation\v!end          \endcsname \plusseven
+
+\expandafter\let\csname\??linennumberingalternative\v!middle    \endcsname \zerocount
+\expandafter\let\csname\??linennumberingalternative\v!right     \endcsname \plusone
+\expandafter\let\csname\??linennumberingalternative\v!flushleft \endcsname \plusone
+\expandafter\let\csname\??linennumberingalternative\v!left      \endcsname \plustwo
+\expandafter\let\csname\??linennumberingalternative\v!flushright\endcsname \plustwo
+\expandafter\let\csname\??linennumberingalternative\v!auto      \endcsname \plusfive
+
+\unexpanded\def\startlinenumbering
+  {\dodoubleempty\page_lines_start}
+
+\def\page_lines_start[#1][#2]% todo: c!continue
   {\begingroup
-   \linenumbermode\plusone
+   \c_page_lines_mode\plusone
    \ifsecondargument
-     \def\currentlinenumbering{#1}%
+     \edef\currentlinenumbering{#1}%
      \doifassignmentelse{#2}
-       {\getparameters[\??rn\currentlinenumbering][#2]}
+       {\setupcurrentlinenumbering[#2]}
        {\doifnumberelse{#2}% downward compatible
-          {\setvalue{\??rn#1\c!start}{#2}}%
+          {\setcurrentlinenumberingparameter\c!start{#2}}%
           {\doif{#2}\v!continue
-             {\getparameters[\??rn\currentlinenumbering][\c!continue=\v!yes]%
-              \linenumbermode\zerocount}}}%
+             {\letcurrentlinenumberingparameter\c!continue\v!yes
+              \c_page_lines_mode\zerocount}}}%
    \else\iffirstargument
      \doifnumberelse{#1}% downward compatible
        {\let\currentlinenumbering\empty
-        \setvalue{\??rn\c!start}{#1}}%
+        \setcurrentlinenumberingparameter\c!start{#1}}%
        {\doifelse{#1}\v!continue
           {\let\currentlinenumbering\empty
-           \getparameters[\??rn\currentlinenumbering][\c!continue=\v!yes]%
-           \linenumbermode\zerocount}
-          {\def\currentlinenumbering{#1}}}%
+           \letcurrentlinenumberingparameter\c!continue\v!yes
+           \c_page_lines_mode\zerocount}
+          {\edef\currentlinenumbering{#1}}}%
    \fi\fi
-   \doif{\linenumberparameter\c!continue}\v!yes
-     {\linenumbermode\zerocount}%
+   \doif{\linenumberingparameter\c!continue}\v!yes
+     {\c_page_lines_mode\zerocount}%
    \numberinglinestrue
    \the\beforeeverylinenumbering
-   \mkstarttextlinenumbering\currentlinenumbering\linenumbermode}
+   \globallet\mkprocesspagecontents  \mkdoprocesspagecontents
+   \globallet\mkprocesscolumncontents\mkdoprocesscolumncontents
+   \global\settrue\boxcontentneedsprocessing % see core-rul.mkiv
+   \ifcase\c_page_lines_mode\relax
+     \page_lines_start_update % continue
+   \or
+     \page_lines_start_define % only when assignment
+   \fi
+   \attribute\linenumberattribute\getvalue{\??linenumberinginstance\currentlinenumbering}\relax}
 
 \unexpanded\def\stoplinenumbering
-  {\mkstoptextlinenumbering
+  {\attribute\linenumberattribute\attributeunsetvalue
    \the\aftereverylinenumbering
    \endgroup}
 
 % number placement .. will change into (the new) margin code
 
-\def\mkdoinnerlinenumber{\doifoddpageelse\mkdoleftlinenumber\mkdorightlinenumber}
-\def\mkdoouterlinenumber{\doifoddpageelse\mkdorightlinenumber\mkdoleftlinenumber}
+\def\page_lines_number_inner_indeed{\doifoddpageelse\page_lines_number_left_indeed\page_lines_number_right_indeed}
+\def\page_lines_number_outer_indeed{\doifoddpageelse\page_lines_number_right_indeed\page_lines_number_left_indeed}
 
-\def\mkleftlinenumber
-  {\ifcase\linenumberlocation
-     \expandafter\mkdoleftlinenumber
+\def\page_lines_number_left
+  {\ifcase\c_page_lines_location
+     \expandafter\page_lines_number_left_indeed
    \or
-     \expandafter\mkdoleftlinenumber
+     \expandafter\page_lines_number_left_indeed
    \or
-     \expandafter\mkdoleftlinenumber
+     \expandafter\page_lines_number_left_indeed
    \or
-     \expandafter\mkdoinnerlinenumber
+     \expandafter\page_lines_number_inner_indeed
    \or
-     \expandafter\mkdoouterlinenumber
+     \expandafter\page_lines_number_outer_indeed
    \or
-     \expandafter\mkdotextlinenumber
+     \expandafter\page_lines_number_text_indeed
    \or
-     \expandafter\mkdobeginlinenumber
+     \expandafter\page_lines_number_begin_indeed
    \or
-     \expandafter\mkdoendlinenumber
+     \expandafter\page_lines_number_end_indeed
    \fi}
 
-\def\mkrightlinenumber
-  {\ifcase\linenumberlocation
-     \expandafter\mkdorightlinenumber
+\def\page_lines_number_right
+  {\ifcase\c_page_lines_location
+     \expandafter\page_lines_number_right_indeed
    \or
-     \expandafter\mkdorightlinenumber
+     \expandafter\page_lines_number_right_indeed
    \or
-     \expandafter\mkdorightlinenumber
+     \expandafter\page_lines_number_right_indeed
    \or
-     \expandafter\mkdoouterlinenumber
+     \expandafter\page_lines_number_outer_indeed
    \or
-     \expandafter\mkdoinnerlinenumber
+     \expandafter\page_lines_number_inner_indeed
    \or
-     \expandafter\mkdotextlinenumber
+     \expandafter\page_lines_number_text_indeed
    \or
-     \expandafter\mkdoendlinenumber
+     \expandafter\page_lines_number_end_indeed
    \or
-     \expandafter\mkdobeginlinenumber
+     \expandafter\page_lines_number_begin_indeed
    \fi}
 
-\newconditional\faketextlinenumber
-\newconstant   \linenumberbox
-\newconstant   \linenumbercolumn
-\newconstant   \linenumberlastcolumn
+\newconditional\c_page_lines_fake_number
+\newconstant   \b_page_lines_number
+\newconstant   \c_page_lines_column
+\newconstant   \c_page_lines_last_column
 
-\def\mkaddtextlinenumbers#1#2#3#4% box col max nesting
+\def\page_lines_add_numbers_to_box#1#2#3#4% box col max nesting
   {\bgroup
-   \linenumberbox       #1\relax
-   \linenumbercolumn    #2\relax
-   \linenumberlastcolumn#3\relax
-   \linenumbernesting   #4\relax
+   \b_page_lines_number     #1\relax
+   \c_page_lines_column     #2\relax
+   \c_page_lines_last_column#3\relax
+   \c_page_lines_nesting    #4\relax
    \fullrestoreglobalbodyfont
-   \let\makelinenumber\maketextlinenumber
-   \mkprocesstextlinenumbers\linenumberbox\linenumbernesting
+   \let\makelinenumber\page_lines_make_number % used at lua end
+   \setbox\b_page_lines_scratch\vbox
+     {\forgetall
+      \offinterlineskip
+      \ctxcommand{linenumbersstageone(\number\b_page_lines_number,\ifcase\c_page_lines_nesting false\else true\fi)}}%
+   \ctxcommand{linenumbersstagetwo(\number\b_page_lines_number,\number\b_page_lines_scratch)}% can move to lua code
    \egroup}
 
-\def\maketextlinenumber#1#2%
+\let\page_lines_make_number_indeed\relax
+
+\def\page_lines_make_number#1#2%
   {\edef\currentlinenumbering{#1}%
    \ifcase#2\relax
-     \settrue \faketextlinenumber
+     \settrue \c_page_lines_fake_number
    \else
-     \setfalse\faketextlinenumber
+     \setfalse\c_page_lines_fake_number
    \fi
-   \linenumberlocation \executeifdefined{\??rn:l:\linenumberparameter\c!location}\plusone  % left
-   \linenumberalignment\executeifdefined{\??rn:a:\linenumberparameter\c!align   }\plusfive % auto
-   \ifcase\linenumberlastcolumn\relax
-     \settrue \faketextlinenumber
+   \c_page_lines_location \executeifdefined{\??linennumberinglocation   \linenumberingparameter\c!location}\plusone \relax % left
+   \c_page_lines_alignment\executeifdefined{\??linennumberingalternative\linenumberingparameter\c!align   }\plusfive\relax % auto
+   \ifcase\c_page_lines_last_column\relax
+     \settrue \c_page_lines_fake_number
    \or
     % one column
-     \ifcase\linenumberlocation
-       \settrue \faketextlinenumber
-        % hm
+     \ifcase\c_page_lines_location
+       \settrue \c_page_lines_fake_number
+       \let\page_lines_make_number_indeed\page_lines_number_fake_indeed
      \or
-       \let\domakelinenumber\mkleftlinenumber
+       \let\page_lines_make_number_indeed\page_lines_number_left
      \or
-       \let\domakelinenumber\mkrightlinenumber
+       \let\page_lines_make_number_indeed\page_lines_number_right
      \or % inner
-       \let\domakelinenumber\mkdoinnerlinenumber
+       \let\page_lines_make_number_indeed\page_lines_number_inner_indeed
      \or % outer
-       \let\domakelinenumber\mkdoouterlinenumber
+       \let\page_lines_make_number_indeed\page_lines_number_outer_indeed
      \or % text
-       \let\domakelinenumber\mkdotextlinenumber
+       \let\page_lines_make_number_indeed\page_lines_number_text_indeed
      \or
-       \let\domakelinenumber\mkdobeginlinenumber
+       \let\page_lines_make_number_indeed\page_lines_number_begin_indeed
      \or
-       \let\domakelinenumber\mkdoendlinenumber
+       \let\page_lines_make_number_indeed\page_lines_number_end_indeed
      \fi
-   \else\ifcase\linenumbercolumn\relax
-     \settrue \faketextlinenumber
+   \else\ifcase\c_page_lines_column\relax
+     \settrue \c_page_lines_fake_number
    \or
-     \let\domakelinenumber\mkleftlinenumber
-     \ifcase\linenumberlocation\or
-       \linenumberlocation\plusone
+     \let\page_lines_make_number_indeed\page_lines_number_left
+     \ifcase\c_page_lines_location\or
+       \c_page_lines_location\plusone
      \or
-       \linenumberlocation\plustwo
+       \c_page_lines_location\plustwo
      \else
-       \linenumberlocation\plusone
+       \c_page_lines_location\plusone
      \or
-       \linenumberlocation\plusone
+       \c_page_lines_location\plusone
      \or
-       \linenumberlocation\plusone
+       \c_page_lines_location\plusone
      \or
-       \linenumberlocation\plusone % todo
+       \c_page_lines_location\plusone % todo
      \or
-       \linenumberlocation\plusone % todo
+       \c_page_lines_location\plusone % todo
      \fi
    \else
-     \let\domakelinenumber\mkrightlinenumber
-     \ifcase\linenumberlocation\or
-       \linenumberlocation\plustwo
+     \let\page_lines_make_number_indeed\page_lines_number_right
+     \ifcase\c_page_lines_location\or
+       \c_page_lines_location\plustwo
      \or
-       \linenumberlocation\plusone
+       \c_page_lines_location\plusone
      \or
-       \linenumberlocation\plustwo
+       \c_page_lines_location\plustwo
      \or
-       \linenumberlocation\plustwo
+       \c_page_lines_location\plustwo
      \or
-       \linenumberlocation\plustwo % todo
+       \c_page_lines_location\plustwo % todo
      \or
-       \linenumberlocation\plustwo % todo
+       \c_page_lines_location\plustwo % todo
      \fi
    \fi\fi
-   \domakelinenumber{#1}}
+   \page_lines_make_number_indeed{#1}}
 
-\def\mkdotextlinenumber #1#2#3#4#5#6% beware, one needs so compensate for this in the width !
-  {\hbox{\dosomelinenumber{#1}{2}{#2}{#5}\hskip#3\scaledpoint}}
+\let\page_lines_number_fake_indeed\gobblesixarguments % needs checking
 
-\def\mkdotextlinenumber #1#2#3#4#5#6% beware, one needs so compensate for this in the width !
-  {\hbox{\dosomelinenumber{#1}{2}{#2}{#5}\hskip#3\scaledpoint}}
+\def\page_lines_number_text_indeed#1#2#3#4#5#6% beware, one needs so compensate for this in the \hsize
+  {\hbox{\page_lines_number_construct{#1}{2}{#2}{#5}\hskip#3\scaledpoint}}
 
-\def\mkdoleftlinenumber #1#2#3#4#5#6%
+\def\page_lines_number_left_indeed#1#2#3#4#5#6%
   {\naturalhbox to \zeropoint
      {\ifcase\istltdir#6\else \hskip-#4\scaledpoint \fi
-      \llap{\dosomelinenumber{#1}{2}{#2}{#5}\kern#3\scaledpoint}}}
+      \llap{\page_lines_number_construct{#1}{2}{#2}{#5}\kern#3\scaledpoint}}}
 
-\def\mkdorightlinenumber#1#2#3#4#5#6%
+\def\page_lines_number_right_indeed#1#2#3#4#5#6%
   {\naturalhbox to \zeropoint
      {\ifcase\istltdir#6\else \hskip-#4\scaledpoint \fi
-      \rlap{\hskip#4\scaledpoint\hskip#3\scaledpoint\dosomelinenumber{#1}{1}{#2}{#5}}}}
+      \rlap{\hskip\dimexpr#4\scaledpoint+#3\scaledpoint\relax\page_lines_number_construct{#1}{1}{#2}{#5}}}}
 
-\def\mkdobeginlinenumber #1#2#3#4#5#6%
+\def\page_lines_number_begin_indeed#1#2#3#4#5#6%
   {\ifcase\istltdir#6\relax
-     \linenumberlocation\plusone
-     \expandafter\mkdoleftlinenumber
+     \c_page_lines_location\plusone
+     \expandafter\page_lines_number_left_indeed
    \else
-     \linenumberlocation\plustwo
-     \expandafter\mkdorightlinenumber
+     \c_page_lines_location\plustwo
+     \expandafter\page_lines_number_left_indeed
    \fi{#1}{#2}{#3}{#4}{#5}{#6}}
 
-\def\mkdoendlinenumber#1#2#3#4#5#6%
+\def\page_lines_number_end_indeed#1#2#3#4#5#6%
   {\ifcase\istltdir#6\relax
-     \linenumberlocation\plustwo
-     \expandafter\mkdorightlinenumber
+     \c_page_lines_location\plustwo
+     \expandafter\page_lines_number_left_indeed
    \else
-     \linenumberlocation\plusone
-     \expandafter\mkdoleftlinenumber
+     \c_page_lines_location\plusone
+     \expandafter\page_lines_number_left_indeed
    \fi{#1}{#2}{#3}{#4}{#5}{#6}}
 
-\def\dosomelinenumber#1#2#3#4% tag 1=left|2=right linenumber leftskip
+\def\page_lines_number_construct#1#2#3#4% tag 1=left|2=right linenumber leftskip
   {\begingroup
    \def\currentlinenumbering{#1}%
    \def\linenumber{#3}% unsafe
-   \doifelse{\linenumberparameter\c!width}\v!margin
-     {\linenumberwidth\leftmarginwidth}
-     {\linenumberwidth\linenumberparameter\c!width}%
-   \linenumberdistance\linenumberparameter\c!distance\relax
-   \ifcase#2\relax\or\hskip\linenumberdistance\fi\relax
-   \ifnum\linenumberlocation=\plusfive
-     \scratchdimen\dimexpr#4\scaledpoint-\linenumberdistance\relax
-     \linenumberlocation\plusone
+   \doifelse{\linenumberingparameter\c!width}\v!margin
+     {\d_page_lines_width\leftmarginwidth}
+     {\d_page_lines_width\linenumberingparameter\c!width}%
+   \d_page_lines_distance\linenumberingparameter\c!distance\relax
+   \ifcase#2\relax\or\hskip\d_page_lines_distance\fi\relax
+   \ifnum\c_page_lines_location=\plusfive
+     \scratchdimen\dimexpr#4\scaledpoint-\d_page_lines_distance\relax
+     \c_page_lines_location\plusone
    \else
      \scratchdimen\zeropoint
    \fi
-   \ifcase\linenumberalignment
-     \linenumberlocation\zerocount % middle
+   \ifcase\c_page_lines_alignment
+     \c_page_lines_location\zerocount % middle
    \or
-     \linenumberlocation\plusone % left
+     \c_page_lines_location\plusone % left
    \or
-     \linenumberlocation\plustwo % right
+     \c_page_lines_location\plustwo % right
    \fi
-   \ifconditional\tracelinenumbering\ruledhbox\else\hbox\fi to \linenumberwidth
-     {\ifcase\linenumberlocation
+   \ifconditional\tracelinenumbering\ruledhbox\else\hbox\fi to \d_page_lines_width
+     {\ifcase\c_page_lines_location
         \hss % middle
       \or
         % left
@@ -461,16 +423,16 @@
       \or
         \doifoddpageelse\hss\relax % outer
       \fi
-      \ifconditional\faketextlinenumber
+      \ifconditional\c_page_lines_fake_number
         % we need to reserve space
       \else
-        \dolinenumberattributes\c!style\c!color
-        \linenumberparameter\c!command
-          {\linenumberparameter\c!left
-           \convertnumber{\linenumberparameter\c!conversion}{#3}%
-           \linenumberparameter\c!right}%
+        \uselinenumberingstyleandcolor\c!style\c!color
+        \linenumberingparameter\c!command
+          {\linenumberingparameter\c!left
+           \convertnumber{\linenumberingparameter\c!conversion}{#3}%
+           \linenumberingparameter\c!right}%
       \fi
-      \ifcase\linenumberlocation
+      \ifcase\c_page_lines_location
         \hss % middle
       \or
         \hss % left
@@ -481,53 +443,60 @@
       \or
         \doifoddpageelse\relax\hss % outer
       \fi}%
-   \ifcase#2\relax\or\or\hskip\linenumberdistance\fi\relax
-   \hskip-\scratchdimen
+   \ifcase#2\relax
+     \hskip-\scratchdimen
+   \or
+     \hskip-\scratchdimen
+   \or
+     \hskip\dimexpr\d_page_lines_distance-\scratchdimen\relax
+   \fi
+   \relax
    \the\everylinenumber
    \endgroup}
 
-% left right inner outer
-
-% align: \alignedline\@@rnalign\v!right{\box0\hskip\@@rndistance}
-
 % referencing
 
-\unexpanded\def\someline [#1]{\mkstartlinereference{#1}\mkstoplinereference{#1}} % was just a def
-\unexpanded\def\startline[#1]{\mkstartlinereference{#1}}
-\unexpanded\def\stopline [#1]{\mkstoplinereference {#1}}
+\unexpanded\def\someline [#1]{\page_lines_reference_start{#1}\page_lines_reference_stop{#1}} % was just a def
+\unexpanded\def\startline[#1]{\page_lines_reference_start{#1}}
+\unexpanded\def\stopline [#1]{\page_lines_reference_stop {#1}}
 
-\def\mkshowstartlinereference#1%
+\def\page_lines_reference_show_start#1%
   {\ifconditional\tracelinenumbering
      \setbox\scratchbox\hbox{\llap
        {\vrule\!!width\onepoint\!!depth\strutdp\!!height.8\strutht\raise.85\strutht\hbox{\llap{\tt\txx#1}}}}%
-     \smashbox\scratchbox\box\scratchbox
+     \smashbox\scratchbox
+     \box\scratchbox
    \fi}
 
-\def\mkshowstoplinereference#1%
+\def\page_lines_reference_show_stop#1%
   {\ifconditional\tracelinenumbering
      \setbox\scratchbox\hbox{\rlap
        {\raise.85\strutht\hbox{\rlap{\tt\txx#1}}\vrule\!!width\onepoint\!!depth\strutdp\!!height.8\strutht}}%
-     \smashbox\scratchbox\box\scratchbox
+     \smashbox\scratchbox
+     \box\scratchbox
    \fi}
 
-\def\mkstartlinereference#1{\mksomelinereference{#1}{lr:b:#1}{\mkshowstartlinereference{#1}}\ignorespaces}
-\def\mkstoplinereference #1{\removeunwantedspaces\mksomelinereference{#1}{lr:e:#1}{\mkshowstoplinereference{#1}}}
+\def\page_lines_reference_start#1{\page_lines_some_reference{#1}{lr:b:#1}{\page_lines_reference_show_start{#1}}\ignorespaces}
+\def\page_lines_reference_stop #1{\removeunwantedspaces\page_lines_some_reference{#1}{lr:e:#1}{\page_lines_reference_show_stop{#1}}}
 
 % eventually we will do this in lua
 
 \def\currentreferencelinenumber{\ctxcommand{filterreference("linenumber")}}
 
-\def\doifelsesamelinereference#1#2#3%
+\let\m_page_lines_from\empty
+\let\m_page_lines_to  \empty
+
+\unexpanded\def\doifelsesamelinereference#1#2#3%
   {\doifreferencefoundelse{lr:b:#1}
-     {\edef\fline{\currentreferencelinenumber}%
+     {\edef\m_page_lines_from{\currentreferencelinenumber}%
       \doifreferencefoundelse{lr:e:#1}
-        {\edef\tline{\currentreferencelinenumber}%
-         %[\fline,\tline]
-         \ifx\fline\tline#2\else#3\fi}
+        {\edef\m_page_lines_to{\currentreferencelinenumber}%
+         %[\m_page_lines_from,\m_page_lines_to]
+         \ifx\m_page_lines_from\m_page_lines_to#2\else#3\fi}
         {#2}}
      {#2}}
 
-\def\inline#1[#2]%
+\unexpanded\def\inline#1[#2]%
   {\doifelsenothing{#1}
      {\doifelsesamelinereference{#2}
         {\in{\leftlabeltext\v!line}{\rightlabeltext\v!line}[lr:b:#2]}
@@ -536,7 +505,7 @@
         {\in{#1}[lr:b:#2]}
         {\in{#1}[lr:b:#2]--\in[lr:e:#2]}}}
 
-\def\inlinerange[#1]%
+\unexpanded\def\inlinerange[#1]%
   {\doifelsesamelinereference{#1}
      {\in[lr:b:#1]}
      {\in[lr:b:#1]--\in[lr:e:#1]}}
diff --git a/tex/context/base/page-mbk.mkvi b/tex/context/base/page-mbk.mkvi
index eb8061bf3..9e3e57193 100644
--- a/tex/context/base/page-mbk.mkvi
+++ b/tex/context/base/page-mbk.mkvi
@@ -220,9 +220,9 @@
       \box\floatbox
       \filbreak}%
    \ifdim\ht\b_page_margin_blocks>\textheight
-   % \dosavefloatinfo % no saving done anyway
+   % page_floats_report_saved % no saving done anyway
    \else
-     \doinsertfloatinfo
+     \page_floats_report_total
    \fi}
 
 \def\page_margin_blocks_process_float_nop
diff --git a/tex/context/base/page-mis.lua b/tex/context/base/page-mis.lua
deleted file mode 100644
index 20ed23b50..000000000
--- a/tex/context/base/page-mis.lua
+++ /dev/null
@@ -1,78 +0,0 @@
-if not modules then modules = { } end modules ['page-mis'] = {
-    version   = 1.001,
-    comment   = "companion to page-mis.mkiv",
-    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
-    copyright = "PRAGMA ADE / ConTeXt Development Team",
-    license   = "see context related readme files"
-}
-
--- todo: adapt message
-
-local format, validstring = string.format, string.valid
-local sortedkeys = table.sortedkeys
-
-local cache = { }
-
-local function flush(page)
-    local c = cache[page]
-    if c then
-        for i=1,#c do
-            context.viafile(c[i],format("page.%s",validstring(page,"nopage")))
-        end
-        cache[page] = nil
-    end
-end
-
-local function setnextpage()
-    local n = next(cache) and sortedkeys(cache)[1]
-    if not n then
-        n = 0           -- nothing in the cache
-    elseif n == 0 then
-        n = -1          -- generic buffer (0)
-    elseif n > 0 then
-                        -- upcoming page (realpageno)
-    end
-    tex.setcount("global","c_page_postponed_blocks_next_page",n)
-end
-
-function commands.flushpostponedblocks(page)
-    -- we need to flush previously pending pages as well and the zero
-    -- slot is the generic one so that one is always flushed
-    local t = sortedkeys(cache)
-    local p = tonumber(page) or tex.count.realpageno or 0
-    for i=1,#t do
-        local ti = t[i]
-        if ti <= p then
-            flush(ti)
-        else
-            break
-        end
-    end
-    setnextpage()
-end
-
-function commands.registerpostponedblock(page)
-    if type(page) == "string" then
-        if string.find(page,"^+") then
-            page = tex.count.realpageno + (tonumber(page) or 1) -- future delta page
-        else
-            page = tonumber(page) or 0 -- preferred page or otherwise first possible occasion
-        end
-    end
-    if not page then
-        page = 0
-    end
-    local c = cache[page]
-    if not c then
-        c = { }
-        cache[page] = c
-    end
-    c[#c+1] = buffers.raw("postponedblock")
-    buffers.erase("postponedblock")
-    if page == 0 then
-        interfaces.showmessage("layouts",3,#c)
-    else
-        interfaces.showmessage("layouts",3,string.format("%s (realpage: %s)",#c,page))
-    end
-    setnextpage()
-end
diff --git a/tex/context/base/page-mis.mkiv b/tex/context/base/page-mis.mkiv
deleted file mode 100644
index 6137bb462..000000000
--- a/tex/context/base/page-mis.mkiv
+++ /dev/null
@@ -1,95 +0,0 @@
-%D \module
-%D   [       file=page-mis,
-%D        version=2008.11.17, % was part of page-flt.tex / 2000.10.20
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Misc Float Things,
-%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 Page Macros / Misc Float Things}
-
-\registerctxluafile{page-mis}{1.001}
-
-\unprotect
-
-% postponing
-
-\newevery\everytopofpage\relax
-
-\appendtoks   \the\everytopofpage          \to\everystarttext
-\appendtoks\global\everytopofpage\emptytoks\to\everystoptext
-
-% \startpostponing [pagenumber] [+pageoffset]
-%
-% \startpostponing[2]
-%   PAGE 2 \blank
-% \stoppostponing
-%
-% \startpostponing[+1]
-%   PAGE +1 \blank
-% \stoppostponing
-%
-% \startpostponing[+2]
-%   PAGE +2 \blank
-% \stoppostponing
-%
-% \starttext \dorecurse{4}{\input tufte \page} \stoptext
-
-%D There is no real need to use \LUA\ here but the bookkeeping
-%D is somewhat easier and we also can erase buffers easier when
-%D we keep a local cache, especially as we can flush per page.
-
-\newif   \ifinpostponing                    % prevents nesting
-\newcount\c_page_postponed_blocks_next_page % set at the lua end
-
-\unexpanded\setvalue{\e!start\v!postponing}%
-  {\bgroup
-   \obeylines
-   \doifnextoptionalelse{\egroup\page_postponed_blocks_start}{\egroup\page_postponed_blocks_start[0]}}
-
-\unexpanded\setvalue{\e!stop\v!postponing}%
-  {\ctxcommand{registerpostponedblock("\currentpostponedpage")}\relax}
-
-\def\page_postponed_blocks_start[#1]%
-  {\edef\currentpostponedpage{#1}%
-   \grabbufferdatadirect{postponedblock}{\e!start\v!postponing}{\e!stop\v!postponing}}
-
-% officially we should flush again after a flush as there can be new future pages
-% but that will be looked into when we run into it
-
-\unexpanded\def\page_postponed_blocks_flush_indeed
-  {\begingroup
-   \setsystemmode\v!postponing
-   \inpostponingtrue                  % for old times sake
-   \global\pagetotal\zeropoint        % here? still needed? (was after flush pagefloats)
-   \the\everytopofpage\relax
-  %\flushrestfloats
-   \doflushpagefloats
-   \setnormalcatcodes                 % postponing in verbatim
-   \restoreglobalbodyfont             % otherwise problems inside split verbatim
-   \ctxcommand{flushpostponedblocks()}%
-   \relax
-   \page_otr_command_flush_floats     % new but potential dangerous, maybe we need a classification
-   \endgroup}                         % of blocks: with and without flush
-
-\def\page_postponed_blocks_flush
-  {\ifinpostponing
-     % probably a nested flush
-   \else\ifnum\c_page_postponed_blocks_next_page=\zerocount
-     % nothing in cache
-   \else\ifnum\c_page_postponed_blocks_next_page<\zerocount
-     % generic cache
-     \page_postponed_blocks_flush_indeed
-   \else\ifnum\c_page_postponed_blocks_next_page>\realpageno
-     % future content
-   \else
-     % pending content
-     \page_postponed_blocks_flush_indeed
-   \fi\fi\fi\fi}
-
-\protect \endinput
diff --git a/tex/context/base/page-mul.mkiv b/tex/context/base/page-mul.mkiv
index 3792f06ee..e22ecd0a3 100644
--- a/tex/context/base/page-mul.mkiv
+++ b/tex/context/base/page-mul.mkiv
@@ -11,9 +11,8 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-% SEE PAGE-MUL-NEW.MKIV
-
-% BEWARE: TEMPORARY ISSUES WITH VSIZE AND HSIZE BUT WILL BE REDONE
+% !!! there are some issues with hsize an vsize as well as flushing
+% !!! floats but this module will be redone anyway
 
 \writestatus{loading}{ConTeXt Page Macros / Simple Multi Column}
 
@@ -304,7 +303,7 @@
   %\setcolumntextheight\relax
    \widowpenalty\zerocount % is gewoon beter
    \clubpenalty \zerocount % zeker bij grids
-   \dopushcolumnfloats
+   \page_floats_column_push_saved
    \dimen0\dimexpr\pagetotal+\parskip+\openlineheight\relax
    \ifdim\dimen0<\pagegoal
      \allowbreak
@@ -389,7 +388,7 @@
    \synchronizeoutput % new may 2004 / we need to: \pagegoal\vsize
    \checkendcolumnfootnotes
    \dosomebreak\allowbreak
-   \dopopcolumnfloats}
+   \page_floats_column_pop_saved}
 
 %D Because some initializations happen three times, we defined a macro for
 %D them. Erasing \type{\everypar} is needed because we don't want anything
@@ -1084,21 +1083,24 @@
 %D
 %D When all those floats are flushed, we switch to the local flushing routine.
 
-\def\dopushcolumnfloats
-  {\ifsomefloatwaiting
-     \showmessage\m!columns6{\the\savednoffloats}%
-     \global\setbox\savedfloatlist\box\floatlist
-     \xdef\dopopcolumnfloats
-       {\global\savednoffloats\the\savednoffloats
-        \global\setbox\floatlist\box\savedfloatlist
-        \global\noexpand\somefloatwaitingtrue}%
-     \global\savednoffloats\zerocount
-     \global\somefloatwaitingfalse
-   \else
-     \global\let\dopopcolumnfloats\relax
-   \fi}
-
-\let\dopopcolumnfloats\relax
+% \newbox  \floatlist
+% \newbox  \savedfloatlist
+%
+% \def\page_floats_column_push_saved
+%   {\ifconditional\c_page_floats_some_waiting
+%      \showmessage\m!columns6{\the\savednoffloats}%
+%      \global\setbox\savedfloatlist\box\floatlist
+%      \xdef\page_floats_column_pop_saved
+%        {\global\savednoffloats\the\savednoffloats
+%         \global\setbox\floatlist\box\savedfloatlist
+%         \global\noexpand\settrue\c_page_floats_some_waiting}%
+%      \global\savednoffloats\zerocount
+%      \global\setfalse\c_page_floats_some_waiting
+%    \else
+%      \global\let\page_floats_column_pop_saved\relax
+%    \fi}
+%
+% \let\page_floats_column_pop_saved\relax
 
 % \def\setcolumnfloats % messy as it adapts everypar
 %   {\xdef\globalsavednoffloats{\the\savednoffloats}%
@@ -1212,25 +1214,25 @@
 
 \def\docolumnroomfloat
   {\ifpostponecolumnfloats
-     \global\roomforfloatfalse
-   \else\ifnofloatpermitted
-     \global\roomforfloatfalse
+     \global\setfalse\c_page_floats_room
+   \else\ifconditional\c_page_floats_not_permitted
+     \global\setfalse\c_page_floats_room
    \else
      \bgroup
      \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
-     \dofloatsgetinfo\s!text
+     \page_floats_get_info\s!text
      \setbox\scratchbox\vbox % tricky met objecten ?
        {\blank[\rootfloatparameter\c!spacebefore]
         \snaptogrid\vbox{\vskip\floatheight}}% copy?
      \advance\dimen0\dimexpr\ht\scratchbox+2\openlineheight+.5\lineheight\relax\relax % needed because goal a bit higher
      \ifdim\dimen0>\dimen2
-       \global\roomforfloatfalse
+       \global\setfalse\c_page_floats_room
      \else
-       \global\roomforfloattrue
+       \global\settrue\c_page_floats_room
      \fi
      \ifdim\floatwidth>\hsize
        \showmessage\m!columns{11}\empty
-       \global\roomforfloatfalse
+       \global\setfalse\c_page_floats_room
      \fi
      \egroup
    \fi\fi}
@@ -1241,7 +1243,7 @@
 \newif\ifflushingcolumnfloats \flushingcolumnfloatstrue
 
 \def\doflushcolumnfloat
-  {\ifpostponecolumnfloats\else\ifflushingcolumnfloats\ifsomefloatwaiting
+  {\ifpostponecolumnfloats\else\ifflushingcolumnfloats\ifconditional\c_page_floats_some_waiting
      \doflushcolumnfloatindeed
    \fi\fi\fi}
 
@@ -1251,7 +1253,7 @@
    \let\doflushcolumnfloat\relax
    \getcolumnstatus\column\mofcolumns\total\dimen0\goal\dimen2\\%
    \ifdim\dimen0>\zeropoint
-     \dofloatsgetinfo\s!text
+     \page_floats_get_info\s!text
      \ifdim\floatwidth>\hsize
         % dropped ?
      \else
@@ -1263,7 +1265,7 @@
          \ifnum\mofcolumns<\nofcolumns
            \advance\mofcolumns \plusone
            \ifdim\ht\currenttopcolumnbox=\zeropoint
-             \dofloatsflush\s!text{1}%
+             \page_floats_flush\s!text\plusone
              \global\setbox\currenttopcolumnbox\vbox
                {\snaptogrid\vbox{\box\floatbox}
                 \whitespace % nodig ?
@@ -1287,7 +1289,7 @@
            \blank[\rootfloatparameter\c!spacebefore]
            \nobreak
          \fi
-         \dofloatsflush\s!text{1}%
+         \page_floats_flush\s!text\plusone
          \page_otr_command_flush_float_box
          \blank[\rootfloatparameter\c!spaceafter]
        \fi
@@ -1312,7 +1314,7 @@
   {\ifpostponecolumnfloats\else
      \bgroup
      \forgetall
-     \ifsomefloatwaiting
+     \ifconditional\c_page_floats_some_waiting
        \dimen8\zeropoint
        \dimen4\zeropoint
        \count0\zerocount   % count0 can be used local
@@ -1326,7 +1328,7 @@
                   \whitespace % nodig ?
                   \blank[\rootfloatparameter\c!spaceafter]}%
           \else
-            \dofloatsgetinfo\s!text
+            \page_floats_get_info\s!text
             \ifdim\floatwidth>\hsize
               \dimen0\dimexpr\floatwidth+\intercolumnwidth+.5pt\relax
               \dimen2\dimexpr\hsize     +\intercolumnwidth+.5pt\relax
@@ -1337,7 +1339,7 @@
                 \count0\zerocount
               \else
                 \dimen0\dimexpr\count0\hsize+\count0\intercolumnwidth-\intercolumnwidth\relax
-                \dofloatsflush\s!text{1}%
+                \page_floats_flush\s!text\plusone
                 \ifdim\floatwidth>\finalcolumntextwidth % better somewhere else too
                   \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}%
                 \fi % otherwise the graphic may disappear
@@ -1350,7 +1352,7 @@
               \fi
               \showmessage\m!columns{13}\empty
             \else
-              \dofloatsflush\s!text{1}%
+              \page_floats_flush\s!text\plusone
               \ifdim\floatwidth>\finalcolumntextwidth % better somewhere else too
                 \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}%
               \fi % otherwise the graphic may disappear
@@ -1386,11 +1388,11 @@
 
 \def\insertcolumnfloats
   {\doloop
-     {\ifsomefloatwaiting
+     {\ifconditional\c_page_floats_some_waiting
         \bgroup
         \forgetall
         % no check for width
-        \dogetfloat
+        \page_floats_get
         \blank[\rootfloatparameter\c!spacebefore]
         \snaptogrid\vbox{\copy\floatbox}
         \blank[\rootfloatparameter\c!spaceafter]
diff --git a/tex/context/base/page-not.mkiv b/tex/context/base/page-not.mkiv
index 06e2f3875..ddc9b1522 100644
--- a/tex/context/base/page-not.mkiv
+++ b/tex/context/base/page-not.mkiv
@@ -13,12 +13,12 @@
 
 \writestatus{loading}{ConTeXt Page Macros / Footnotes}
 
-%D Terrible hacks: we need to share save/restore
+%D This is an old mechanism that will be replaced as soon as the multicolumn
+%D code is redone.
 
-%D We've moved some footnote handling to a separate page
-%D module. The macros below are used in the single and multi
-%D column page handlers and permit mixed usage of column and
-%D page notes.
+%D We've moved some footnote handling to a separate page module. The macros below
+%D are used in the single and multi column page handlers and permit mixed usage of
+%D column and page notes.
 
 \unprotect
 
diff --git a/tex/context/base/page-one.mkiv b/tex/context/base/page-one.mkiv
index 89fd7d4a8..025a9aa1a 100644
--- a/tex/context/base/page-one.mkiv
+++ b/tex/context/base/page-one.mkiv
@@ -210,7 +210,7 @@
 
 \unexpanded\def\page_one_command_set_top_insertions
   {\bgroup
-   \ifsomefloatwaiting
+   \ifconditional\c_page_floats_some_waiting
      \noffloatinserts\zerocount
      \let\totaltopinserted\!!zeropoint
      \page_one_command_set_top_insertions_indeed
@@ -229,23 +229,23 @@
 
 \def\page_one_command_set_top_insertions_indeed
   {\ifnum\noffloatinserts<\noftopfloats
-     \dogetfloat
+     \page_floats_get
      \page_one_prepare_top_float
      \ifdim\topinserted<\textheight\relax
        \xdef\totaltopinserted{\the\topinserted}%
        \page_one_insert_top_float
-       \ifsomefloatwaiting
+       \ifconditional\c_page_floats_some_waiting
          \advance\noffloatinserts \plusone
        \else
          \noffloatinserts\noftopfloats\relax
        \fi
-       \dofloatflushedinfo
+       \page_floats_report_flushed
      \else
-       \doresavefloat
+       \page_floats_resave\s!text
        \noffloatinserts\noftopfloats\relax
      \fi
    \else
-     \ifsomefloatwaiting
+     \ifcoditional\c_page_floats_some_waiting
        \showmessage\m!floatblocks6{\the\noftopfloats}%
      \fi
      \let\page_one_command_set_top_insertions_indeed\relax
@@ -254,7 +254,7 @@
 
 \unexpanded\def\page_one_command_set_bottom_insertions
   {\bgroup
-   \ifsomefloatwaiting
+   \ifconditional\c_page_floats_some_waiting
      \noffloatinserts\zerocount
      \page_one_command_set_bottom_insertions_indeed
    \fi
@@ -262,7 +262,7 @@
 
 \def\page_one_command_set_bottom_insertions_indeed
   {\ifnum\noffloatinserts<\nofbotfloats\relax
-     \dogetfloat
+     \page_floats_get
      \global\advance\botinserted \ht\floatbox\relax
      \global\advance\botinserted \dp\floatbox\relax
      \global\advance\botinserted \floattopskip\relax
@@ -271,19 +271,19 @@
          {\forgetall
           \blank[\rootfloatparameter\c!spacebefore]%
           \page_otr_command_flush_float_box}%
-       \ifsomefloatwaiting
+       \ifconditional\c_page_floats_some_waiting
          \advance\noffloatinserts \plusone
        \else
          \noffloatinserts\nofbotfloats
        \fi
-       \dofloatflushedinfo
+       \page_floats_report_flushed
      \else
-       \doresavefloat
+       \page_floats_resave\s!text
        \noffloatinserts\nofbotfloats\relax
      \fi
-     \global\nofloatpermittedtrue % vgl topfloats s!
+     \global\settrue\c_page_floats_not_permitted % vgl topfloats s!
    \else
-     \ifsomefloatwaiting
+     \ifconditional\c_page_floats_some_waiting
        \showmessage\m!floatblocks7{\the\nofbotfloats}%
      \fi
      \let\page_one_command_set_bottom_insertions_indeed\relax
@@ -324,31 +324,31 @@
      \fi
    \fi
    \global\botinserted\zeropoint
-   \global\nofloatpermittedfalse}
+   \global\setfalse\c_page_floats_not_permitted}
 
 \unexpanded\def\page_one_command_flush_floats
-  {\global\flushingfloatstrue
-   \ifsomefloatwaiting
+  {\global\settrue\c_page_floats_flushing
+   \ifconditional\c_page_floats_some_waiting
      \par
      % if kept, then option and definitely off in gridmode ! ! ! !
      % \ifvmode \prevdepth\maxdimen \fi % prevents whitespace; problematic in icare tests
      \page_one_command_flush_floats_indeed
    \fi
    \global\savednoffloats\zerocount
-   \global\somefloatwaitingfalse
-   \global\flushingfloatsfalse}
+   \global\setfalse\c_page_floats_some_waiting
+   \global\setfalse\c_page_floats_flushing}
 
 \unexpanded\def\page_one_command_flush_float_box
-  {\ifcenterfloatbox \ifdim\wd\floatbox<\hsize
+  {\ifconditional\c_page_floats_center_box \ifdim\wd\floatbox<\hsize
      \global\setbox\floatbox\hbox to \hsize{\hss\box\floatbox\hss}%
    \fi \fi
    \snaptogrid\hbox{\iftestfloatbox\ruledhbox\fi{\box\floatbox}}} % was copy
 
 \def\page_one_command_flush_floats_indeed % much in common with OTRSET
-  {\ifsomefloatwaiting
-     \ifpackflushedfloats
-       \centerfloatboxfalse % not needed as we do call directly
-       \dofloatscollect\s!text{\hsize}{1em}%
+  {\ifconditional\c_page_floats_some_waiting
+     \ifconditional\c_page_floats_pack_flushed
+       \setfalse\c_page_floats_center_box % not needed as we do call directly
+       \page_floats_collect\s!text\hsize\emwidth
        %% no longer (interferes with footnotes):
        %%
        %% \page_one_command_set_vsize % test 2011.06.24.001
@@ -357,9 +357,9 @@
          {\hfil
           \dorecurse\nofcollectedfloats
             {\ifcase\columndirection % nog document wide
-               \dofloatsflush\s!text{1}%
+               \page_floats_flush\s!text\plusone
              \else
-               \dofloatsflush\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}%
+               \page_floats_flush\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}%
              \fi
              \ifdim\wd\floatbox>\makeupwidth % \hsize
                \hbox to \makeupwidth{\hss\box\floatbox\hss}%
@@ -371,7 +371,7 @@
              \fi}%
           \hfil}%
      \else
-       \dogetfloat
+       \page_floats_get
      \fi
      % there is a chance that due to rounding errors, the float
      % fits on a page where it was first rejected, in which case
@@ -394,8 +394,8 @@
    \fi}
 
 \unexpanded\def\page_one_command_check_if_float_fits
-  {\ifnofloatpermitted
-     \global\roomforfloatfalse
+  {\ifconditional\c_page_floats_not_permitted
+     \global\setfalse\c_page_floats_room
    \else
      % new per 31/5/2004, should be an option, only one column mode
      \begingroup
@@ -419,19 +419,19 @@
      \fi
      \relax % really needed ! ! ! !
      \ifdim\dimen0>\dimen2
-       \global\roomforfloatfalse
+       \global\setfalse\c_page_floats_room
      \else
-       \global\roomforfloattrue
+       \global\settrue\c_page_floats_room
      \fi
    \fi}
 
 \unexpanded\def\page_one_command_flush_saved_floats
   {\global\topinserted\zeropoint
    \global\botinserted\zeropoint
-   \ifflushingfloats \else
+   \ifconditional\c_page_floats_flushing \else
      \page_one_command_set_top_insertions
      \page_one_command_set_bottom_insertions
-     \ifsomefloatwaiting
+     \ifconditional\c_page_floats_some_waiting
         \doif{\rootfloatparameter\c!cache}\v!no\page_one_command_flush_floats % could be _otr_
      \else\ifconditional\c_page_margin_blocks_present
        \page_one_command_flush_floats
@@ -443,7 +443,7 @@
      \baselinecorrection
    %\fi
    \doplacefloatbox
-   \doinsertfloatinfo
+   \page_floats_report_total
    \dohandlenextfloatindent}
 
 \def\page_one_place_float_force
@@ -469,10 +469,10 @@
 %def\page_one_place_float_margin     {\page_one_place_float_side_indeed\page_sides_process_float_margin\nonoindentation} % wil be overloaded
 \def\page_one_place_float_margin     {\page_margin_blocks_process_float}
 
-\def\page_one_place_float_page       {\dofloatssavepagefloat     \s!page     \floatlocationmethod}
-\def\page_one_place_float_leftpage   {\dofloatssavepagefloat     \s!leftpage \floatlocationmethod}
-\def\page_one_place_float_rightpage  {\dofloatssavepagefloat     \s!rightpage\floatlocationmethod}
-\def\page_one_place_float_somewhere  {\dofloatssavesomewherefloat\s!somewhere\floatlocationmethod}
+\def\page_one_place_float_page       {\page_floats_save_page_float     \s!page     \floatlocationmethod}
+\def\page_one_place_float_leftpage   {\page_floats_save_page_float     \s!leftpage \floatlocationmethod}
+\def\page_one_place_float_rightpage  {\page_floats_save_page_float     \s!rightpage\floatlocationmethod}
+\def\page_one_place_float_somewhere  {\page_floats_save_somewhere_float\s!somewhere\floatlocationmethod}
 
 \def\page_one_place_float_here       {\page_one_place_float_otherwise_here}
 \def\page_one_place_float_auto       {\page_one_place_float_otherwise}
@@ -488,38 +488,41 @@
   {\doifinsetelse\v!always\floatlocationmethod
      {\page[\v!preference]%
       \page_otr_command_check_if_float_fits
-      \ifroomforfloat
+      \ifconditional\c_page_floats_room
         \page_one_place_float_here_indeed
       \else
         \showmessage\m!floatblocks9\empty
-        \doreversesavefloat
+        \page_floats_resave\s!text
       \fi}
-     {\ifsomefloatwaiting
-        \dosavefloat
+     {\ifconditional\c_page_floats_some_waiting
+        \page_floats_save\s!text
+        \nonoindentation
       \else
         \page[\v!preference]%
         \page_otr_command_check_if_float_fits
-        \ifroomforfloat
+        \ifconditional\c_page_floats_room
           \page_one_place_float_here_indeed
         \else
-          \dosavefloat
+          \page_floats_save\s!text
+          \nonoindentation
         \fi
       \fi}}
 
 \def\page_one_place_float_otherwise_else
   {\doifinsetelse\v!always\floatlocationmethod
      {\page_otr_command_check_if_float_fits
-      \ifroomforfloat
+      \ifconditional\c_page_floats_room
         \page_one_place_float_auto_top_bottom
       \else
         \showmessage\m!floatblocks9\empty
-        \doreversesavefloat
+        \page_floats_resave\s!text
       \fi}
      {\page_otr_command_check_if_float_fits
-      \ifroomforfloat
+      \ifconditional\c_page_floats_room
         \page_one_place_float_auto_top_bottom
       \else
-        \dosavefloat
+        \page_floats_save\s!text
+        \nonoindentation
       \fi}}
 
 \def\floatautofactor{.5}
@@ -544,7 +547,7 @@
 \def\page_one_place_float_top_indeed % maybe remember last beforeskip
   {\page_one_prepare_top_float
    \page_one_insert_top_float
-   \doinsertfloatinfo}
+   \page_floats_report_total}
 
 \def\page_one_place_float_bottom_indeed
   {\global\advance\botinserted\dimexpr\ht\floatbox+\dp\floatbox+\floattopskip\relax
@@ -552,15 +555,15 @@
      {\forgetall
       \blank[\rootfloatparameter\c!spacebefore]%
       \page_otr_command_flush_float_box}%
-   %\global\nofloatpermittedtrue
-   \doinsertfloatinfo}
+   %\global\settrue\c_page_floats_not_permitted
+   \page_floats_report_total}
 
 \def\page_one_place_float_face % links, rechts, midden, hoog, midden, laag
   {%\checkwaitingfloats{#1}%
    \startopposite
    \page_otr_command_flush_float_box
    \stopopposite
-  }%\doinsertfloatinfo}
+  }%\page_floats_report_total}
 
 \unexpanded\def\page_one_command_flush_side_floats
   {\page_sides_flush_floats}
diff --git a/tex/context/base/page-plg.mkiv b/tex/context/base/page-plg.mkiv
index 004b9204d..ec61da1d2 100644
--- a/tex/context/base/page-plg.mkiv
+++ b/tex/context/base/page-plg.mkiv
@@ -11,10 +11,11 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-% \ifx\pageareabox\undefined \else \endinput \fi
-
 \writestatus{loading}{ConTeXt Page Macros / Extra Page Building}
 
+%D This still needs some work, especially the dimensions need to be
+%D checked cq.\ optimized. Beware: method has become alternative!
+
 %D This feature has been present for a while but has never been
 %D exploited: pluggable pagebuilders. The next example code
 %D demonstrates the application of one such a plug-in. This variant
@@ -31,6 +32,8 @@
 %D \startpagelayout[leftpage]
 %D   \setupTABLE[offset=overlay]
 %D   \setupTABLE[c][1][width=\leftmarginwidth]
+%D   \setupTABLE[c][2][width=\textwidth]
+%D   \setupTABLE[c][3][width=\rightmarginwidth]
 %D   \bTABLE
 %D     \bTR
 %D       \bTD[nx=3,background=color,backgroundcolor=green]
@@ -43,7 +46,7 @@
 %D     \eTR
 %D     \bTR
 %D       \bTD[nx=3,offset=overlay]
-%D         {\bTABLE[width=.5\hsize]
+%D         {\bTABLE
 %D            \bTR
 %D              \bTD \pagearea[footer][text][left] \eTD
 %D              \bTD \pagearea[bottom][text][left] \eTD
@@ -56,7 +59,9 @@
 %D
 %D \startpagelayout[rightpage]
 %D   \setupTABLE[offset=overlay]
-%D   \setupTABLE[c][1][width=\rightmarginwidth]
+%D   \setupTABLE[c][1][width=\leftmarginwidth]
+%D   \setupTABLE[c][2][width=\textwidth]
+%D   \setupTABLE[c][3][width=\rightmarginwidth]
 %D   \bTABLE
 %D     \bTR
 %D       \bTD[nx=3] \pagearea[header][text][middle] \eTD
@@ -67,7 +72,7 @@
 %D     \eTR
 %D     \bTR
 %D       \bTD[nx=3,offset=overlay]
-%D         {\bTABLE[width=.5\hsize]
+%D         {\bTABLE
 %D            \bTR
 %D              \bTD \pagearea[bottom][text][right] \eTD
 %D              \bTD \pagearea[footer][text][right] \eTD
@@ -80,12 +85,9 @@
 %D
 %D \setupcolors[state=start]
 %D
-%D \setupbackgrounds[text][background=color,backgroundcolor=blue]
-%D \setupbackgrounds[header][text][background=color,backgroundcolor=red]
-%D
 %D \setuppagenumbering[alternative=doublesided,location=]
 %D
-%D \setuplayout[method=makeup]
+%D \setuplayout[alternative=makeup]
 %D
 %D \definetextbackground
 %D   [test]
@@ -110,6 +112,8 @@
 
 \unprotect
 
+\installcorenamespace{layoutmakeupalternative}
+
 \def\page_boxes_construct_content_makeup#1#2#3% targetbox flusher box
   {\setbox#1\hbox
      {\vbox to \textheight
@@ -125,65 +129,76 @@
    \dp#1\zeropoint
    \hsize\paperwidth
    \vsize\paperheight
-   \setbox#1\vbox{\csname\??layoutmethod\doifbothsidesoverruled\v!page\v!rightpage\v!leftpage\endcsname}%
+   \setbox#1\vbox{\csname\??layoutmakeupalternative\doifbothsidesoverruled\v!page\v!rightpage\v!leftpage\endcsname}%
    \wd#1\paperwidth
    \ht#1\paperheight
    \dp#1\zeropoint}
 
 \installlayoutalternative\v!makeup{\page_boxes_construct_content_makeup}
 
-\newbox\pageareabox
+\newbox\b_page_area
 
 \unexpanded\def\pagearea
   {\dotripleempty\page_area}
 
-\def\page_area[#1][#2][#3]%
+\def\page_area
   {\ifthirdargument
-     \doifelse{#3}\v!left
-       {\page_area_indeed{#1}{#2}\c!lefttext}
-       {\doifelse{#3}\v!right
-          {\page_area_indeed{#1}{#2}\c!righttext}
-          {\page_area_indeed{#1}{#2}\c!middletext}}%
+     \expandafter\page_area_three
    \else\ifsecondargument
-     \doifbothsidesoverruled
-       {\page_area_indeed{#1}{#2}\c!righttext}
-       {\page_area_indeed{#1}{#2}\c!righttext}
-       {\page_area_indeed{#1}{#2}\c!lefttext }%
+     \doubleexpandafter\page_area_two
    \else
-     \doif{#1}\v!text % copy due to trial runs in TABLE
-       {\iftrialtypesetting
-%           \copy\pagebox
-          \fakebox\pagebox
-        \else
-%           \localpositioningfalse
-          \page_backgrounds_add_to_text\pagebox
-          \page_grids_add_to_box\pagebox
-          \box\pagebox
-        \fi}%
+     \doubleexpandafter\page_area_one
    \fi\fi}
 
+\def\page_area_three[#1][#2][#3]%
+  {\edef\m_page_area_three{#3}%
+   \ifx\m_page_area_three\v!left
+     \let\m_page_area_three\c!lefttext
+   \else\ifx\m_page_area_three\v!right
+     \let\m_page_area_three\c!righttext
+   \else
+     \let\m_page_area_three\c!middletext
+   \fi\fi
+   \page_area_indeed{#1}{#2}\m_page_area_three}
+
+\def\page_area_two[#1][#2][#3]%
+  {\edef\m_page_area_three{\doifbothsidesoverruled\c!righttext\c!righttext\c!lefttext}%
+   \page_area_indeed{#1}{#2}\m_page_area_three}
+
+\def\page_area_one[#1][#2][#3]%
+  {\edef\m_page_area_one{#1}
+   \ifx\m_page_area_one\v!text % copy due to trial runs in TABLE
+     \iftrialtypesetting
+       \fakebox\pagebox
+     \else
+       \page_backgrounds_add_to_text\pagebox
+       \page_grids_add_to_box\pagebox
+       \box\pagebox
+     \fi
+   \fi}
+
 \def\page_area_indeed#1#2#3%
-  {\setbox\pageareabox\vbox{\getspecificlayouttext{#1}{#2}{#3}}%
+  {\setbox\b_page_area\vbox{\getspecificlayouttext{#1}{#2}{#3}}%
    \ifsomebackgroundfound{#1#2}%
      \iftrialtypesetting
-%        \box\pageareabox
-       \fakebox\pageareabox
+       \fakebox\b_page_area
      \else
-       \localframed
-         [\??ma#1#2]
-         [\c!width=\wd\pageareabox,
-          \c!height=\ht\pageareabox,
+     % todo: \localbackgroundframed{\??layoutbackgrounds#1#2}{#1:#2}
+       \localframed % todo:
+         [\??layoutbackgrounds#1#2]
+         [\c!width=\wd\b_page_area,
+          \c!height=\ht\b_page_area,
           \c!offset=\v!overlay]
-         {\box\pageareabox}%
+         {\box\b_page_area}%
      \fi
    \else
-     \box\pageareabox
+     \box\b_page_area
    \fi}
 
 % to be done nicely (proper namespacing)
 
-\setvalue{\??layoutmethod\v!leftpage }{\csname\??layoutmethod\v!page\endcsname}
-\setvalue{\??layoutmethod\v!rightpage}{\csname\??layoutmethod\v!page\endcsname}
+\setvalue{\??layoutmakeupalternative\v!leftpage }{\csname\??layoutmakeupalternative\v!page\endcsname}
+\setvalue{\??layoutmakeupalternative\v!rightpage}{\csname\??layoutmakeupalternative\v!page\endcsname}
 
 \unexpanded\def\startpagelayout
   {\bgroup
@@ -194,6 +209,6 @@
 
 \def\page_layouts_start_layout[#1]#2\stoppagelayout
   {\egroup
-   \setvalue{\??layoutmethod#1}{#2}}
+   \setvalue{\??layoutmakeupalternative#1}{#2}}
 
 \protect \endinput
diff --git a/tex/context/base/page-pst.lua b/tex/context/base/page-pst.lua
new file mode 100644
index 000000000..8586830cf
--- /dev/null
+++ b/tex/context/base/page-pst.lua
@@ -0,0 +1,78 @@
+if not modules then modules = { } end modules ['page-pst'] = {
+    version   = 1.001,
+    comment   = "companion to page-pst.mkiv",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+-- todo: adapt message
+
+local format, validstring = string.format, string.valid
+local sortedkeys = table.sortedkeys
+
+local cache = { }
+
+local function flush(page)
+    local c = cache[page]
+    if c then
+        for i=1,#c do
+            context.viafile(c[i],format("page.%s",validstring(page,"nopage")))
+        end
+        cache[page] = nil
+    end
+end
+
+local function setnextpage()
+    local n = next(cache) and sortedkeys(cache)[1]
+    if not n then
+        n = 0           -- nothing in the cache
+    elseif n == 0 then
+        n = -1          -- generic buffer (0)
+    elseif n > 0 then
+                        -- upcoming page (realpageno)
+    end
+    tex.setcount("global","c_page_postponed_blocks_next_page",n)
+end
+
+function commands.flushpostponedblocks(page)
+    -- we need to flush previously pending pages as well and the zero
+    -- slot is the generic one so that one is always flushed
+    local t = sortedkeys(cache)
+    local p = tonumber(page) or tex.count.realpageno or 0
+    for i=1,#t do
+        local ti = t[i]
+        if ti <= p then
+            flush(ti)
+        else
+            break
+        end
+    end
+    setnextpage()
+end
+
+function commands.registerpostponedblock(page)
+    if type(page) == "string" then
+        if string.find(page,"^+") then
+            page = tex.count.realpageno + (tonumber(page) or 1) -- future delta page
+        else
+            page = tonumber(page) or 0 -- preferred page or otherwise first possible occasion
+        end
+    end
+    if not page then
+        page = 0
+    end
+    local c = cache[page]
+    if not c then
+        c = { }
+        cache[page] = c
+    end
+    c[#c+1] = buffers.raw("postponedblock")
+    buffers.erase("postponedblock")
+    if page == 0 then
+        interfaces.showmessage("layouts",3,#c)
+    else
+        interfaces.showmessage("layouts",3,string.format("%s (realpage: %s)",#c,page))
+    end
+    setnextpage()
+end
diff --git a/tex/context/base/page-pst.mkiv b/tex/context/base/page-pst.mkiv
new file mode 100644
index 000000000..1078dda03
--- /dev/null
+++ b/tex/context/base/page-pst.mkiv
@@ -0,0 +1,102 @@
+%D \module
+%D   [       file=page-mis,
+%D        version=2008.11.17, % was part of page-flt.tex / 2000.10.20
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Postponing,
+%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 Page Macros / Postponing}
+
+\registerctxluafile{page-pst}{1.001}
+
+\unprotect
+
+% postponing
+
+\newevery\everytopofpage\relax
+
+\appendtoks
+    \the\everytopofpage
+\to \everystarttext
+
+\appendtoks
+    \global\everytopofpage\emptytoks
+\to \everystoptext
+
+% \startpostponing [pagenumber] [+pageoffset]
+%
+% \startpostponing[2]
+%   PAGE 2 \blank
+% \stoppostponing
+%
+% \startpostponing[+1]
+%   PAGE +1 \blank
+% \stoppostponing
+%
+% \startpostponing[+2]
+%   PAGE +2 \blank
+% \stoppostponing
+%
+% \starttext \dorecurse{4}{\input tufte \page} \stoptext
+
+%D There is no real need to use \LUA\ here but the bookkeeping
+%D is somewhat easier and we also can erase buffers easier when
+%D we keep a local cache, especially as we can flush per page.
+
+%newif      \ifinpostponing                    % prevents nesting
+
+\newcount   \c_page_postponed_blocks_next_page % set at the lua end
+\newconstant\c_page_postponed_busy
+
+\unexpanded\setvalue{\e!start\v!postponing}%
+  {\bgroup
+   \obeylines
+   \doifnextoptionalelse{\egroup\page_postponed_blocks_start}{\egroup\page_postponed_blocks_start[0]}}
+
+\unexpanded\setvalue{\e!stop\v!postponing}%
+  {\ctxcommand{registerpostponedblock("\currentpostponedpage")}\relax}
+
+\def\page_postponed_blocks_start[#1]%
+  {\edef\currentpostponedpage{#1}%
+   \grabbufferdatadirect{postponedblock}{\e!start\v!postponing}{\e!stop\v!postponing}}
+
+% officially we should flush again after a flush as there can be new future pages
+% but that will be looked into when we run into it
+
+\unexpanded\def\page_postponed_blocks_flush_indeed
+  {\begingroup
+   \setsystemmode\v!postponing
+   \settrue\c_page_postponed_busy
+   \global\pagetotal\zeropoint        % here? still needed? (was after flush pagefloats)
+   \the\everytopofpage\relax
+  %\flushrestfloats
+   \page_floats_flush_page_floats
+   \setnormalcatcodes                 % postponing in verbatim
+   \restoreglobalbodyfont             % otherwise problems inside split verbatim
+   \ctxcommand{flushpostponedblocks()}%
+   \relax
+   \page_otr_command_flush_floats     % new but potential dangerous, maybe we need a classification
+   \endgroup}                         % of blocks: with and without flush
+
+\unexpanded\def\page_postponed_blocks_flush
+  {\ifconditional\c_page_postponed_busy
+     % probably a nested flush
+   \else\ifnum\c_page_postponed_blocks_next_page=\zerocount
+     % nothing in cache
+   \else\ifnum\c_page_postponed_blocks_next_page<\zerocount
+     % generic cache
+     \page_postponed_blocks_flush_indeed
+   \else\ifnum\c_page_postponed_blocks_next_page>\realpageno
+     % future content
+   \else
+     % pending content
+     \page_postponed_blocks_flush_indeed
+   \fi\fi\fi\fi}
+
+\protect \endinput
diff --git a/tex/context/base/page-sel.mkiv b/tex/context/base/page-sel.mkiv
deleted file mode 100644
index 27f094118..000000000
--- a/tex/context/base/page-sel.mkiv
+++ /dev/null
@@ -1,347 +0,0 @@
-%D \module
-%D   [       file=page-sel, % moved from page-imp
-%D        version=1998.01.15,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Page Selection,
-%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.
-
-%D This will become runtime loaded code.
-
-\writestatus{loading}{ConTeXt Page Macros / Page Selection}
-
-\unprotect
-
-%D One can (mis)use this mechanism, in close cooperation
-%D with \PDFTEX\ to arrange pages of already produced files.
-%D
-%D \starttyping
-%D \insertpages[file.pdf][1,3][n=30,width=18cm]
-%D \stoptyping
-%D
-%D The pages are inserted in the text area, and even pages
-%D are repositioned according to the width. In this example
-%D empty pages are added after page 1 and 3.
-%D
-%D Selecting pages can be accomplished by:
-%D
-%D \starttyping
-%D \filterpages[file.pdf][1,3,5][n=30,width=18cm]
-%D \stoptyping
-%D
-%D One may pass \type {odd} or \type {even} instead of a
-%D comma separated list. A third alternative is:
-%D
-%D \starttyping
-%D \copypages[file.pdf][n=30,scale=950]
-%D \stoptyping
-%D
-%D This macros inserts the page, according to the settings
-%D provided.
-
-\def\insertpages
-  {\dotripleempty\doinsertpages}
-
-\def\doinsertpages[#1][#2][#3]%
-  {\doifassignmentelse{#2}
-     {\dodoinsertpages[#1][][#2]}
-     {\dodoinsertpages[#1][#2][#3]}}
-
-\def\dodoinsertpages[#1][#2][#3]%
-  {\bgroup
-   \dontcomplain
-   \getfiguredimensions[#1]%
-   \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\zeropoint,#3]%
-   \doifinset0{#2}{\emptyhbox\page}%
-   \dorecurse\@@ipn
-     {\dofilterpage{#1}\recurselevel
-      \doifinset\recurselevel{#2}{\emptyhbox\page}}%
-   \egroup}
-
-\def\filterpages
-  {\dotripleempty\dofilterpages}
-
-\def\dofilterpages[#1][#2][#3]% % \noffigurepages not yet supported
-  {\bgroup
-   \dontcomplain
-   \getfiguredimensions[#1]%
-   \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\zeropoint,#3]%
-   \doifelse{#2}\v!even
-     {\dorecurse\@@ipn
-        {\ifodd\recurselevel\relax\else\dofilterpage{#1}\recurselevel\fi}}
-     {\doifelse{#2}\v!odd
-        {\dorecurse\@@ipn
-           {\ifodd\recurselevel\relax\dofilterpage{#1}\recurselevel\fi}}
-        {\def\dodocommand##1{\ifnum##1>\@@ipn\else\dofilterpage{#1}{##1}\fi}%
-         \def\docommand  ##1{\dowithrange{##1}\dodocommand}%
-         \processcommalist[#2]\docommand}}%
-   \egroup}
-
-\def\dofilterpage#1#2%
-  {\hbox to \textwidth
-     {\ifdoublesided\ifdim\@@ipwidth>\zeropoint\relax\ifodd\realpageno\else
-        \hfill
-        \def\dowithfigure{\hskip-\@@ipwidth}%
-      \fi\fi\fi
-      \setbox0\hbox
-        {\externalfigure[#1][\c!page=#2,\c!height=\textheight]}%
-      \wd0\zeropoint
-      \box0}
-   \page}
-
-\def\copypages
-  {\dodoubleempty\docopypages}
-
-\def\docopypages[#1][#2]%
-  {\bgroup
-   \getfiguredimensions[#1]%
-   \getparameters[\??ip]
-     [\c!n=\noffigurepages,
-      \c!marking=\v!off,
-      \c!scale=\!!thousand,
-      \c!offset=\zeropoint,
-      #2]%
-   \dorecurse\@@ipn
-     {\vbox to \textheight
-        {\hsize\textwidth
-         \scratchdimen\@@ipoffset
-         \centeredbox
-           {\doifelse\@@ipmarking\v!on\cuthbox\hbox % only place where cuthbox is used
-              {\ifdim\scratchdimen>\zeropoint\relax
-                 \advance\vsize -2\scratchdimen
-                 \advance\hsize -2\scratchdimen
-                 \externalfigure[#1][\c!page=\recurselevel,#2,\c!scale=,\c!factor=\v!max,\c!offset=\v!overlay]%
-               \else
-                 \externalfigure[#1][\c!page=\recurselevel,#2,\c!offset=\v!overlay]%
-               \fi}}}
-      \page}
-   \egroup}
-
-%D \macros
-%D   {combinepages}
-%D
-%D Yet another way of postprocessing is handles by \type
-%D {\combinepages}. This macro builds a matrix of pages from a
-%D file, for example:
-%D
-%D \starttyping
-%D \setuppapersize
-%D   [A4][A4] % or [A4,landscape][A4,landscape]
-%D
-%D \setuplayout
-%D   [header=0pt,footer=1cm,
-%D    backspace=1cm,topspace=1cm,
-%D    width=middle,height=middle]
-%D
-%D \setupfootertexts
-%D   [presentation---\currentdate\space---\space\pagenumber]
-%D
-%D \starttext
-%D   \combinepages[slides][nx=2,ny=3,frame=on]
-%D \stoptext
-%D \stoptyping
-%D
-%D One can influence the way the pages are combined. (This
-%D will be explained some time.)
-
-\def\combinepages
-  {\dodoubleempty\docombinepages}
-
-\def\docombinepages[#1][#2]% a=perpag b=free
-  {\bgroup
-   \dontcomplain
-   \getfiguredimensions[#1]%
-   \getparameters
-     [\??ip]
-     [\c!alternative=\v!a,
-      \c!n=\noffigurepages,\c!nx=2,\c!ny=2,\c!start=1,\c!stop=\!!maxcard,
-      \c!distance=\bodyfontsize,
-      \c!bottom=\vfill,\c!top=\vss,
-      \c!left=\hss,\c!right=\hss,
-      \c!before=\page,\c!after=\page,\c!inbetween=\blank,
-      \c!frame=,\c!background=,\c!backgroundcolor=,
-      #2]%
-   \def\@@ipname{#1}%
-   \@@ipbefore
-   \expandcheckedcsname{\??ip::\c!alternative:}\@@ipalternative\v!b
-   \@@ipafter
-   \egroup}
-
-\setvalue{\??ip::\c!alternative:\v!a}%
-  {\global\combinedpagescounter\@@ipstart
-   \doloop
-     {\vbox to \textheight
-        {\hsize\textwidth % ? ?
-         \scratchdimen\@@ipdistance
-         \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
-         \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax
-         \dorecurse\@@ipny
-           {\hbox to \hsize
-              {\dorecurse\@@ipnx
-                 {\vbox to \!!heighta
-                    {\hsize\!!widtha
-                     \vsize\!!heighta
-                     \@@iptop
-                     \hbox to \hsize
-                       {\@@ipleft
-                        \ifnum\combinedpagescounter>\@@ipstop\relax
-                          \globallet\@@ipn\!!zerocount
-                        \else\ifnum\combinedpagescounter>\@@ipn \else
-                          \externalfigure[\@@ipname]
-                            [\c!object=\v!no,
-                             \c!page=\number\combinedpagescounter,
-                             \c!factor=\v!max,
-                             \c!background=\@@ipbackground,
-                             \c!backgroundcolor=\@@ipbackgroundcolor,
-                             \c!frame=\@@ipframe]%
-                        \fi\fi
-                        \@@ipright}
-                     \@@ipbottom}%
-                  \global\advance\combinedpagescounter\plusone
-                  \hfil}%
-               \hfilneg}
-            \vfil}%
-         \vfilneg}%
-         \page
-         \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
-
-\setvalue{\??ip::\c!alternative:\v!c}%
-  {\global\combinedpagescounter\@@ipstart
-   \doloop
-     {\vbox to \textheight
-        {\hsize\textwidth % ? ?
-         \scratchdimen\@@ipdistance
-         \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
-         \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax
-         \hbox to \hsize
-           {\dorecurse\@@ipnx
-              {\@@ipleft
-               \vbox to \textheight
-                 {\hsize\!!widtha
-                    {\dorecurse\@@ipny
-                       {\@@iptop
-                        \hbox to \hsize
-                          {\vbox to \!!heighta
-                             {\hsize\!!widtha
-                              \vsize\!!heighta
-                              \ifnum\combinedpagescounter>\@@ipstop\relax
-                                \globallet\@@ipn\!!zerocount
-                              \else\ifnum\combinedpagescounter>\@@ipn \else
-                                \externalfigure[\@@ipname]
-                                  [\c!object=\v!no,
-                                   \c!page=\number\combinedpagescounter,
-                                   \c!factor=\v!max,
-                                   \c!background=\@@ipbackground,
-                                   \c!backgroundcolor=\@@ipbackgroundcolor,
-                                   \c!frame=\@@ipframe]%
-                              \fi\fi}}
-                         \global\advance\combinedpagescounter\plusone
-                         \@@ipbottom}%
-                      \vfil}%
-                   \vfilneg}
-                \hfil}%
-            \hfilneg}}
-         \page
-         \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
-
-\setvalue{\??ip::\c!alternative:\v!horizontal}{\getvalue{\??ip::\c!alternative:\v!a}}
-\setvalue{\??ip::\c!alternative:\v!vertical  }{\getvalue{\??ip::\c!alternative:\v!c}}
-
-\setvalue{\??ip::\c!alternative:\v!b}%
-  {\global\combinedpagescounter\@@ipstart
-   \doloop
-     {\startbaselinecorrection
-        \scratchdimen\@@ipdistance
-        \!!widtha\dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
-        \hbox to \hsize
-          {\dorecurse\@@ipnx
-             {\global\advance\combinedpagescounter\plusone
-              \ifnum\combinedpagescounter>\@@ipn \else
-                 \normalexpanded{\noexpand\externalfigure[\@@ipname]
-                   [\c!page=\number\combinedpagescounter,
-                    \c!width=\the\!!widtha,% todo \freezedimenmacro
-                    \c!background=\@@ipbackground,
-                    \c!backgroundcolor=\@@ipbackgroundcolor,
-                    \c!frame=\@@ipframe]}%
-                 \hfill
-              \fi}\hfillneg}%
-      \stopbaselinecorrection
-      \ifnum\combinedpagescounter<\@@ipn\relax
-        \@@ipinbetween
-      \else
-        \exitloop
-      \fi}}
-
-% This macro cuts a page into n parts that can be pasted
-% together.
-
-\def\slicepages
-  {\dotripleempty\doslicepages}
-
-\def\doslicepages[#1][#2][#3]%
-  {\ifthirdargument
-     \dodoslicepages[#1][#2][#3]%
-   \else
-     \dodoslicepages[#1][#2][#2]%
-   \fi}
-
-\newcounter\slicedpagenumber
-
-\def\dodoslicepages[#1][#2][#3]%
-  {\bgroup
-   \dontcomplain
-   \globallet\slicedpagenumber\!!zerocount
-   \getfiguredimensions[#1]
-   \getparameters
-     [\??ip]
-     [\c!n=1,
-      \c!offset=\zeropoint,
-      \c!hoffset=\zeropoint,\c!voffset=\zeropoint,
-      \c!width=\figurewidth,\c!height=\figureheight,#2]
-   \ifnum\@@ipn>\zerocount
-     \definepapersize
-       [\s!dummy][\c!height=\@@ipheight,\c!width=\@@ipwidth]
-     \setuppapersize
-       [\s!dummy][\s!dummy]
-     \setuplayout
-       [\c!backspace=\zeropoint,\c!topspace=\zeropoint,
-        \c!height=\v!middle,\c!width=\v!middle,
-        \c!textdistance=\zeropoint,
-        \c!header=\zeropoint,\c!footer=\zeropoint]
-   \fi
-   \dorecurse\noffigurepages
-     {\global\let\slicedpagenumber\recurselevel
-      \ifnum\@@ipn>\plusone
-        \dorecurse\@@ipn
-          {\let\xslice\recurselevel
-           \dorecurse\@@ipn
-             {\let\yslice\recurselevel
-              \clip
-                [\c!nx=\@@ipn,\c!ny=\@@ipn,\c!x=\xslice,\c!y=\yslice]
-                {\scale
-                   [\c!scale=\@@ipn000]
-                   {\externalfigure[#1][\c!page=\slicedpagenumber]}}
-              \page}}
-      \else
-        \ifodd\slicedpagenumber\relax
-          \getparameters[\??ip][#2]
-        \else
-          \getparameters[\??ip][#3]
-        \fi
-        \hskip\@@ipoffset
-        \clip
-          [\c!hoffset=\@@iphoffset,\c!voffset=\@@ipvoffset,
-           \c!height=\@@ipheight,\c!width=\@@ipwidth]
-          {\externalfigure[#1][\c!page=\slicedpagenumber]}
-        \page
-      \fi}
-   \egroup}
-
-% \starttext \slicepages[slice1.pdf][n=3] \stoptext
-
-\protect \endinput
diff --git a/tex/context/base/page-sel.mkvi b/tex/context/base/page-sel.mkvi
new file mode 100644
index 000000000..3d0771b48
--- /dev/null
+++ b/tex/context/base/page-sel.mkvi
@@ -0,0 +1,368 @@
+%D \module
+%D   [       file=page-sel, % moved from page-imp
+%D        version=1998.01.15,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Page Selection,
+%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.
+
+%D This code relates to old texexec features and one can wonder if it needs
+%D to be in the core. So, this could become runtime loaded code. Some of
+%D the alternatives need checking.
+
+\writestatus{loading}{ConTeXt Page Macros / Page Selection}
+
+\unprotect
+
+%D One can (mis)use this mechanism to (re)arrange pages of already produced
+%D files.
+%D
+%D \starttyping
+%D \insertpages[file.pdf][1,3][n=30,width=18cm]
+%D \stoptyping
+%D
+%D The pages are inserted in the text area, and even pages are repositioned
+%D according to the width. In this example empty pages are added after page
+%D 1 and 3.
+%D
+%D Selecting pages can be accomplished by:
+%D
+%D \starttyping
+%D \filterpages[file.pdf][1,3,5][n=30,width=18cm]
+%D \stoptyping
+%D
+%D One may pass \type {odd} or \type {even} instead of a comma separated list. A
+%D third alternative is:
+%D
+%D \starttyping
+%D \copypages[file.pdf][n=30,scale=950]
+%D \stoptyping
+%D
+%D This macros inserts the page, according to the settings provided.
+
+\installcorenamespace{withpages}
+
+\installsetuponlycommandhandler \??withpages {withpages}
+%  \installdirectcommandhandler \??withpages {withpages}
+
+\newcount\c_page_selectors_n
+
+\unexpanded\def\insertpages
+  {\dotripleempty\page_selectors_insert}
+
+\def\page_selectors_insert[#filename][#emptylist][#settings]%
+  {\doifassignmentelse{#emptylist}
+     {\page_selectors_insert_indeed[#filename][][#emptylist]}
+     {\page_selectors_insert_indeed[#filename][#emptylist][#settings]}}
+
+\def\page_selectors_insert_indeed[#filename][#emptylist][#settings]%
+  {\bgroup
+   \dontcomplain
+   \getfiguredimensions[#filename]%
+   \global\c_page_selectors_n\noffigurepages\relax
+   \setupcurrentwithpages[\c!width=\zeropoint,#settings]%
+   \scratchwidth\directwithpagesparameter\c!width\relax
+   \doifinset0{#emptylist}
+     {\emptyhbox\page}%
+   \dorecurse\c_page_selectors_n
+     {\page_selectors_filter_a_page{#filename}\recurselevel
+      \doifinset\recurselevel{#emptylist}
+        {\emptyhbox\page}}%
+   \egroup}
+
+\unexpanded\def\filterpages
+  {\dotripleempty\page_selectors_filter}
+
+\def\page_selectors_filter[#filename][#selection][#settings]% % \noffigurepages not yet supported
+  {\bgroup
+   \dontcomplain
+   \getfiguredimensions[#filename]%
+   \global\c_page_selectors_n\noffigurepages\relax
+   \setupcurrentwithpages[\c!width=\zeropoint,#settings]%
+   \scratchwidth\directwithpagesparameter\c!width\relax
+   \edef\p_selection{#selection}%
+   \ifx\p_selection\v!even
+     \dorecurse\c_page_selectors_n
+       {\ifodd\recurselevel\else
+          \page_selectors_filter_a_page{#filename}\recurselevel
+        \fi}%
+   \else\ifx\p_selection\v!odd
+     \dorecurse\c_page_selectors_n
+       {\ifodd\recurselevel\relax
+          \page_selectors_filter_a_page{#filename}\recurselevel
+        \fi}%
+   \else
+     \def\page_selectors_filter_step_indeed#page%
+       {\ifnum#page>\c_page_selectors_n\else
+          \page_selectors_filter_a_page{#filename}{#page}%
+        \fi}%
+     \def\page_selectors_filter_step#step%
+       {\dowithrange{#step}\page_selectors_filter_step_indeed}%
+     \processcommacommand[\p_selection]\page_selectors_filter_step
+   \fi
+   \egroup}
+
+\def\page_selectors_filter_a_page#filename#page%
+  {\hbox to \textwidth
+     {\ifdim\scratchwidth>\zeropoint
+        \rightorleftpageaction{\scratchwidth\zeropoint}{\hfill}%
+      \fi
+      \setbox\scratchbox\hbox
+        {\hskip-\scratchwidth
+         \externalfigure[#filename][\c!page=#page,\c!height=\textheight]\hss}%
+      \wd\scratchbox\zeropoint
+      \box\scratchbox}
+   \page}
+
+\unexpanded\def\copypages
+  {\dotripleempty\page_selectors_copy}
+
+\def\page_selectors_copy[#filename][#settings][#figuresettings]%
+  {\bgroup
+   \getfiguredimensions[#filename]%
+   \global\c_page_selectors_n\noffigurepages\relax
+   \setupcurrentwithpages[\c!marking=\v!off,\c!offset=\zeropoint,#settings]%
+   \scratchoffset\directwithpagesparameter\c!offset\relax
+   \dorecurse\c_page_selectors_n
+     {\vbox to \textheight
+        {\hsize\textwidth
+         \centeredbox
+           {\doifelse{\directwithpagesparameter\c!marking}\v!on\cuthbox\hbox % only place where cuthbox is used
+              {\ifdim\scratchoffset>\zeropoint\relax
+                 \advance\vsize -2\scratchoffset
+                 \advance\hsize -2\scratchoffset
+                 \externalfigure[#filename][\c!page=\recurselevel,#figuresettings,\c!scale=,\c!factor=\v!max,\c!offset=\v!overlay]%
+               \else
+                 \externalfigurefilename][\c!page=\recurselevel,#figuresettings,\c!offset=\v!overlay]%
+               \fi}}}
+      \page}
+   \egroup}
+
+%D \macros
+%D   {combinepages}
+%D
+%D Yet another way of postprocessing is handles by \type {\combinepages}. This macro
+%D builds a matrix of pages from a file, for example:
+%D
+%D \starttyping
+%D \setuppapersize
+%D   [A4][A4] % or [A4,landscape][A4,landscape]
+%D
+%D \setuplayout
+%D   [header=0pt,footer=1cm,
+%D    backspace=1cm,topspace=1cm,
+%D    width=middle,height=middle]
+%D
+%D \setupfootertexts
+%D   [presentation---\currentdate\space---\space\pagenumber]
+%D
+%D \starttext
+%D   \combinepages[slides][nx=2,ny=3,frame=on]
+%D \stoptext
+%D \stoptyping
+%D
+%D One can influence the way the pages are combined. (This will be explained some
+%D time.)
+
+\installcorenamespace{combinepagesalternative}
+
+\unexpanded\def\combinepages
+  {\dodoubleempty\page_selectors_combine}
+
+\def\page_selectors_combine[#filename][#settings]% a=perpag b=free
+  {\bgroup
+   \dontcomplain
+   \getfiguredimensions[#filename]%
+   \global\c_page_selectors_n\noffigurepages\relax
+   \setupcurrentwithpages
+     [\c!alternative=\v!a,
+      \c!nx=\plustwo,\c!ny=\plustwo,\c!start=\plusone,\c!stop=\maxcard,
+      \c!distance=\bodyfontsize,
+      \c!bottom=\vfill,\c!top=\vss,\c!left=\hss,\c!right=\hss,
+      \c!before=\page,\c!after=\page,\c!inbetween=\blank,
+      \c!frame=,\c!background=,\c!backgroundcolor=,
+      \c!name={#filename},
+      #settings]%
+   \directwithpagesparameter\c!before
+   \scratchnx\directwithpagesparameter\c!nx
+   \scratchny\directwithpagesparameter\c!ny
+   \scratchdistance\directwithpagesparameter\c!distance\relax
+   \scratchwidth\dimexpr(\textwidth-\scratchnx\scratchdistance+\scratchdistance)/\scratchnx\relax
+   \scratchheight\dimexpr(\textheight-\scratchny\scratchdistance+\scratchdistance)/\scratchny\relax
+   \expandcheckedcsname{\??combinepagesalternative}{\directwithpagesparameter\c!alternative}\v!b
+   \directwithpagesparameter\c!after
+   \egroup}
+
+\setvalue{\??combinepagesalternative\v!a}%
+  {\global\combinedpagescounter\directwithpagesparameter\c!start\relax
+   \doloop
+     {\vbox to \textheight
+        {\dorecurse\scratchny
+           {\hbox to \textwidth
+              {\dorecurse\scratchnx
+                 {\vbox to \scratchheight
+                    {\hsize\scratchwidth
+                     \vsize\scratchheight
+                     \directwithpagesparameter\c!top
+                     \hbox to \hsize
+                       {\directwithpagesparameter\c!left
+                        \ifnum\combinedpagescounter>\directwithpagesparameter\c!stop\relax
+                          \global\c_page_selectors_n\zerocount
+                        \else\ifnum\combinedpagescounter>\c_page_selectors_n \else
+                          \externalfigure
+                            [\directwithpagesparameter\c!name]
+                            [\c!object=\v!no,
+                             \c!page=\number\combinedpagescounter,
+                             \c!factor=\v!max,
+                             \c!background=\directwithpagesparameter\c!background,
+                             \c!backgroundcolor=\directwithpagesparameter\c!backgroundcolor,
+                             \c!frame=\directwithpagesparameter\c!frame]%
+                        \fi\fi
+                        \directwithpagesparameter\c!right}
+                     \directwithpagesparameter\c!bottom}%
+                  \global\advance\combinedpagescounter\plusone
+                  \hfil}%
+               \hfilneg}
+            \vfil}%
+         \vfilneg}%
+         \page
+         \ifnum\combinedpagescounter>\c_page_selectors_n
+           \exitloop
+         \fi}}
+
+\setvalue{\??combinepagesalternative\v!c}%
+  {\global\combinedpagescounter\directwithpagesparameter\c!start\relax
+   \doloop
+     {\vbox to \textheight
+        {\hbox to \textwidth
+           {\dorecurse\scratchnx
+              {\directwithpagesparameter\c!left
+               \vbox to \textheight
+                 {\hsize\scratchwidth
+                  \dorecurse\scratchny
+                    {\directwithpagesparameter\c!top
+                     \hbox to \hsize
+                       {\vbox to \scratchheight
+                          {\hsize\scratchwidth
+                           \vsize\scratchheight
+                           \ifnum\combinedpagescounter>\directwithpagesparameter\c!stop\relax
+                             \global\c_page_selectors_n\zerocount
+                           \else\ifnum\combinedpagescounter>\c_page_selectors_n \else
+                             \externalfigure
+                               [\directwithpagesparameter\c!name]
+                               [\c!object=\v!no,
+                                \c!page=\number\combinedpagescounter,
+                                \c!factor=\v!max,
+                                \c!background=\directwithpagesparameter\c!background,
+                                \c!backgroundcolor=\directwithpagesparameter\c!backgroundcolor,
+                                \c!frame=\directwithpagesparameter\c!frame]%
+                           \fi\fi}}
+                      \global\advance\combinedpagescounter\plusone
+                      \directwithpagesparameter\c!bottom}}%
+                \hfil}%
+            \hfilneg}}%
+      \page
+      \ifnum\combinedpagescounter>\c_page_selectors_n
+        \exitloop
+      \fi}}
+
+\setvalue{\??combinepagesalternative\v!horizontal}{\getvalue{\??combinepagesalternative\v!a}}
+\setvalue{\??combinepagesalternative\v!vertical  }{\getvalue{\??combinepagesalternative\v!c}}
+
+\setvalue{\??combinepagesalternative\v!b}%
+  {\global\combinedpagescounter\directwithpagesparameter\c!start\relax
+   \doloop
+     {\startbaselinecorrection
+        \hbox to \textwidth
+          {\dorecurse\scratchnx
+             {\global\advance\combinedpagescounter\plusone
+              \ifnum\combinedpagescounter>\c_page_selectors_n \else
+                 \normalexpanded{\externalfigure
+                   [\directwithpagesparameter\c!name]
+                   [\c!page=\number\combinedpagescounter,
+                    \c!width=\the\scratchwidth,
+                    \c!background=\directwithpagesparameter\c!background,
+                    \c!backgroundcolor=\directwithpagesparameter\c!backgroundcolor,
+                    \c!frame=\directwithpagesparameter\c!frame]}%
+                 \hfill
+              \fi}%
+              \hfillneg}%
+      \stopbaselinecorrection
+      \ifnum\combinedpagescounter<\c_page_selectors_n\relax
+        \directwithpagesparameter\c!inbetween
+      \else
+        \exitloop
+      \fi}}
+
+% This macro cuts a page into n parts that can be pasted together.
+
+\unexpanded\def\slicepages
+  {\dotripleempty\page_selectors_slice}
+
+\def\page_selectors_slice[#filename][#oddsettings][#evensettings]%
+  {\ifthirdargument
+     \page_selectors_slice_indeed[#filename][#oddsettings][#evensettings]%
+   \else
+     \page_selectors_slice_indeed[#filename][#oddsettings][#oddsettings]%
+   \fi}
+
+\let\slicedpagenumber\!!zerocount
+\let\slicedpagestepx \!!zerocount
+\let\slicedpagestepy \!!zerocount
+
+\def\page_selectors_slice_indeed[#filename][#oddsettings][#evensettings]%
+  {\bgroup
+   \dontcomplain
+   \global\let\slicedpagenumber\!!zerocount
+   \getfiguredimensions[#filename]%
+   \global\c_page_selectors_n\noffigurepages\relax
+   \setupcurrentwithpages
+     [\c!offset=\zeropoint,\c!hoffset=\zeropoint,\c!voffset=\zeropoint,
+      \c!width=\figurewidth,\c!height=\figureheight,#oddsettings]%
+   \ifnum\c_page_selectors_n>\zerocount
+     \definepapersize
+       [\s!dummy][\c!height=\directwithpagesparameter\c!height,\c!width=\directwithpagesparameter\c!width]%
+     \setuppapersize
+       [\s!dummy][\s!dummy]%
+     \setuplayout
+       [\c!backspace=\zeropoint,\c!topspace=\zeropoint,
+        \c!height=\v!middle,\c!width=\v!middle,
+        \c!textdistance=\zeropoint,
+        \c!header=\zeropoint,\c!footer=\zeropoint]%
+   \fi
+   \dorecurse\noffigurepages
+     {\global\let\slicedpagenumber\recurselevel
+      \ifnum\c_page_selectors_n>\plusone
+        \dorecurse\c_page_selectors_n
+          {\let\slicedpagestepx\recurselevel
+           \dorecurse\c_page_selectors_n
+             {\let\slicedpagestepy\recurselevel
+              \clip
+                [\c!nx=\c_page_selectors_n,\c!ny=\c_page_selectors_n,\c!x=\slicedpagestepx,\c!y=\slicedpagestepy]
+                {\scale
+                   [\c!scale=\number\c_page_selectors_n000]
+                   {\externalfigure[#filename][\c!page=\slicedpagenumber]}}%
+              \page}}%
+      \else
+        \ifodd\slicedpagenumber\relax
+          \setupcurrentwithpages[#oddsettings]%
+        \else
+          \setupcurrentwithpages[#evensettings]%
+        \fi
+        \hskip\directwithpagesparameter\c!offset\relax
+        \clip
+          [\c!hoffset=\directwithpagesparameter\c!hoffset,\c!voffset=\directwithpagesparameter\c!voffset,
+           \c!height=\directwithpagesparameter\c!height,\c!width=\directwithpagesparameter\c!width]
+          {\externalfigure[#filename][\c!page=\slicedpagenumber]}%
+        \page
+      \fi}
+   \egroup}
+
+% \starttext \slicepages[slice1.pdf][n=3] \stoptext
+
+\protect \endinput
diff --git a/tex/context/base/page-set.mkiv b/tex/context/base/page-set.mkiv
index 99570004c..88382282f 100644
--- a/tex/context/base/page-set.mkiv
+++ b/tex/context/base/page-set.mkiv
@@ -1264,7 +1264,7 @@
    \fi}
 
 \unexpanded\def\page_set_command_check_if_float_fits
-  {\global\ifnofloatpermitted\roomforfloatfalse\else\roomforfloattrue\fi}
+  {\global\ifconditional\c_page_floats_not_permitted\setfalse\c_page_floats_room\else\settrue\c_page_floats_room\fi}
 
 \def\OTRSETunpreparebox#1%
   {\ifhbox#1% spans and so
@@ -1279,11 +1279,11 @@
 
 \def\OTRSETsavebox#1% clean up the skips
   {\OTRSETunpreparebox{#1}%
-   \dofloatssave\s!text}
+   \page_floats_save\s!text}
 
 \def\OTRSETresavebox#1% clean up the skips
   {\OTRSETunpreparebox{#1}%
-   \dofloatsresave\s!text}
+   \page_floats_resave\s!text}
 
 \unexpanded\def\page_set_command_flush_float_box
   {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
@@ -1292,12 +1292,12 @@
   {\bgroup
    \def\OTRSETsavebox##1{\!!doneafalse}%
    \doloop
-     {\ifsomefloatwaiting
+     {\ifconditional\c_page_floats_some_waiting
         \OTRSETskipstart
-        \dofloatsgetinfo\s!text
+        \page_floats_get_info\s!text
         \ifdim\floatwidth>\zeropoint
           \!!doneatrue
-          \dofloatsflush\s!text{1}%
+          \page_floats_flush\s!text\plusone
           \dp\floatbox\zeropoint
           \OTRSETstoreincolumnslot{TBLR}\floatbox
           \if!!donea
@@ -1643,7 +1643,7 @@
        \fi
      \fi
      \global\setfalse\OTRSETfinish
-     \ifsomefloatwaiting
+     \ifconditional\c_page_floats_some_waiting
        \page_otr_command_set_vsize
        \pagebreak
        \page_otr_command_set_vsize
@@ -1991,7 +1991,7 @@
    \dp\floatbox\strutdp
    \@EA\uppercasestring\floatmethod\to\floatmethod
    \OTRSETstoreincolumnslot\floatmethod\floatbox
-   \doinsertfloatinfo}
+   \page_floats_report_total}
 
 % kind of new, looks much like OTRONE, but not entirely
 
@@ -1999,7 +1999,7 @@
 
 \unexpanded\def\page_set_command_set_top_insertions
   {\bgroup
-   \ifsomefloatwaiting
+   \ifconditional\c_page_floats_some_waiting
      \noffloatinserts\zerocount
      \let\totaltopinserted\!!zeropoint
      \OTRSETdodosettopinserts
@@ -2021,7 +2021,7 @@
 
 \def\OTRSETdodosettopinserts
   {\ifnum\noffloatinserts<\noftopfloats
-     \dogetfloat
+     \page_floats_get
      \ifdim\topinserted=\zeropoint\relax
        \settrue\c_page_set_top_of_insert
      \else
@@ -2047,15 +2047,15 @@
      \else
        \xdef\totaltopinserted{\the\topinserted}%
        \insert\topins{\forgetall\box\scratchbox}% interlineskip ?
-       \ifsomefloatwaiting
+       \ifconditional\c_page_floats_some_waiting
          \advance\noffloatinserts \plusone
        \else
          \noffloatinserts\noftopfloats\relax
        \fi
-       \dofloatflushedinfo
+       \page_floats_report_flushed
      \fi
    \else
-     \ifsomefloatwaiting
+     \ifconditional\c_page_floats_some_waiting
        \showmessage\m!floatblocks6{\the\noftopfloats}%
      \fi
      \let\OTRSETdodosettopinserts\relax
@@ -2064,7 +2064,7 @@
 
 \unexpanded\def\page_set_command_set_bottom_insertions
   {\bgroup
-   \ifsomefloatwaiting
+   \ifconditional\c_page_floats_some_waiting
      \noffloatinserts\zerocount
      \OTRSETdodosetbotinserts
    \fi
@@ -2072,7 +2072,7 @@
 
 \def\OTRSETdodosetbotinserts
   {\ifnum\noffloatinserts<\nofbotfloats\relax
-     \dogetfloat
+     \page_floats_get
      \global\advance\botinserted \ht\floatbox\relax
      \global\advance\botinserted \dp\floatbox\relax
      \global\advance\botinserted \floattopskip\relax
@@ -2081,19 +2081,19 @@
          {\forgetall
           \blank[\rootfloatparameter\c!spacebefore]%
           \page_otr_command_flush_float_box}%
-       \ifsomefloatwaiting
+       \ifconditional\c_page_floats_some_waiting
          \advance\noffloatinserts \plusone
        \else
          \noffloatinserts\nofbotfloats
        \fi
-       \dofloatflushedinfo
+       \page_floats_report_flushed
      \else
        \OTRSETresavebox\floatbox
        \noffloatinserts\nofbotfloats\relax
      \fi
-     \global\nofloatpermittedtrue % vgl topfloats s!
+     \global\settrue\c_page_floats_not_permitted % vgl topfloats s!
    \else
-     \ifsomefloatwaiting
+     \ifconditional\c_page_floats_some_waiting
        \showmessage\m!floatblocks7{\the\nofbotfloats}%
      \fi
      \let\OTRSETdodosetbotinserts\relax
@@ -2540,10 +2540,10 @@
 \unexpanded\def\page_set_command_flush_saved_floats % rather similar to _one_ ut this might change
   {\global\topinserted\zeropoint
    \global\botinserted\zeropoint
-   \ifflushingfloats \else
+   \ifconditional\c_page_floats_flushing \else
      \page_set_command_set_top_insertions
      \page_set_command_set_bottom_insertions
-     \ifsomefloatwaiting
+     \ifconditional\c_page_floats_some_waiting
         \doif{\rootfloatparameter\c!cache}\v!no\page_set_command_flush_floats % could be _otr_
      \fi
    \fi}
diff --git a/tex/context/base/page-sid.mkiv b/tex/context/base/page-sid.mkiv
index f4d42a41c..f3b54e430 100644
--- a/tex/context/base/page-sid.mkiv
+++ b/tex/context/base/page-sid.mkiv
@@ -104,13 +104,12 @@
 
 \let\logsidefloat    \relax
 
-\newif\ifroomforfloat    % shared (will change)
 \newif\iftracesidefloats % public (might change)
 
 % end of public variables
 
 \def\page_sides_insert_info
-  {\doinsertfloatinfo}
+  {\page_floats_report_total}
 
 \def\page_sides_apply_horizontal_shift
   {\ifdim\d_page_sides_maximum>\zeropoint
@@ -601,7 +600,7 @@
    \fi
    \relax % really needed ! ! ! !
    \ifdim\dimen0>\dimen2
-     \global\roomforfloatfalse
+     \global\setfalse\c_page_floats_room
    \else
      \ifdim\dimexpr\pagegoal-\d_page_sides_vsize\relax<\d_page_sides_bottomskip
        \global\advance\d_page_sides_vsize \dimen0
@@ -612,7 +611,7 @@
        \global\advance\d_page_sides_vsize \d_page_sides_bottomskip
        \global\setfalse\c_page_sides_short
      \fi
-     \global\roomforfloattrue
+     \global\settrue\c_page_floats_room
    \fi}
 
 \def\page_sides_prepare_space
@@ -633,7 +632,7 @@
    \page_sides_relocate_float{#1}%
    \page_sides_apply_vertical_shift
    \page_sides_analyse_space
-   \ifroomforfloat \else
+   \ifconditional\c_page_floats_room \else
      \page_otr_fill_and_eject_page
      \page_sides_analyse_space
      \page_sides_inject_dummy_lines
diff --git a/tex/context/base/page-spr.mkiv b/tex/context/base/page-spr.mkiv
index f4768d4e9..dc1e013d5 100644
--- a/tex/context/base/page-spr.mkiv
+++ b/tex/context/base/page-spr.mkiv
@@ -17,10 +17,9 @@
 
 \unprotect
 
-\newbox\spreadbox
-\newif \ifinspread
-
-\setnewconstant\showspreadmode\plusone
+\newbox        \b_page_spread_content
+\newconditional\c_page_spread_busy
+\newconditional\c_page_spread_once     % when true only one flush (writes etc)
 
 % beware, ugly overload, to be redone
 
@@ -35,52 +34,81 @@
          \noindent             % content can be < \hsize
          \page_otr_command_package_contents#2#3}}%
    \dp#1\zeropoint
-   \setbox#1\hbox to \makeupwidth
-     {\ifinspread
-        \ifvoid\spreadbox
-          \global\setbox\spreadbox\box#1%
-          \copy\spreadbox\hss % left page
+   \ifconditional\c_page_spread_busy
+      \normalsettextpagecontent_spread{#1}%
+   \else
+      \normalsettextpagecontent_normal{#1}%
+   \fi}
+
+\def\normalsettextpagecontent_normal#1%
+  {\setbox#1\hbox to \makeupwidth
+     {\hss\box#1\hss}} % never change the \hss's
+
+\def\normalsettextpagecontent_spread#1%
+  {\setbox#1\hbox to \makeupwidth
+     {\ifvoid\b_page_spread_content
+        \ifconditional\c_page_spread_once
+          \box#1%
         \else
-          % prevent duplicate writes in normal run
-          \ifarrangingpages \else \ifcase\showspreadmode
-            \global\setbox\spreadbox\emptyhbox
-            \wd\spreadbox\makeupwidth
-            \ht\spreadbox\textheight
-          \fi \fi
-          \hss\box\spreadbox % right page
+          \global\setbox\b_page_spread_content\box#1%
+          \copy\b_page_spread_content
         \fi
+        \hss % left page
       \else
-        \hss\box#1\hss % never change the \hss's
+        \hss % right page
+        \ifarrangingpages
+          % writes don't matter anyway
+        \else\ifconditional\c_page_spread_once
+          \global\setbox\b_page_spread_content\emptyhbox
+          \wd\b_page_spread_content\makeupwidth
+          \ht\b_page_spread_content\textheight
+        \else
+          % writes can interfere (todo: write stripper, but how about hyperlinks)
+        \fi \fi
+        \box\b_page_spread_content
       \fi}}
 
-\def\doflushspread
-  {\ifinspread \ifvoid\spreadbox\else
+\unexpanded\def\page_spread_flush
+  {\ifconditional\c_page_spread_busy \ifvoid\b_page_spread_content\else
      % this page will be discarded later
      \emptyhbox \page
    \fi \fi }
 
 \unexpanded\def\startspread
-  {\bgroup
-   \ifdoublesided
-     \page[\v!left]%
-    %\setsystemmode{spread}%
-     \inspreadtrue
-     \expanded{\setuplayout[\c!textwidth=\the\dimexpr2\textwidth+2\backspace\relax]}%
-     \unexpanded\def\startspread{\bgroup\let\stopspread\egroup}%
-     \let\stopspread\dostopspread
+  {\ifdoublesided
+     \ifconditional\c_page_spread_busy
+       \doubleexpandafter\page_spread_start_nop
+     \else
+       \doubleexpandafter\page_spread_start_yes
+     \fi
    \else
-     \let\stopspread\egroup
+     \expandafter\page_spread_start_nop
    \fi}
 
 \let\stopspread\relax
 
-\def\dostopspread
-  {\kern\zeropoint\page
-   \inspreadfalse
+\unexpanded\def\page_spread_start_yes
+  {\bgroup
+   \page[\v!left]%
+  %\setsystemmode{spread}%
+   \settrue\c_page_spread_busy
+   \expanded{\setuplayout[\c!textwidth=\the\dimexpr2\textwidth+2\backspace\relax]}%
+   \let\stopspread\page_spread_stop_yes}
+
+\unexpanded\def\page_spread_stop_yes
+  {\kern\zeropoint
+   \page
    \setuplayout[\c!textwidth=\textwidth]
    \page[\v!left]
    \egroup}
 
+\unexpanded\def\page_spread_start_nop
+  {\bgroup
+   \let\stopspread\page_spread_stop_nop}
+
+\unexpanded\def\page_spread_stop_nop
+  {\egroup}
+
 \protect \endinput
 
 % texexec --arr --pdf test
diff --git a/tex/context/base/page-str.mkiv b/tex/context/base/page-str.mkiv
index 47eb5e3bf..200a71377 100644
--- a/tex/context/base/page-str.mkiv
+++ b/tex/context/base/page-str.mkiv
@@ -36,7 +36,7 @@
 \unprotect
 
 \let     \currentoutputstream     \empty
-\newif   \ifinoutputstream
+\newif   \ifinoutputstream        % will becoem a conditional or mode
 \newtoks \everyenableoutputstream
 
 \appendtoks
@@ -71,15 +71,13 @@
   {\ctxlua{streams.stop()}%
    \endgroup}
 
-\let\currentoutputsubstream\empty
-
 \unexpanded\def\startoutputsubstream[#1]% just push/pop instead
-  {\glet\savedcurrentoutputstream\currentoutputstream
+  {\globalpushmacro\currentoutputstream
    \enableoutputstream[#1]}
 
 \unexpanded\def\stopoutputsubstream
-  {\glet\currentoutputstream\savedcurrentoutputstream
-   \enableoutputstream[\savedcurrentoutputstream]}
+  {\globalpopmacro\currentoutputstream
+   \enableoutputstream[\currentoutputstream]}
 
 \def\flushoutputstream  [#1]{\ctxlua{streams.flush("#1")}}
 \def\outputstreamcopy   [#1]{\vbox{\ctxlua{streams.flush("#1",true)}}}
diff --git a/tex/context/base/page-txt.mkvi b/tex/context/base/page-txt.mkvi
index c86597338..241461ec0 100644
--- a/tex/context/base/page-txt.mkvi
+++ b/tex/context/base/page-txt.mkvi
@@ -430,6 +430,9 @@
      \global\setfalse\resyncaftertextline
    \fi}
 
+\def\getspecificlayouttext#vertical#horizontal#what%
+  {\csname\namedlayoutelementhash{#vertical:#horizontal}#what\endcsname}
+
 % \settext[header][text][middle][xxx][yyy]
 
 \def\settextcontent
@@ -474,8 +477,6 @@
 %D macros. These are hooked into the general purpose token
 %D list registers mentioned before.
 
-\def\ignoredlinebreak{\unskip\space\ignorespaces}
-
 \def\page_layouts_place_text_line_indeed#vertical#height%
   {\let\currentlayouttextline#vertical%
    \ifdim#height>\zeropoint\relax  % prevents pagenumbers when zero height
@@ -693,26 +694,26 @@
 % associated. This is a rather messy test but better than the MkII
 % way where we use states and keep settings.
 
-\let\m_page_layouts_page_number_location_  \relax
-\let\m_page_layouts_page_number_location__v\relax
-\let\m_page_layouts_page_number_location__h\relax
-\let\m_page_layouts_page_number_location__x\relax
+\let\m_page_layouts_page_number_location  \relax
+\let\m_page_layouts_page_number_location_v\relax
+\let\m_page_layouts_page_number_location_h\relax
+\let\m_page_layouts_page_number_location_x\relax
 
 \def\page_layouts_place_page_number % also elsewhere .. beware, not \unexpanded else
   {\placelocationpagenumber}  % test below fails
 
 \def\page_layouts_reset_page_number_location
-  {\ifx\m_page_layouts_page_number_location__v\relax\else
-     \edef\currentlayoutelement{\m_page_layouts_page_number_location__v:\m_page_layouts_page_number_location__h}%
-     \edef\page_layouts_previous_page_number_locator{\detokenizedlayoutelementparameter\m_page_layouts_page_number_location__x}%
+  {\ifx\m_page_layouts_page_number_location_v\relax\else
+     \edef\currentlayoutelement{\m_page_layouts_page_number_location_v:\m_page_layouts_page_number_location_h}%
+     \edef\page_layouts_previous_page_number_locator{\detokenizedlayoutelementparameter\m_page_layouts_page_number_location_x}%
      \doif{\meaning\page_layouts_previous_page_number_locator}{\meaning\page_layouts_place_page_number}
-       {\resetlayoutelementparameter\m_page_layouts_page_number_location__x}%
+       {\resetlayoutelementparameter\m_page_layouts_page_number_location_x}%
    \fi}
 
 \def\page_layouts_set_page_number_location
-  {\edef\currentlayoutelement{\m_page_layouts_page_number_location__v:\m_page_layouts_page_number_location__h}%
-   \letlayoutelementparameter\m_page_layouts_page_number_location__x\page_layouts_place_page_number
-   \ifx\m_page_layouts_page_number_location__x\c!marginedgetext
+  {\edef\currentlayoutelement{\m_page_layouts_page_number_location_v:\m_page_layouts_page_number_location_h}%
+   \letlayoutelementparameter\m_page_layouts_page_number_location_x\page_layouts_place_page_number
+   \ifx\m_page_layouts_page_number_location_x\c!marginedgetext
      \let\page_layouts_place_extra_text_left \page_layouts_place_page_number_left
      \let\page_layouts_place_extra_text_right\page_layouts_place_page_number_right
    \else
@@ -721,38 +722,39 @@
    \fi}
 
 \def\page_layouts_identify_page_number_location
-  {\let\m_page_layouts_page_number_location__v\v!footer
-   \let\m_page_layouts_page_number_location__h\v!text
-   \let\m_page_layouts_page_number_location__x\c!middletext
-   \processallactionsinset[\@@nmlocation]
-     [    \v!header=>\let\m_page_layouts_page_number_location__v\v!header,
-          \v!footer=>\let\m_page_layouts_page_number_location__v\v!footer,
-          \v!middle=>\let\m_page_layouts_page_number_location__h\v!text
-                     \let\m_page_layouts_page_number_location__x\c!middletext,
-            \v!left=>\let\m_page_layouts_page_number_location__h\v!text
-                     \let\m_page_layouts_page_number_location__x\c!lefttext,
-           \v!right=>\let\m_page_layouts_page_number_location__h\v!text
-                     \let\m_page_layouts_page_number_location__x\c!righttext,
-          \v!inleft=>\let\m_page_layouts_page_number_location__h\v!margin
-                     \let\m_page_layouts_page_number_location__x\c!lefttext,
-         \v!inright=>\let\m_page_layouts_page_number_location__h\v!margin
-                     \let\m_page_layouts_page_number_location__x\c!righttext,
-        \v!inmargin=>\let\m_page_layouts_page_number_location__h\v!margin
-                     \def\m_page_layouts_page_number_location__x{\ifdoublesided\c!margintext\else\c!righttext\fi},
-          \v!margin=>\let\m_page_layouts_page_number_location__h\v!margin
-                     \def\m_page_layouts_page_number_location__x{\ifdoublesided\c!margintext\else\c!righttext\fi},
-        \v!atmargin=>\let\m_page_layouts_page_number_location__h\v!text
-                     \let\m_page_layouts_page_number_location__x\c!marginedgetext,
-      \v!marginedge=>\let\m_page_layouts_page_number_location__h\v!text
-                     \let\m_page_layouts_page_number_location__x\c!marginedgetext]}
+  {\let\m_page_layouts_page_number_location_v\v!footer
+   \let\m_page_layouts_page_number_location_h\v!text
+   \let\m_page_layouts_page_number_location_x\c!middletext
+   \processallactionsinset[\directpagenumberingparameter\c!location]
+     [    \v!header=>\let\m_page_layouts_page_number_location_v\v!header,
+          \v!footer=>\let\m_page_layouts_page_number_location_v\v!footer,
+          \v!middle=>\let\m_page_layouts_page_number_location_h\v!text
+                     \let\m_page_layouts_page_number_location_x\c!middletext,
+            \v!left=>\let\m_page_layouts_page_number_location_h\v!text
+                     \let\m_page_layouts_page_number_location_x\c!lefttext,
+           \v!right=>\let\m_page_layouts_page_number_location_h\v!text
+                     \let\m_page_layouts_page_number_location_x\c!righttext,
+          \v!inleft=>\let\m_page_layouts_page_number_location_h\v!margin
+                     \let\m_page_layouts_page_number_location_x\c!lefttext,
+         \v!inright=>\let\m_page_layouts_page_number_location_h\v!margin
+                     \let\m_page_layouts_page_number_location_x\c!righttext,
+        \v!inmargin=>\let\m_page_layouts_page_number_location_h\v!margin
+                     \def\m_page_layouts_page_number_location_x{\ifdoublesided\c!margintext\else\c!righttext\fi},
+          \v!margin=>\let\m_page_layouts_page_number_location_h\v!margin
+                     \def\m_page_layouts_page_number_location_x{\ifdoublesided\c!margintext\else\c!righttext\fi},
+        \v!atmargin=>\let\m_page_layouts_page_number_location_h\v!text
+                     \let\m_page_layouts_page_number_location_x\c!marginedgetext,
+      \v!marginedge=>\let\m_page_layouts_page_number_location_h\v!text
+                     \let\m_page_layouts_page_number_location_x\c!marginedgetext]}
 
 \unexpanded\def\dosetpagenumberlocation
-  {\ifx\@@nmlocation\m_page_layouts_page_number_location_
+  {\edef\p_page_numbering_location{\directpagenumberingparameter\c!location}%
+   \ifx\p_page_numbering_location\m_page_layouts_page_number_location
       % unchanged
    \else
-     \let\m_page_layouts_page_number_location_\@@nmlocation
+     \let\m_page_layouts_page_number_location\p_page_numbering_location
      \page_layouts_reset_page_number_location
-     \ifx\@@nmlocation\empty
+     \ifx\p_page_numbering_location\empty
        % set otherwise
      \else
        \page_layouts_identify_page_number_location
@@ -764,9 +766,12 @@
   {\begingroup
    \setbox\scratchbox\hbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}%
    \ifzeropt\wd\scratchbox\else
-     \doifelsenothing\@@nmwidth
-       {\box\scratchbox\tfskip}
-       {\hbox to \@@nmwidth{\box\scratchbox\hss}}%
+     \edef\p_page_numbering_width{\directpagenumberingparameter\c!width}%
+     \ifx\p_page_numbering_width\empty
+       \box\scratchbox\tfskip
+     \else
+       \hbox to \p_page_numbering_width{\box\scratchbox\hss}%
+     \fi
    \fi
    \endgroup}
 
@@ -774,9 +779,12 @@
   {\begingroup
    \setbox\scratchbox\hbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}%
    \ifzeropt\wd\scratchbox\else
-     \doifelsenothing\@@nmwidth
-       {\tfskip\box\scratchbox}
-       {\hbox to \@@nmwidth{\hss\box\scratchbox}}%
+     \edef\p_page_numbering_width{\directpagenumberingparameter\c!width}%
+     \ifx\p_page_numbering_width\empty
+       \tfskip\box\scratchbox
+     \else
+       \hbox to \p_page_numbering_width{\hss\box\scratchbox}%
+     \fi
    \fi
    \endgroup}
 
diff --git a/tex/context/base/regi-ini.lua b/tex/context/base/regi-ini.lua
index ec6f812cc..3440dd52d 100644
--- a/tex/context/base/regi-ini.lua
+++ b/tex/context/base/regi-ini.lua
@@ -234,6 +234,9 @@ function commands.stopregime()
     end
 end
 
+commands.pushregime = regimes.push
+commands.popregime  = regimes.pop
+
 -- obsolete:
 --
 -- function regimes.setsynonym(synonym,target)
diff --git a/tex/context/base/scrn-pag.mkvi b/tex/context/base/scrn-pag.mkvi
index 66f197ffd..5bbdadda8 100644
--- a/tex/context/base/scrn-pag.mkvi
+++ b/tex/context/base/scrn-pag.mkvi
@@ -150,12 +150,6 @@
       {\global\setfalse\c_scrn_canvas_tight_page}%
 \to \everysetupinteractionscreen
 
-\appendtoks
-  \doifelse\@@pcstate\v!start
-    \scrn_canvas_synchronize_simple
-    \scrn_canvas_synchronize_complex
-\to \everyshipout
-
 \setupinteractionscreen
   [\c!width=\printpaperwidth,
    \c!height=\printpaperheight,
diff --git a/tex/context/base/scrn-wid.lua b/tex/context/base/scrn-wid.lua
index 6fdc4fca0..14d58a29a 100644
--- a/tex/context/base/scrn-wid.lua
+++ b/tex/context/base/scrn-wid.lua
@@ -167,11 +167,19 @@ function renderings.rendering(label)
     end
 end
 
-function renderings.var(label,key)
+local function var(label,key)
     local rn = renderings[label]
-    context(rn and rn[key] or "")
+    return rn and rn[key] or ""
 end
 
+renderings.var = var
+
+function commands.renderingvar(label,key)
+    context(var(label,key))
+end
+
+commands.registerrendering = renderings.register
+
 -- Rendering:
 
 function commands.insertrenderingwindow(specification)
diff --git a/tex/context/base/scrn-wid.mkvi b/tex/context/base/scrn-wid.mkvi
index 2b75f83cd..610f1e7b9 100644
--- a/tex/context/base/scrn-wid.mkvi
+++ b/tex/context/base/scrn-wid.mkvi
@@ -483,10 +483,8 @@
 
 % todo: dedicated margin classes
 
-\def\scrn_comment_place
-  {\executeifdefined
-     {\??commentlocation\commentparameter\c!location}\hbox
-     {\hbox{\box\b_scrn_comment_link}}}
+\unexpanded\def\scrn_comment_place
+  {\hbox{\expandcheckedcsname\??commentlocation{\commentparameter\c!location}\s!unknown}}
 
 \setvalue{\??commentlocation\v!inmargin   }{\inmargin     }
 \setvalue{\??commentlocation\v!leftedge   }{\inleftedge   }
@@ -495,6 +493,12 @@
 \setvalue{\??commentlocation\v!rightmargin}{\inrightmargin}
 \setvalue{\??commentlocation\v!high       }{\high}
 \setvalue{\??commentlocation\v!none       }{\scrn_comment_collect}
+\setvalue{\??commentlocation\s!unknown    }{\scrn_comment_flush_collect}
+
+\unexpanded\def\scrn_comment_flush_collect
+  {\ifvoid\b_scrn_comment_collect\else
+     \box\b_scrn_comment_collect
+   \fi}
 
 \def\scrn_comment_collect#content%
   {\global\setbox\b_scrn_comment_collect\hbox\bgroup
@@ -505,10 +509,7 @@
      #content%
    \egroup}
 
-\unexpanded\def\placecomments
-  {\ifvoid\b_scrn_comment_collect\else
-     \box\b_scrn_comment_collect
-   \fi}
+\let\placecomments\scrn_comment_flush_collect
 
 \definecomment[comment]
 
@@ -529,6 +530,13 @@
 %D Todo: like external figures, also search on path,
 %D although, they need to be present ar viewing time, so ...
 
+\installcorenamespace{externalsoundtracks}
+
+\installsetuponlycommandhandler \??externalsoundtracks {externalsoundtracks}
+
+\setupexternalsoundtracks
+  [\c!option=]
+
 \unexpanded\def\useexternalsoundtrack
   {\dodoubleargument\scrn_soundtrack_indeed}
 
@@ -541,17 +549,11 @@
 \def\checksoundtrack#tag% yet untested in mkiv (also move management to lua)
   {\iflocation
      \ctxcommand{insertsoundclip{
-       tag    = "#tag",
-       repeat = "\@@sdoption", % not entirely ok but works
+       tag        = "#tag",
+       ["repeat"] = "\directexternalsoundtrackparameter\c!option", % todo: pass option as-is
       }}%
    \fi}
 
-\unexpanded\def\setupexternalsoundtracks
-  {\dodoubleargument\getparameters[\??sd]}
-
-\setupexternalsoundtracks
-  [\c!option=]
-
 %D Renderings (not yet tested in mkvi):
 
 % Todo: multiple instances and inheritance .. will be done when
@@ -568,7 +570,7 @@
 \def\setinternalrendering{\dodoubleempty   \scrn_rendering_set}
 
 \def\scrn_rendering_use[#tag][#mime][#file][#option]%
-  {\ctxlua{interactions.renderings.register {
+  {\ctxcommand{registerrendering{
       type     = "external",
       label    = "#tag",
       mime     = "#mime",
@@ -579,7 +581,7 @@
 \def\scrn_rendering_set[#tag][#option]% {content}
   {\bgroup
    \dowithnextbox
-     {\ctxlua{interactions.renderings.register {
+     {\ctxcommand{registerrendering{
          type     = "internal",
          label    = "#tag",
          mime     = "IRO", % brrr
@@ -591,28 +593,24 @@
       \egroup}%
      \hbox}
 
-\def\renderingtype  #tag{\ctxlua{interactions.renderings.var("#tag","type")}}
-\def\renderingoption#tag{\ctxlua{interactions.renderings.var("#tag","option")}}
+\def\renderingtype  #tag{\ctxcommand{renderingvar("#tag","type")}}
+\def\renderingoption#tag{\ctxcommand{renderingvar("#tag","option")}}
 
-\def\renderingwidth {8cm} % will become private
-\def\renderingheight{6cm} % will become private
+\newdimen\d_scrn_rendering_width  \d_scrn_rendering_width  8cm
+\newdimen\d_scrn_rendering_height \d_scrn_rendering_height 6cm
 
-\unexpanded\def\definerenderingwindow
-  {\dodoubleempty\scrn_rendering_define_window}
+\let\m_scrn_rendering_page\!!zerocount
 
-\def\scrn_rendering_define_window[#tag][#settings]%
-  {\presetlocalframed[\??rw#tag]%
-   \getparameters
-     [\??rw#tag]%
-     [\c!openpageaction=,\c!closepageaction=,%
-      \c!width=\renderingwidth,\c!height=\renderingheight,%
-      #settings]}
+\installcorenamespace{renderingwindow}
 
-\unexpanded\def\setuprenderingwindow
-  {\dodoubleargument\scrn_rendering_setup_window}
+\installframedcommandhandler \??renderingwindow {renderingwindow} \??renderingwindow
 
-\def\scrn_rendering_setup_window[#tag]%
-  {\getparameters[\??rw#tag]}
+\appendtoks
+    \letrenderingwindowparameter\c!openpageaction \empty
+    \letrenderingwindowparameter\c!closepageaction\empty
+    \setrenderingwindowparameter\c!width          {\d_scrn_rendering_width }%
+    \setrenderingwindowparameter\c!height         {\d_scrn_rendering_height}%
+\to \everypresetrenderingwindow
 
 \unexpanded\def\placerenderingwindow
   {\dodoubleempty\scrn_rendering_place_window}
@@ -622,31 +620,32 @@
    \edef\currentrendering{\ifsecondargument#rendering\else#window\fi}%
    \doifelse{\renderingtype\currentrendering}{internal} % an object
      {\getobjectdimensions{IRO}\currentrendering
-      \edef\renderingheight{\the\dimexpr\objectheight+\objectdepth\relax}%
-      \edef\renderingwidth{\objectwidth}%
-      \dogetobjectreferencepage{IRO}\currentrendering\renderingpage}%
-     {\def\renderingheight{\vsize}%
-      \def\renderingwidth{\hsize}%
-      \def\renderingpage{\realpageno}}%
+      \d_scrn_rendering_height\dimexpr\objectheight+\objectdepth\relax
+      \d_scrn_rendering_width\objectwidth\relax
+      \dogetobjectreferencepage{IRO}\currentrendering\m_scrn_rendering_page}%
+     {\d_scrn_rendering_height\vsize
+      \d_scrn_rendering_width\hsize
+      \let\m_scrn_rendering_page\realpageno}%
    % create fall back if needed
-   \ifcsname\??rw#window\c!width\endcsname
-     \def\currentrenderingwindow{#window}%
-   \else
+   \edef\currentrenderingwindow{\namedrenderingwindowparameter{#window}\c!width}% stupid test, we need a proper one here
+   \ifx\currentrenderingwindow\empty
      \let\currentrenderingwindow\s!default
-     \definerenderingwindow[\currentrenderingwindow]%
+     \definerenderingwindow[\currentrenderingwindow]% why not global
+   \else
+     \edef\currentrenderingwindow{#window}%
    \fi
-% todo
-%    \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction
-%    \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction
-   \localframed
-     [\??rw\currentrenderingwindow][\c!offset=\v!overlay]%
+ % todo:
+ % \handlereferenceactions{\renderingwindowparameter\c!openpageaction }\dosetuprenderingopenpageaction
+ % \handlereferenceactions{\renderingwindowparameter\c!closepageaction}\dosetuprenderingclosepageaction
+   \letrenderingwindowparameter\c!offset\v!overlay
+   \inheritedrenderingwindowframed
      {\vfill
       \ctxcommand{insertrenderingwindow {
         label  = "\currentrendering",
-        width  = \number\dimexpr\renderingwidth\relax,
-        height = \number\dimexpr\renderingheight\relax,
+        width  = \number\d_scrn_rendering_width,
+        height = \number\d_scrn_rendering_height,
         option = "\renderingoption\currentrendering",
-        page   = \number\renderingpage,
+        page   = \number\m_scrn_rendering_page,
       }}\hfill}%
    \egroup}
 
@@ -662,6 +661,8 @@
 % %D \dorecurse{10}{\linkedlistelement[demo]{link \recurselevel} \page}
 % %D \stoptyping
 %
+% \definesystemvariable {lk}   % LinK
+%
 % \installcommandhandler\??lk{linkedlist}\??lk
 %
 % \let\setupbutton\setuplinkedlists\setuplinkedlist
diff --git a/tex/context/base/spac-def.mkiv b/tex/context/base/spac-def.mkiv
index ea537aea7..0e2333045 100644
--- a/tex/context/base/spac-def.mkiv
+++ b/tex/context/base/spac-def.mkiv
@@ -21,29 +21,37 @@
 % maybe \everysynchronizeglobalspacing
 % maybe \everysynchronizelocalspacing
 
-\appendtoks \forgetverticalstretch     \to \everybodyfont
-\appendtoks \presetnormallineheight    \to \everybodyfont
-\appendtoks \setnormalbaselines        \to \everybodyfont % check if redundant (\forgetverticalstretch does it too)
-\appendtoks \setstrut                  \to \everybodyfont % check if redundant (\forgetverticalstretch does it too)
-\appendtoks \settopskip                \to \everybodyfont % factors set in \forgetverticalstretch
-\appendtoks \setmaxdepth               \to \everybodyfont % factors set in \forgetverticalstretch
-\appendtoks \synchronizeindenting      \to \everybodyfont
-\appendtoks \synchronizeblank          \to \everybodyfont
-\appendtoks \synchronizewhitespace     \to \everybodyfont
-\appendtoks \synchronizespacecodes     \to \everybodyfont % not needed, frozen factors
-\appendtoks \setrelativeinterlinespace \to \everybodyfont
+\appendtoks
+    \forgetverticalstretch
+    \presetnormallineheight
+    \setnormalbaselines         % check if redundant (\forgetverticalstretch does it too)
+    \setstrut                   % check if redundant (\forgetverticalstretch does it too)
+    \settopskip                 % factors set in \forgetverticalstretch
+    \setmaxdepth                % factors set in \forgetverticalstretch
+    \synchronizeindenting
+    \synchronizeblank
+    \synchronizewhitespace
+    \synchronizespacecodes      % not needed, frozen factors
+    \setrelativeinterlinespace
+\to \everybodyfont
 
 % why exception
 
-\appendtoks  \updateraggedskips        \to \everyfontswitch     % under test
+\appendtoks
+    \updateraggedskips          % under test
+\to \everyfontswitch
 
 % maybe more
 
-\prependtoks \let\par\normalpar        \to \everybeforepagebody % see \fillinline (was endgraf)
+\prependtoks
+    \let\par\normalpar
+\to \everybeforepagebody % see \fillinline (was endgraf)
 
 % needs checking:
 
-\appendtoks  \synchronizespacecodes    \to \everydefinedfont    % not needed, frozen factors
+\appendtoks
+    \synchronizespacecodes
+\to \everydefinedfont    % not needed, frozen factors
 
 \setupinterlinespace
   [\c!minheight=\zeropoint, % only special purpose
diff --git a/tex/context/base/spac-grd.mkiv b/tex/context/base/spac-grd.mkiv
index cf350fdb6..369c147e3 100644
--- a/tex/context/base/spac-grd.mkiv
+++ b/tex/context/base/spac-grd.mkiv
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-%D This module will be merged intio spac-ver.mkiv.
+%D This module will be merged into spac-ver.mkiv.
 
 \writestatus{loading}{ConTeXt Spacing Macros / Grid Snapping}
 
@@ -142,7 +142,9 @@
 \def\showbaselinecorrection
   {\def\dobaselinecorrection % visualization is not watertight!
      {\bgroup
-\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
+      \ifdim\prevdepth>\zeropoint
+        \kern-\prevdepth
+      \fi
       \setbox\scratchbox\emptyhbox
       \wd\scratchbox\hsize
       \dp\scratchbox\strutdp
diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv
index 49187a6ad..18460b1c6 100644
--- a/tex/context/base/spac-hor.mkiv
+++ b/tex/context/base/spac-hor.mkiv
@@ -417,7 +417,7 @@
 \appendtoks
     \let~\space
     \let\ \space
-\to \simplifiedcommands
+\to \everysimplifycommands
 
 \unexpanded\def\removeunwantedspaces
   {\ifhmode
@@ -987,4 +987,8 @@
 \unexpanded\def\medglue  {\spac_glues_text_or_math\medmuskip  \v!medium}
 \unexpanded\def\thickglue{\spac_glues_text_or_math\thickmuskip\v!big}
 
+%D For the moment here (used in page-txt):
+
+\unexpanded\def\ignoredlinebreak{\unskip\space\ignorespaces}
+
 \protect \endinput
diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv
index e404dc9ef..f3dd5eafe 100644
--- a/tex/context/base/spac-ver.mkiv
+++ b/tex/context/base/spac-ver.mkiv
@@ -1259,7 +1259,6 @@
 \definesystemattribute[skipcategory] [public]
 \definesystemattribute[skippenalty]  [public]
 \definesystemattribute[skiporder]    [public]
-\definesystemattribute[displaymath]  [public]
 \definesystemattribute[snapmethod]   [public]
 \definesystemattribute[snapvbox]     [public]
 %definesystemattribute[snapcategory] [public]
@@ -1868,4 +1867,56 @@
      \relax
    \fi}
 
+%D Some preliminary code: a simple and fast hanger, for usage in
+%D macros (moved from cont-new).
+
+\installcorenamespace {hanging}
+
+\installdirectcommandhandler \??hanging {hanging}
+
+\setuphanging
+  [\c!distance=.5em]
+
+\unexpanded\def\starthanging
+  {\noindent\bgroup
+   \dowithnextboxcs\spac_hanging_finish\hbox}
+
+\def\spac_hanging_finish
+  {\setbox\nextbox\hbox
+    {\box\nextbox
+     \hskip\directhangingparameter\c!distance}%
+   \hangindent\wd\nextbox
+   \hangafter\plusone
+   \box\nextbox
+   \ignorespaces}
+
+\unexpanded\def\stophanging
+  {\endgraf
+   \egroup}
+
+\unexpanded\def\starthangaround
+  {\noindent\bgroup
+   \dowithnextboxcs\spac_hanging_around_finish\hbox}
+
+\def\spac_hanging_around_finish
+  {\ifdim\nextboxht>\strutht
+     \setbox\nextbox\tbox
+       {\box\nextbox}%
+   \fi
+   \setbox\nextbox\hbox
+     {\box\nextbox
+      \hskip\directhangingparameter\c!distance}%
+   \getboxheight\scratchdimen\of\box\nextbox
+   \getnoflines\scratchdimen
+   \ht\nextbox\strutht
+   \dp\nextbox\strutdp
+   \hangindent\wd\nextbox
+   \hangafter-\noflines
+   \llap{\box\nextbox}%
+   \ignorespaces}
+
+\unexpanded\def\stophangaround
+  {\endgraf
+   \egroup}
+
 \protect \endinput
diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf
index 5c835ba6f..2a6807dc6 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 9a2a5fefd..273b84d23 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/status-mkiv.lua b/tex/context/base/status-mkiv.lua
index 3da404199..094859290 100644
--- a/tex/context/base/status-mkiv.lua
+++ b/tex/context/base/status-mkiv.lua
@@ -190,9 +190,9 @@ return {
             status   = "okay",
         },
         {
-            filename = "core-var",
+            filename = "core-ini",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
             comment  = "code might move from here",
         },
         {
@@ -279,13 +279,13 @@ return {
      -- {
      --     filename = "supp-vis",
      --     marktype = "mkiv",
-     --     status   = "unknown",
+     --     status   = "todo",
      --     comment  = "will become a module (and part will stay in the core)",
      -- },
      -- {
      --     filename = "supp-fun",
      --     marktype = "mkiv",
-     --     status   = "unknown",
+     --     status   = "todo",
      --     comment  = "will be integrated elsewhere",
      -- },
         {
@@ -314,7 +314,8 @@ return {
         {
             filename = "page-ins",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "dealing with insertions might change",
         },
         {
             filename = "file-syn",
@@ -468,8 +469,8 @@ return {
         {
             filename = "pack-mrl",
             marktype = "mkiv",
-            status   = "todo",
-            comment  = "this is something to be done on a rainy day"
+            status   = "okay",
+            comment  = "endpar experimental code"
         },
         {
             filename = "pack-bck",
@@ -509,17 +510,18 @@ return {
         {
             filename = "strc-doc",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "strc-num",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "still some rough edges",
         },
         {
             filename = "strc-mar",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "strc-sbe",
@@ -534,17 +536,17 @@ return {
         {
             filename = "strc-sec",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "strc-pag",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "strc-ren",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "strc-xml",
@@ -555,7 +557,7 @@ return {
         {
             filename = "strc-def",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "strc-ref",
@@ -566,7 +568,7 @@ return {
         {
             filename = "strc-reg",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "strc-lev",
@@ -611,12 +613,12 @@ return {
         {
             filename = "spac-def",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "spac-grd",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
             comment  = "needs thinking and redoing",
         },
         {
@@ -651,27 +653,27 @@ return {
         {
             filename = "strc-con",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "strc-des",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "strc-enu",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "strc-ind",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "strc-lab",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "core-sys",
@@ -682,7 +684,7 @@ return {
         {
             filename = "page-var",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "page-otr",
@@ -698,7 +700,7 @@ return {
         {
             filename = "page-fac",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "page-brk",
@@ -709,7 +711,8 @@ return {
         {
             filename = "page-col",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "helpers for columns",
         },
         {
             filename = "page-inf",
@@ -720,12 +723,13 @@ return {
         {
             filename = "page-grd",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "page-flt",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "will be extended when columns are redone",
         },
         {
             filename = "page-bck",
@@ -735,7 +739,7 @@ return {
         {
             filename = "page-not",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "page-one",
@@ -757,6 +761,7 @@ return {
             filename = "page-txt",
             marktype = "mkvi",
             status   = "okay",
+            comment  = "a few things left",
         },
         {
             filename = "page-sid",
@@ -766,12 +771,12 @@ return {
         {
             filename = "strc-flt",
             marktype = "mkvi",
-            status   = "unknown",
+            status   = "todo",
         },
         {
-            filename = "page-mis",
+            filename = "page-pst",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "page-mbk",
@@ -782,12 +787,14 @@ return {
         {
             filename = "page-mul",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
+            comment  = "will be reimplemented",
         },
         {
             filename = "page-set",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
+            comment  = "will be reimplemented",
         },
         {
             filename = "pack-lyr",
@@ -807,7 +814,8 @@ return {
         {
             filename = "page-lin",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "will probably be overhauled some day"
         },
         {
             filename = "page-par",
@@ -881,17 +889,18 @@ return {
         {
             filename = "page-imp",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "page-sel",
-            marktype = "mkiv",
-            status   = "unknown",
+            marktype = "mkvi",
+            status   = "okay",
+            comment  = "maybe some extensions and maybe delayed loading, needs checking",
         },
         {
             filename = "page-com",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "scrn-pag",
@@ -903,7 +912,7 @@ return {
             filename = "scrn-wid",
             marktype = "mkvi",
             status   = "okay",
-            comment  = "namespace needs checking"
+            comment  = "functionality needs checking"
         },
         {
             filename = "scrn-but",
@@ -937,7 +946,7 @@ return {
         {
             filename = "tabl-tab",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "delayed",
         },
         {
             filename = "tabl-tbl",
@@ -964,7 +973,7 @@ return {
         {
             filename = "tabl-ltb",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "delayed",
             comment  = "will be redone when needed",
         },
         {
@@ -1237,22 +1246,24 @@ return {
         {
             filename = "page-flw",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "page-spr",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "page-plg",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "will be made better",
         },
         {
             filename = "page-str",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "needs more work (and thinking)",
         },
         {
             filename = "anch-pgr",
@@ -1269,7 +1280,8 @@ return {
         {
             filename = "anch-tab",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "will stay experimental for a while",
         },
         {
             filename = "anch-bar",
@@ -1279,7 +1291,7 @@ return {
         {
             filename = "anch-snc",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "delayed",
             comment  = "interesting old mechanism to keep around (module?)",
         },
         {
@@ -1296,7 +1308,7 @@ return {
         {
             filename = "math-for",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "math-def",
@@ -1307,12 +1319,14 @@ return {
         {
             filename = "math-ali",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            commend  = "will be checked and improved",
         },
         {
             filename = "math-arr",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "needs testing",
         },
         {
             filename = "math-frc",
@@ -1356,7 +1370,8 @@ return {
         {
             filename = "strc-mat",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "some more functionality will end up here",
         },
         {
             filename = "chem-ini",
@@ -1376,7 +1391,7 @@ return {
      -- {
      --     filename = "core-fnt",
      --     marktype = "mkiv",
-     --     status   = "unknown",
+     --     status   = "todo",
      -- },
         {
             filename = "node-rul",
@@ -1393,17 +1408,17 @@ return {
         {
             filename = "strc-not",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
         {
             filename = "strc-lnt",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "todo",
         },
      -- {
      --     filename = "core-mis",
      --     marktype = "mkiv",
-     --     status   = "unknown",
+     --     status   = "todo",
      -- },
         {
             filename = "pack-com",
@@ -1419,7 +1434,6 @@ return {
             filename = "grph-trf",
             marktype = "mkiv",
             status   = "okay",
-            comment  = "namespace has to be made consistent"
         },
         {
             filename = "grph-inc",
@@ -1465,12 +1479,12 @@ return {
         {
             filename = "bibl-bib",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "delayed",
         },
         {
             filename = "bibl-tra",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "delayed",
         },
         {
             filename = "meta-xml",
@@ -1503,15 +1517,11 @@ return {
             marktype = "mkiv",
             status   = "okay",
         },
-        {
-            filename = "core-ini",
-            marktype = "mkiv",
-            status   = "unknown",
-        },
         {
             filename = "core-def",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "will always be messy",
         },
         {
             filename = "back-pdf",
diff --git a/tex/context/base/status-mkiv.tex b/tex/context/base/status-mkiv.tex
index 99c281c00..b01ba8c86 100644
--- a/tex/context/base/status-mkiv.tex
+++ b/tex/context/base/status-mkiv.tex
@@ -24,7 +24,7 @@
   [\currentdate][MkIV Status / Page \pagenumber]
 
 % \showmakeup
-\showallmakeup
+% \showallmakeup
 
 \starttext
 
@@ -51,13 +51,14 @@
                name \stopitem
     \startitem the message system will be unified \stopitem
     \startitem maybe rename dowhatevertexcommand to fromluawhatevertexcommand \stopitem
-
+    \startitem consider moving setups directly to lua end (e.g. in characterspacing, breakpoint, bitmaps etc.) \stopitem
 \stopitemize
 
 \stoptitle
 
-\definehighlight[notabene][color=darkred, style=bold]
-\definehighlight[notamark][color=darkblue,style=bold]
+\definehighlight[notabenered]   [color=darkred,   style=bold]
+\definehighlight[notabeneblue]  [color=darkblue,  style=bold]
+\definehighlight[notabeneyellow][color=darkyellow,style=bold]
 
 \startluacode
 
@@ -78,7 +79,8 @@
 
             if loaded then
 
-                local nofunknown = 0
+                local noftodo    = 0
+                local nofdelayed = 0
                 local nofloaded  = #loaded
                 local categories = { }
 
@@ -90,7 +92,6 @@
                     local l = loaded[i]
                     l.order = i
                     local category = string.match(l.filename,"([^%-]+)%-") or "module"
-                    -- print("unknown category",category)
                     local c = categories[category]
                     c[#c+1] = l
                 end
@@ -124,14 +125,17 @@
                             context.NC() context(module.filename)
                             context.NC()
                             if marktype == "mkvi" then
-                                context.notamark(marktype)
+                                context.notabeneblue(marktype)
                             else
                                 context(marktype)
                             end
                             context.NC()
-                            if status == "unknown" then
-                                context.notabene(status)
-                                nofunknown = nofunknown + 1
+                            if status == "todo" then
+                                context.notabenered(status)
+                                noftodo = noftodo + 1
+                            elseif status == "delayed" then
+                                context.notabeneyellow(status)
+                                nofdelayed = nofdelayed + 1
                             else
                                 context(status)
                             end
@@ -151,9 +155,16 @@
 
                 context.starttitle { title = string.format("summary of %s modules",what) }
 
-                    context.starttabulate { "|B|l|" }
+                    local nofdone = nofloaded - noftodo - nofdelayed
+
+                    context.starttabulate { "|B|r|" }
+                    context.HL()
+                    context.NC() context("done")    context.NC() context(nofdone)    context.NC() context.NR()
+                    context.NC() context("todo")    context.NC() context(noftodo)    context.NC() context.NR()
+                    context.NC() context("delayed") context.NC() context(nofdelayed) context.NC() context.NR()
+                    context.HL()
                     context.NC() context("loaded")  context.NC() context(nofloaded)  context.NC() context.NR()
-                    context.NC() context("unknown") context.NC() context(nofunknown) context.NC() context.NR()
+                    context.HL()
                     context.stoptabulate()
 
                 context.stoptitle()
diff --git a/tex/context/base/strc-flt.mkvi b/tex/context/base/strc-flt.mkvi
index 000b74831..06fd02bdc 100644
--- a/tex/context/base/strc-flt.mkvi
+++ b/tex/context/base/strc-flt.mkvi
@@ -595,7 +595,7 @@
    \splitfloat{\strc_floats_place_next_box_normal}}
 
 \unexpanded\def\strc_floats_place_next_box_normal
-  {\ifsomefloatwaiting
+  {\ifconditional\c_page_floats_some_waiting
      % this was \checkwaitingfloats spread all over
      \doifinsetelse\v!always\floatlocation
        {\showmessage\m!floatblocks5\empty}
@@ -703,19 +703,15 @@
 % documenteren in details
 
 \def\strc_floats_analyze_variables_one
-  {\doifelse{\floatparameter\c!local}\v!yes % fout keyword
-     \globalcenterfloatboxtrue
-     \globalcenterfloatboxfalse
-   \ifglobalcenterfloatbox
-     \localcenterfloatboxtrue
+  {\doifelse{\floatparameter\c!local}\v!yes\settrue\setfalse\c_page_floats_center_box_global % fout keyword
+   \ifconditional\c_page_floats_center_box_global
+     \settrue\c_page_floats_center_box_local
    \else
-     \doifinsetelse\v!local\floatlocation
-       \localcenterfloatboxtrue
-       \localcenterfloatboxfalse
+     \doifinsetelse\v!local\floatlocation\settrue\setfalse\c_page_floats_center_box_local
    \fi
    \doifnotcommon{\v!always,\v!here,\v!force}\floatlocation % ! ! ! ! ! !
-     {\globalcenterfloatboxfalse
-      \localcenterfloatboxfalse}}
+     {\setfalse\c_page_floats_center_box_global
+      \setfalse\c_page_floats_center_box_local}}
 
 \let\naturalfloatheight\!!zeropoint
 \let\naturalfloatwidth \!!zeropoint
@@ -817,7 +813,7 @@
    \global\insidefloatfalse}
 
 % \def\strc_floats_set_local_hsize
-%   {\iflocalcenterfloatbox
+%   {\ifconditional\c_page_floats_center_box_local
 %      \seteffectivehsize
 %      \hsize\localhsize
 %    \else
@@ -830,7 +826,7 @@
 \newdimen\availablefloatheight
 
 \def\strc_floats_set_local_hsize
-  {\iflocalcenterfloatbox
+  {\ifconditional\c_page_floats_center_box_local
      % also available check here?
      \seteffectivehsize
      \hsize\localhsize
@@ -1171,7 +1167,7 @@
    \dostoptagged
    \blank[\rootfloatparameter\c!spaceafter]%
    \strc_floats_end_text_group
-   \doinsertfloatinfo}
+   \page_floats_report_total}
 
 \def\borderedfloatbox
   {\begingroup
@@ -1756,6 +1752,8 @@
 %     test \placefigure{\input zapf\relax}{\externalfigure[cow.pdf][frame=on,grid=depth]} test \page
 % \stoptext
 
+% This might move to page-flt:
+
 \newif\ifpostponecolumnfloats \postponecolumnfloatsfalse % don't change
 
 \setnewconstant\postcenterfloatmethod\plusone
@@ -1774,9 +1772,9 @@
    \global\setbox\floatbox\hbox to \scratchdimen
    % {\hfill\box\floatbox\hfill}} % geen \hss, gaat mis in kolommen !
    % {\hss  \box\floatbox\hss  }} % wel \hss, anders mis in colset
-     {\ifglobalcenterfloatbox
+     {\ifconditional\c_page_floats_center_box_global
         \donetrue
-      \else\iflocalcenterfloatbox
+      \else\ifconditional\c_page_floats_center_box_local
         \donetrue
       \else
         \donefalse
@@ -1909,7 +1907,7 @@
   {\ctxcommand{analysefloatmethod("#1")}}
 
 \def\somesomewherefloat[#1]%
-  {\dofloatssavesomewherefloat\s!somewhere{#1}}
+  {\page_floats_save_somewhere_float\s!somewhere{#1}}
 
 \def\strc_floats_get_box
   {\ifvisible
@@ -2072,45 +2070,49 @@
 
 %D Local floats:
 
-\def\setuplocalfloats
-  {\getparameters[\??lf]}
+\installcorenamespace{localfloats}
+\installcorenamespace{localfloatstack}
+
+\installsetuponlycommandhandler \??localfloats {localfloats}
 
 \setuplocalfloats
   [%\c!before=\blank,
    %\c!after=\blank,
    \c!inbetween=\blank]
 
-\initializeboxstack{localfloats}
+\initializeboxstack\??localfloatstack
 
-\newcounter\noflocalfloats
+\newcounter\c_strc_localfloats_n
 
-\def\resetlocalfloats
-  {\doglobal\newcounter\noflocalfloats
-   \initializeboxstack{localfloats}}
+\unexpanded\def\resetlocalfloats
+  {\global\c_strc_localfloats_n\zerocount
+   \initializeboxstack\??localfloatstack}
 
-\def\somelocalfloat
-  {\doglobal\increment\noflocalfloats
-   \savebox{localfloats}{\noflocalfloats}{\box\floatbox}}
+\unexpanded\def\somelocalfloat
+  {\global\advance\c_strc_localfloats_n\plusone
+   \savebox\??localfloatstack{\number\c_strc_localfloats_n}{\box\floatbox}}
 
-\def\getlocalfloats
-  {\dorecurse\noflocalfloats
+\unexpanded\def\getlocalfloats
+  {\dorecurse\c_strc_localfloats_n
      {\ifnum\recurselevel=\plusone % 1\relax
-        \getvalue{\??lf\c!before}%
+        \directlocalfloatsparameter\c!before
       \else
-        \getvalue{\??lf\c!inbetween}%
+        \directlocalfloatsparameter\c!inbetween
       \fi
-      \dontleavehmode\hbox{\foundbox{localfloats}\recurselevel}%
-      \ifnum\recurselevel=\noflocalfloats\relax
-        \getvalue{\??lf\c!after}%
+      \dontleavehmode\hbox{\foundbox\??localfloatstack\recurselevel}%
+      \ifnum\recurselevel=\c_strc_localfloats_n\relax
+        \directlocalfloatsparameter\c!after
       \fi}}
 
 \def\flushlocalfloats
   {\getlocalfloats
    \resetlocalfloats}
 
-\unexpanded\def\getlocalfloat#1{\expanded{\foundbox{localfloats}{\number#1}}}
+\unexpanded\def\getlocalfloat#1%
+  {\normalexpanded{\foundbox{\??localfloatstack}{\number#1}}}
 
-\def\forcelocalfloats{\let\forcedfloatmethod\v!local}
+\unexpanded\def\forcelocalfloats
+  {\let\forcedfloatmethod\v!local}
 
 \installfloatmethod \s!singlecolumn \v!local \somelocalfloat
 \installfloatmethod \s!multicolumn  \v!local \somelocalfloat
diff --git a/tex/context/base/strc-ind.mkiv b/tex/context/base/strc-ind.mkiv
index 4b65c7407..0098bff7d 100644
--- a/tex/context/base/strc-ind.mkiv
+++ b/tex/context/base/strc-ind.mkiv
@@ -57,6 +57,7 @@
 
 \newcount\c_strc_indentedtexts_nesting
 \newdimen\d_strc_indentedtexts_width
+\newdimen\d_strc_indentedtexts_distance
 
 \appendtoks
    \setuevalue    {\e!start\currentindentedtext}{\strc_indentedtexts_start{\currentindentedtext}\c_strc_indentedtexts_nesting}%
@@ -67,12 +68,13 @@
    \setuevalue{\v!sub\v!sub\currentindentedtext}{\strc_indentedtexts_direct{\currentindentedtext}{2}}%
 \to \everydefineindentedtext
 
-\unexpanded\def\strc_indentedtexts_start#1#2%
+\unexpanded\def\strc_indentedtexts_start#1#2% we need to get rid of \spr
   {\par
    \begingroup
-   \c_strc_indentedtexts_nesting#2\relax
    \edef\currentindentedtext{#1}%
+   \c_strc_indentedtexts_nesting#2\relax
    \indentedtextparameter\c!before
+   \d_strc_indentedtexts_distance\indentedtextparameter\c!distance\relax
    \doifnothing{\indentedtextparameter\c!sample}
      {\setindentedtextparameter\c!sample{\indentedtextparameter\c!text}}%
    \assignwidth
@@ -81,15 +83,15 @@
      {\useindentedtextstyleandcolor\c!headstyle\c!headcolor
       \indentedtextparameter\c!sample
       \spr{\indentedtextparameter\c!separator}}
-     {\indentedtextparameter\c!distance}%
-   \advance\d_strc_indentedtexts_width \indentedtextparameter\c!distance
+     {\d_strc_indentedtexts_distance}%
+   \advance\d_strc_indentedtexts_width \d_strc_indentedtexts_distance
    \setbox\scratchbox\hbox to \d_strc_indentedtexts_width
      {\useindentedtextstyleandcolor\c!headstyle\c!headcolor
       \strut
       \indentedtextparameter\c!text
       \hss
       \spr{\indentedtextparameter\c!separator}%
-      \hskip\indentedtextparameter\c!distance}%
+      \hskip\d_strc_indentedtexts_distance}%
    \parindent\zeropoint
    \hskip\c_strc_indentedtexts_nesting\d_strc_indentedtexts_width
    \advance\c_strc_indentedtexts_nesting\plusone
diff --git a/tex/context/base/strc-mat.mkiv b/tex/context/base/strc-mat.mkiv
index a6763e27e..7cdc68a73 100644
--- a/tex/context/base/strc-mat.mkiv
+++ b/tex/context/base/strc-mat.mkiv
@@ -54,7 +54,7 @@
 
 \defineconversionset
   [\v!formula]
-  [numbers,characters]
+  [numbers,characters] % no \v! ?
 
 \strc_counter_preset_using_parameter\setupformulas\sharedcounterparameter
 
@@ -68,22 +68,22 @@
 
 \appendtoks
     \normalexpanded{\definelist[\currentformula]}% is expansion needed?
-    \setuevalue{\e!start\currentformula\v!formula}{\dostartformula{\currentformula}}%
-    \setuevalue{\e!stop \currentformula\v!formula}{\dostopformula}%
+    \setuevalue{\e!start\currentformula\v!formula}{\strc_formulas_start_formula{\currentformula}}%
+    \setuevalue{\e!stop \currentformula\v!formula}{\strc_formulas_stop_formula}%
 \to \everydefineformula
 
 \definelist[\v!formula]
 
-\setuvalue{\e!start\v!formula}{\dostartformula{}}
-\setuvalue{\e!stop \v!formula}{\dostopformula}
+\setuvalue{\e!start\v!formula}{\strc_formulas_start_formula{}}
+\setuvalue{\e!stop \v!formula}{\strc_formulas_stop_formula}
 
-\let\dostartformula\relax % defined later
-\let\dostopformula \relax % defined later
+\let\strc_formulas_start_formula\relax % defined later
+\let\strc_formulas_stop_formula \relax % defined later
 
-\unexpanded\def\defineformulaalternative         % this might change ... start and stop can become keys
-  {\dotripleargument\dodefineformulaalternative} % to the general define .. s!startcommand
+\unexpanded\def\defineformulaalternative               % this might change ... start and stop can become keys
+  {\dotripleargument\strc_formulas_define_alternative} % to the general define .. s!startcommand
 
-\def\dodefineformulaalternative[#1][#2][#3]%
+\def\strc_formulas_define_alternative[#1][#2][#3]%
   {\setvalue{\e!start#1\v!formula}{#2}%
    \setvalue{\e!stop #1\v!formula}{#3}}
 
@@ -126,8 +126,8 @@
 
 % implementation
 
-\def\storecurrentformulanumber#1#2#3#4#5% ref, todo:str, \sync % todo: title etc (like float)
-  {\settrue\handleformulanumber
+\unexpanded\def\strc_formulas_store_number#1#2#3#4#5% ref, todo:str, \sync % todo: title etc (like float)
+  {\settrue\c_strc_formulas_handle_number
    \strc_counters_register_component
      {formula}%
      \setupcurrentformula \formulaparameter \detokenizedformulaparameter
@@ -143,68 +143,66 @@
 
 % modes: 0=unset, 1=forced, 2=none, 3=reference
 
-\newconstant\placeformulanumbermode
-\newconstant\formulasnumbermode
-\newconstant\subformulasnumbermode
-\newconstant\nestedformulanumbermode
+\newconstant\c_strc_formulas_place_number_mode
+\newconstant\c_strc_formulas_number_mode
+\newconstant\c_strc_formulas_sub_number_mode
+\newconstant\c_strc_formulas_nested_number_mode
 
 \appendtoks
-    \placeformulanumbermode \zerocount
-    \formulasnumbermode     \zerocount
-    \subformulasnumbermode  \zerocount
-    \nestedformulanumbermode\zerocount
+    \c_strc_formulas_place_number_mode \zerocount
+    \c_strc_formulas_number_mode       \zerocount
+    \c_strc_formulas_sub_number_mode   \zerocount
+    \c_strc_formulas_nested_number_mode\zerocount
 \to \everyresetformulas
 
-\newconditional\handleformulanumber
-\newconditional\incrementformulanumber
-
-\newconditional\insideplaceformula
-\newconditional\insideplacesubformula
-\newconditional\insideformulas
-\newconditional\insidesubformulas
+\newconditional\c_strc_formulas_handle_number
+\newconditional\c_strc_formulas_increment
+\newconditional\c_strc_formulas_inside_place
+\newconditional\c_strc_formulas_inside_place_sub
+\newconditional\c_strc_formulas_inside_formulas
+\newconditional\c_strc_formulas_inside_formulas_sub
 
 \appendtoks
-    \global\setfalse\insideplaceformula
-    \global\setfalse\insideplacesubformula
+    \global\setfalse\c_strc_formulas_inside_place
+    \global\setfalse\c_strc_formulas_inside_place_sub
 \to \everyresetformulas
 
-\def\handleplaceformulanumbering % place formula
-  {\settrue\handleformulanumber
-   \docheckformulareference\placeformulanumbermode\currentplaceformulareference
-   \glet\doplaceformulanumber \doplaceformulanumberindeed
-   \glet\donestedformulanumber\donestedformulanumberindeed}
+\def\strc_formulas_place_numbering % place formula
+  {\settrue\c_strc_formulas_handle_number
+   \strc_formulas_check_reference\c_strc_formulas_place_number_mode\currentplaceformulareference
+   \glet\strc_formulas_place_number\strc_formulas_place_number_indeed
+   \glet\strc_formulas_place_number_nested\strc_formulas_place_number_nested_indeed}
 
-\def\handleformulasnumbering % formulas
-  {\docheckformulareference\formulasnumbermode\currentformulareference}
+\def\strc_formulas_handle_number % formulas
+  {\strc_formulas_check_reference\c_strc_formulas_number_mode\currentformulareference}
 
-\def\handlesubformulasnumbering % sub formulas
-  {\docheckformulareference\subformulasnumbermode\currentsubformulasreference
+\def\strc_formulas_handle_sub_number % sub formulas
+  {\strc_formulas_check_reference\c_strc_formulas_sub_number_mode\currentsubformulasreference
    \strc_counters_increment\v!formula
-   \storecurrentformulanumber
+   \strc_formulas_store_number
      \currentsubformulasreference
      \empty
      \currentsubformulasnumber
      \currentsubformulassynchronize
-     \currentsubformulasattribute
-  }
+     \currentsubformulasattribute}
 
-\let\dotraceformulareferencestate\relax
-\let\doshowformulareferencestate \relax
+\let\strc_formulas_reference_trace\relax
+\let\strc_formulas_reference_show \relax
 
-% \def\dotraceformulareferencestate
+% \def\strc_formulas_reference_trace
 %   {\rlap{\hbox{\quad\tt\txx[%
-%       \number\placeformulanumbermode,%
-%       \number\formulasnumbermode,%
-%       \number\subformulasnumbermode,%
-%       \number\nestedformulanumbermode
+%       \number\c_strc_formulas_place_number_mode,%
+%       \number\c_strc_formulas_number_mode,%
+%       \number\c_strc_formulas_sub_number_mode,%
+%       \number\c_strc_formulas_nested_number_mode
 %    ]}}}
 
-% \def\doshowformulareferencestate
+% \def\strc_formulas_reference_show
 %   {\writestatus{\v!formula}%
-%      {place:      \number\placeformulanumbermode,\space
-%       formula:    \number\formulasnumbermode,\space
-%       subformula: \number\subformulasnumbermode,\space
-%       nested:     \number\nestedformulanumbermode]}}
+%      {place:      \number\c_strc_formulas_place_number_mode,\space
+%       formula:    \number\c_strc_formulas_number_mode,\space
+%       subformula: \number\c_strc_formulas_sub_number_mode,\space
+%       nested:     \number\c_strc_formulas_nested_number_mode]}}
 
 \unexpanded\def\placecurrentformulanumber
   {\rm % nodig ?
@@ -216,12 +214,12 @@
       \namedtaggedlabeltexts
         \t!formulalabel \v!formula
         \t!formulanumber\v!formula
-        {\ignorespaces\doplacecurrentformulanumber\removeunwantedspaces}%
+        {\ignorespaces\strc_formulas_place_current_number\removeunwantedspaces}%
       \formulaparameter\c!right}%
    \doif{\formulaparameter\c!location}\v!left{\hskip\formulaparameter\c!distance}}
 
-\def\doplacecurrentformulanumber
-  {\dohandlecurrentformulareferences
+\unexpanded\def\strc_formulas_place_current_number
+  {\strc_formulas_handle_current_references
    \labeltexts\currentformula{\convertedcounter[\v!formula][]}}
 
 % \def\theboxdestinationattribute#1{\iflocation\ifx#1\relax\else\ifx#1\empty\else attr      \destinationattribute#1\fi\fi\fi}
@@ -281,10 +279,10 @@
 
 % currently we do the number, some day we will do the (sub) formula
 
-\def\dohandlecurrentformulareferences
-  {\doshowformulareferencestate
-   \ifnum\placeformulanumbermode=\plusthree
-     \storecurrentformulanumber
+\def\strc_formulas_handle_current_references
+  {\strc_formulas_reference_show
+   \ifnum\c_strc_formulas_place_number_mode=\plusthree
+     \strc_formulas_store_number
        \currentplaceformulareference
        \empty
        \currentplaceformulanumber
@@ -294,8 +292,8 @@
      \glet\currentplaceformulasynchronize\relax
      \theformuladestinationattribute\currentplaceformulaattribute
    \fi
-   \ifnum\formulasnumbermode=\plusthree
-     \storecurrentformulanumber
+   \ifnum\c_strc_formulas_number_mode=\plusthree
+     \strc_formulas_store_number
        \currentformulasreference
        \empty
        \currentformulasnumber
@@ -305,12 +303,12 @@
      \glet\currentformulassynchronize\relax
      \theformuladestinationattribute\currentformulasattribute
    \fi
-   \ifnum\subformulasnumbermode=\plusthree
+   \ifnum\c_strc_formulas_sub_number_mode=\plusthree
      \currentsubformulassynchronize
      \glet\currentsubformulassynchronize\relax
    \fi
-   \ifnum\nestedformulanumbermode=\plusthree
-     \storecurrentformulanumber
+   \ifnum\c_strc_formulas_nested_number_mode=\plusthree
+     \strc_formulas_store_number
        \currentnestedformulareference
        \empty
        \currentnestedformulanumber
@@ -323,55 +321,55 @@
 
 % needs checking ... too many:
 
-\def\dohandleformulanumbering
+\def\strc_formulas_handle_numbering
   {\strc_counters_increment\v!formula
    \doiftext\currentplaceformulasuffix{\strc_counters_setown_sub\v!formula\plustwo\currentplaceformulasuffix}%
    \placecurrentformulanumber}
 
-\def\dohandlesubformulanumbering
+\def\strc_formulas_handle_sub_numbering
   {\doiftextelse\currentsubformulasuffix
      {\strc_counters_setown_sub\v!formula\plustwo\currentsubformulasuffix}
      {\strc_counters_increment_sub\v!formula\plustwo}%
-    \placecurrentformulanumber}
+   \placecurrentformulanumber}
 
-\def\dododoformulanumber
-  {\ifconditional\handleformulanumber
+\def\strc_formulas_number_indeed
+  {\ifconditional\c_strc_formulas_handle_number
      \hbox\bgroup
        % main counter
-       \ifconditional\insidesubformulas
+       \ifconditional\c_strc_formulas_inside_formulas_sub
          % nothing
        \else
-         \ifcase\formulasnumbermode
-           \ifcase\placeformulanumbermode
-             \dohandleformulanumbering
+         \ifcase\c_strc_formulas_number_mode
+           \ifcase\c_strc_formulas_place_number_mode
+             \strc_formulas_handle_numbering
            \or
-             \dohandleformulanumbering
+             \strc_formulas_handle_numbering
            \or
              % nothing
            \or
-             \dohandleformulanumbering
+             \strc_formulas_handle_numbering
            \fi
          \or
-           \dohandleformulanumbering
+           \strc_formulas_handle_numbering
          \or
            % nothing
          \or
-           \dohandleformulanumbering
+           \strc_formulas_handle_numbering
          \fi
        \fi
        % subcounter
-       \ifconditional\insidesubformulas
-         \ifcase\subformulasnumbermode
+       \ifconditional\c_strc_formulas_inside_formulas_sub
+         \ifcase\c_strc_formulas_sub_number_mode
            % nothing
          \or
-           \dohandlesubformulanumbering
+           \strc_formulas_handle_sub_numbering
          \or
            % nothing
          \or
-           \dohandlesubformulanumbering
+           \strc_formulas_handle_sub_numbering
          \fi
        \fi
-      \dotraceformulareferencestate
+      \strc_formulas_reference_trace
      \egroup
    \fi}
 
@@ -393,10 +391,10 @@
 %D
 %D Otherwise we get a missing \type {$$} error reported.
 
-\def\resetdisplaymatheq
+\unexpanded\def\resetdisplaymatheq % when used?
   {\let\normalleqno\gobbleoneargument \let\leqno\gobbleoneargument
    \let\normalreqno\gobbleoneargument \let\eqno \gobbleoneargument
-   \let\doplaceformulanumber\empty}
+   \let\strc_formulas_place_number\relax}
 
 %D \macros
 %D   {startsubformulas}
@@ -431,28 +429,36 @@
 
 % we don't use the skip's
 
-\def\forgetdisplayskips % to do
+\unexpanded\def\strc_formulas_forget_display_skips
   {\abovedisplayskip     \zeropoint
    \belowdisplayskip     \zeropoint
    \abovedisplayshortskip\zeropoint
    \belowdisplayshortskip\zeropoint}
 
-\def\predisplaysizethreshhold{2em} % was 3em
+% \def\predisplaysizethreshhold{2\emwidth} % was 3\emwidth
 
-\def\leftdisplayskip    {\leftskip}
-\def\rightdisplayskip   {\rightskip}
-\def\leftdisplaymargin  {\formulaparameter\c!leftmargin}
-\def\rightdisplaymargin {\formulaparameter\c!rightmargin}
+\newdimen\d_strc_formulas_display_skip_left
+\newdimen\d_strc_formulas_display_skip_right
+\newdimen\d_strc_formulas_display_margin_left
+\newdimen\d_strc_formulas_display_margin_right
+\newdimen\d_strc_formulas_display_pre_threshold
+\newskip \d_strc_formulas_display_skip_par
 
-\def\beforedisplayspace
-  {\doifnot{\formulaparameter\c!spacebefore}\v!none{\blank[\formulaparameter\c!spacebefore]}}
+\unexpanded\def\beforedisplayspace
+  {\edef\p_spacebefore{\formulaparameter\c!spacebefore}%
+   \ifx\p_spacebefore\v!none \else
+     \blank[\p_spacebefore]%
+   \fi}
 
-\def\afterdisplayspace
-  {\doifnot{\formulaparameter\c!spaceafter }\v!none{\blank[\formulaparameter\c!spaceafter ]}}
+\unexpanded\def\afterdisplayspace
+  {\edef\p_spacebefore{\formulaparameter\c!spaceafter}%
+   \ifx\p_spaceaftere\v!none \else
+     \blank[\p_spaceafter]%
+   \fi}
 
-\def\setdisplaydimensions
-  {\displayindent\leftdisplayskip
-   \advance\displayindent\leftdisplaymargin
+\unexpanded\def\setdisplaydimensions
+  {\displayindent\d_strc_formulas_display_skip_left
+   \advance\displayindent\d_strc_formulas_display_margin_left
    \displaywidth\hsize
   %\setlocalhsize
   %\displaywidth\localhsize
@@ -461,15 +467,14 @@
    \else
      \advance\displaywidth\hangindent
    \fi
-   \advance\displaywidth\dimexpr-\displayindent-\rightdisplayskip-\rightdisplaymargin\relax
+   \advance\displaywidth\dimexpr-\displayindent-\d_strc_formulas_display_skip_right-\d_strc_formulas_display_margin_right\relax
    \hsize\displaywidth} % new, else overfull in itemize
 
-\unexpanded\def\dostartformula#1%
-  {\dodoubleempty\dodostartformula[#1]}
+\unexpanded\def\strc_formulas_start_formula#1%
+  {\dodoubleempty\strc_formulas_start_formula_indeed[#1]}
 
-\newskip\formulaparskip
-\newskip\formulastrutht
-\newskip\formulastrutdp
+% \newskip\formulastrutht
+% \newskip\formulastrutdp
 
 %D \startbuffer
 %D \startformula[9pt] x = 1 \stopformula
@@ -478,38 +483,56 @@
 %D
 %D \typebuffer \getbuffer
 
-\def\dodostartformula[#1][#2]% setting leftskip adaption is slow !
+\unexpanded\def\strc_formulas_start_formula_indeed[#1][#2]% setting leftskip adaption is slow !
   {\bgroup % HERE
    \def\currentformula{#1}%
    \dostarttagged\t!formula\currentformula
    \the\everybeforedisplayformula
-   \formulaparskip\parskip
-   \formulastrutdp\strutdepth
-   \formulastrutht\strutheight
-   \doifsomething{#2}{\switchtoformulabodyfont[#2]}%
-   \parskip\formulaparskip
-   % may look better in itemizations
-   \doif{\formulaparameter\c!option}\v!middle
-     {\def\leftdisplayskip{\zeropoint}%
-      \def\rightdisplayskip{\zeropoint}}%
-   % this was an experiment
-   \doifsomething{\formulaparameter\c!margin}% so we test first
-     {\dosetleftskipadaption{\formulaparameter\c!margin}%
-      \edef\leftdisplaymargin{\the\leftskipadaption}}% overloaded
-   \long\def\dostartformula##1{\bgroup\dostarttagged\t!subformula\def\dostopformula{\dostoptagged\egroup}}%
-   \freezedimenmacro\leftdisplayskip
-   \freezedimenmacro\rightdisplayskip
-   \freezedimenmacro\leftdisplaymargin
-   \freezedimenmacro\rightdisplaymargin
-   \freezedimenmacro\predisplaysizethreshhold
-   \forgetdisplayskips
+   \d_strc_formulas_display_skip_par\parskip\relax
+  %\formulastrutdp\strutdepth
+  %\formulastrutht\strutheight
+   \edef\p_option  {\formulaparameter\c!option}%
+   \edef\p_margin  {\formulaparameter\c!margin}%
+   \edef\p_bodyfont{#2}%
+  %\ifx\p_bodyfont\empty
+  %  \edef\p_bodyfont{\formulaparameter\c!bodyfont}%
+  %\fi
+   \ifx\p_bodyfont\empty \else
+     \switchtoformulabodyfont[#2]%
+   \fi
+   \parskip\d_strc_formulas_display_skip_par\relax
+   \ifx\p_option\v!middle
+     \d_strc_formulas_display_skip_left \zeropoint
+     \d_strc_formulas_display_skip_right\zeropoint
+   \else
+     \d_strc_formulas_display_skip_left \leftskip
+     \d_strc_formulas_display_skip_right\rightskip
+   \fi
+   \d_strc_formulas_display_margin_left \formulaparameter\c!leftmargin \relax
+   \d_strc_formulas_display_margin_right\formulaparameter\c!rightmargin\relax
+   \ifx\p_margin\empty \else
+     \dosetleftskipadaption\p_margin
+     \d_strc_formulas_display_margin_left\leftskipadaption
+   \fi
+   \let\strc_formulas_start_formula\strc_formulas_start_formula_nested
+  %\freezedimenmacro\predisplaysizethreshhold
+   \strc_formulas_forget_display_skips
    \getvalue{\e!start\formulaparameter\c!alternative\v!formula}}
 
+\unexpanded\def\strc_formulas_start_formula_nested#1%
+  {\bgroup
+   \let\strc_formulas_stop_formula\strc_formulas_stop_formula_nested
+   \dostarttagged\t!subformula}
+
+\unexpanded\def\strc_formulas_stop_formula_nested
+  {\dostoptagged
+   \egroup}
+
 % tagging of formulanumbers is not ok (we get two display maths blobs)
 
-\unexpanded\def\dostopformula
+\unexpanded\def\strc_formulas_stop_formula
   {\dostarttagged\t!formulacaption\empty
-   \doplaceformulanumber
+   \strc_formulas_place_number
    \dostoptagged
    \dostarttagged\t!formulacontent\empty
    \getvalue{\e!stop\formulaparameter\c!alternative\v!formula}%
@@ -520,27 +543,31 @@
    \egroup
    \hangafter\minusone   % added for side floats
    \hangindent\zeropoint % added for side floats
-   \setfalse\handleformulanumber
+   \setfalse\c_strc_formulas_handle_number
    \the\everyresetformulas
    \dorechecknextindentation} % here ?
 
 % experiment:
 
 \appendtoks
-   \edef\currentformulagrid{\formulaparameter\c!grid}%
-   \ifx\currentformulagrid\empty \else
-     \spac_grids_snap_value_auto\currentformulagrid
+   \edef\p_grid{\formulaparameter\c!grid}%
+   \ifx\p_grid\empty \else
+     \spac_grids_snap_value_auto\p_grid
    \fi
 \to \everybeforedisplayformula
 
-\def\switchtoformulabodyfont{\switchtobodyfont}
+\unexpanded\def\switchtoformulabodyfont
+  {\switchtobodyfont}
 
-\setuvalue{\v!formula}{\dosingleempty\doformula}
+\setuvalue{\v!formula}{\dosingleempty\strc_formulas_formula}
 
-\def\doformula[#1]#2% todo: tagged
+\def\strc_formulas_formula[#1]#2% todo: tagged
   {\begingroup
-   \doifsomething{#1}{\switchtoformulabodyfont[#1]}%
-   % not : \def\doformula[##1]##2{\mathematics{##2}}%
+   \edef\p_bodyfont{#1}%
+   \ifx\p_bodyfont\empty \else
+     \switchtoformulabodyfont[\p_bodyfont]%
+   \fi
+   % not : \def\strc_formulas_formula[##1]##2{\mathematics{##2}}%
    \mathematics{#2}%
    \endgroup}
 
@@ -558,7 +585,7 @@
    \beforedisplayspace
    \par
    \ifvmode
-      \prevdepth-\maxdimen % texbook pagina 79-80
+     \prevdepth-\maxdimen % texbook pagina 79-80
    \fi
    \noindent % else funny hlist with funny baselineskip
    $$% \Ustartdisplaymath
@@ -601,26 +628,26 @@
 % \fakewords{20}{40}
 
 \unexpanded\def\startsubformulas
-  {\dosingleempty\dostartsubformulas}
+  {\dosingleempty\strc_formulas_start_sub_formulas}
 
-\def\dostartsubformulas[#1]%
+\def\strc_formulas_start_sub_formulas[#1]%
   {\edef\currentsubformulasreference{#1}%
-   \global\settrue\insidesubformulas
-   \handlesubformulasnumbering}
+   \global\settrue\c_strc_formulas_inside_formulas_sub
+   \strc_formulas_handle_sub_number}
 
 \unexpanded\def\stopsubformulas
   {\nonoindentation
    \useindentnextparameter\subformulaparameter
    \the\everyresetformulas % to be checked
-   \global\setfalse\insidesubformulas
+   \global\setfalse\c_strc_formulas_inside_formulas_sub
    \dorechecknextindentation} % here ?
 
 %D Named subformulas (to be redone)
 
 \unexpanded\def\startnamedsubformulas
-  {\dosingleempty\dostartnamedsubformulas}
+  {\dosingleempty\strc_formulas_start_named_sub_formulas}
 
-\def\dostartnamedsubformulas[#1]#2%
+\def\strc_formulas_start_named_sub_formulas[#1]#2%
   {\setformulalistentry{#2}%
    \startsubformulas[#1]}
 
@@ -639,19 +666,19 @@
 %D \typebuffer \getbuffer
 
 \unexpanded\def\startformulas
-  {\dosingleempty\dostartformulas}
+  {\dosingleempty\strc_formulas_start_formulas}
 
-\def\dostartformulas[#1]#2\stopformulas % new / to be internationalized
+\def\strc_formulas_start_formulas[#1]#2\stopformulas % new / to be internationalized
   {\bgroup
    \dostarttagged\t!formulaset\empty
-   \global\settrue\insideformulas
+   \global\settrue\c_strc_formulas_inside_formulas
    \edef\currentformulasreference{#1}%
-   \handleformulasnumbering
+   \strc_formulas_handle_number
    \let\currentformula\empty
-   \forgetdisplayskips
+   \strc_formulas_forget_display_skips
    \startdisplaymath
    \setlocalhsize
-   \long\unexpanded\def\startformula##1\stopformula
+   \unexpanded\def\startformula##1\stopformula
      {\advance\scratchcounter\plusone}%
    \scratchcounter\zerocount
    #2% preroll
@@ -660,122 +687,135 @@
    \fi
    \hbox to \localhsize \bgroup
      \hss
-     \def\normalstartformula{\vskip-\strutdepth\Ustartdisplaymath}% i hate this
-     \def\normalstopformula {\Ustopdisplaymath}%
-     \unexpanded\def\startformula      {\Ustartmath\vcenter\bgroup\normalstartformula}%
-     \unexpanded\def\stopformula       {\normalstopformula\egroup\Ustopmath\hss}%
+     \let\startformula\strc_formulas_nested_formula_start
+     \let\stopformula \strc_formulas_nested_formula_stop
      #2%
      \egroup
    \stopdisplaymath
-   \global\setfalse\insideformulas
+   \global\setfalse\c_strc_formulas_inside_formulas
    \dostoptagged
    \egroup
    \the\everyresetformulas
    \hangafter\minusone    % added for side floats
    \hangindent\zeropoint} % added for side floats
 
+\unexpanded\def\strc_formulas_nested_formula_start
+  {\Ustartmath
+   \vcenter\bgroup
+   \vskip-\strutdepth
+   \Ustartdisplaymath}
+
+\unexpanded\def\strc_formulas_nested_formula_stop
+  {\Ustopdisplaymath
+   \egroup
+   \Ustopmath
+   \hss}
+
 % place
 
-\def\inhibitformulanumberflag{-}
-\def\forceformulanumberflag  {+}
+\def\m_strc_formulas_flag_inhibit{-}
+\def\m_strc_formulas_flag_force  {+}
 
-\def\docheckformulareference#1#2%
+\def\strc_formulas_check_reference#1#2%
   {#1\unless\ifx\namedformulaentry\empty % \relax % new 29/8/2010
      \plusthree
    \else\ifx#2\empty
      \zerocount
-   \else\ifx#2\forceformulanumberflag
+   \else\ifx#2\m_strc_formulas_flag_force
      \plusone
-   \else\ifx#2\inhibitformulanumberflag
+   \else\ifx#2\m_strc_formulas_flag_inhibit
      \plustwo
    \else
      \plusthree
    \fi\fi\fi\fi}
 
-\unexpanded\def\formulanumber{\doformulanumber} % for the moment
+\unexpanded\def\formulanumber
+ {\strc_formulas_number} % for the moment
 
-\def\doformulanumber
-  {\dosingleempty\dodoformulanumber}
+\def\strc_formulas_number
+  {\dosingleempty\strc_formulas_number_again}
 
-\def\dodoformulanumber[#1]%
+\def\strc_formulas_number_again[#1]%
   {\def\currentformulareference{#1}%
-   \dosinglegroupempty\dododoformulanumber}
-
-\def\redoformulanumber#1%
-  {\def\currentformulasuffix{#1}%
-   \dododoformulanumber}
+   \dosinglegroupempty\strc_formulas_number_indeed}
 
 \unexpanded\def\placeformula
-  {\global\settrue\insideplaceformula
-   \settrue\incrementformulanumber
-   \dosingleempty\doplaceformula}
+  {\global\settrue\c_strc_formulas_inside_place
+   \settrue\c_strc_formulas_increment
+   \dosingleempty\strc_formulas_place}
 
 \unexpanded\def\placesubformula
-  {\global\settrue\insideplacesubformula
-   \setfalse\incrementformulanumber
-   \dosingleempty\doplaceformula}
+  {\global\settrue\c_strc_formulas_inside_place_sub
+   \setfalse\c_strc_formulas_increment
+   \dosingleempty\strc_formulas_place}
 
-\def\doplaceformula[#1]%
+\def\strc_formulas_place[#1]%
   {\def\currentplaceformulareference{#1}%
    \let\currentplaceformulasuffix\empty
-   \doifnextbgroupelse\moreplaceformula\redoplaceformula} % [ref]{}
+   \doifnextbgroupelse\strc_formulas_place_yes\strc_formulas_place_nop\strc_formulas_place_nop} % [ref]{}
 
-\def\moreplaceformula#1%
+\def\strc_formulas_place_yes#1%
   {\def\currentplaceformulasuffix{#1}%
-   \redoplaceformula}
+   \strc_formulas_place_nop}
 
-\def\redoplaceformula
-  {\doifnextcharelse$\dispplaceformula\dodoplaceformula} % [ref]$$ [ref]\start
+\def\strc_formulas_place_nop
+  {\doifnextcharelse$\strc_formulas_place_pickup\strc_formulas_place_indeed} % [ref]$$ [ref]\start
 
-\def\dodoplaceformula
-  {\handleplaceformulanumbering}
+\def\strc_formulas_place_indeed
+  {\strc_formulas_place_numbering}
 
-\def\dispplaceformula$$#1$$%
-  {\handleplaceformulanumbering
-   \dostartformula{}#1\dostopformula}
+\def\strc_formulas_place_pickup$$#1$$%
+  {\strc_formulas_place_numbering
+   \strc_formulas_start_formula{}#1\strc_formulas_stop_formula}
 
 \let\startplaceformula\placeformula
 \let\stopplaceformula \relax
 
 % to be checked
 
-\let\doplaceformulanumber \relax
-\let\donestedformulanumber\gobbletwoarguments
+\let\strc_formulas_place_number       \relax
+\let\strc_formulas_place_number_nested\gobbletwoarguments
 
-\def\donestedformulanumberindeed#1#2%
+\def\strc_formulas_place_number_nested_indeed#1#2%
   {\def\currentnestedformulareference{#1}%
    \def\currentnestedformulasuffix{#2}%
-   \glet\doplaceformulanumber\relax
-   \docheckformulareference\nestedformulanumbermode\currentnestedformulareference
-   \ifcase\nestedformulanumbermode
+   \glet\strc_formulas_place_number\relax
+   \strc_formulas_check_reference\c_strc_formulas_nested_number_mode\currentnestedformulareference
+   \ifcase\c_strc_formulas_nested_number_mode
      % nothing
    \or
-     \doformulanumber
+     \strc_formulas_number % hm, looks ahead for []
    \or
      % nothing
    \or
-     \doformulanumber
+     \strc_formulas_number % hm, looks ahead for []
    \fi}
 
-\def\doplaceformulanumberindeed
-  {\glet\doplaceformulanumber\relax
+\def\strc_formulas_place_number_indeed
+  {\glet\strc_formulas_place_number\relax
    \doifelse{\formulaparameter\c!location}\v!left
-     {\normalleqno{\dododoformulanumber}}
-     {\normalreqno{\dododoformulanumber}}}
+     {\normalleqno{\strc_formulas_number_indeed}}
+     {\normalreqno{\strc_formulas_number_indeed}}}
 
 % todo
 
 \unexpanded\def\placenamedformula
-  {\dosingleempty\doplacenamedformula}
+  {\dosingleempty\strc_formulase_place_named}
 
-\def\doplacenamedformula[#1]#2%
+\def\strc_formulase_place_named[#1]#2%
   {\iffirstargument
-     \def\next{\placeformula[#1]}%
+     \expandafter\strc_formulase_place_named_yes
    \else
-     \let\next\placeformula
-   \fi
-   \setformulalistentry{#2}%
-   \next}
+     \expandafter\strc_formulase_place_named_nop
+   \fi}
+
+\def\strc_formulase_place_named_yes[#1]#2%
+  {\setformulalistentry{#2}%
+   \placeformula[#1]}
+
+\def\strc_formulase_place_named_nop[#1]#2%
+  {\setformulalistentry{#2}%
+   \placeformula}
 
 \let\namedformulaentry\empty % \relax % this will become a key/value so that we can do bookmarks
 
diff --git a/tex/context/base/strc-num.mkiv b/tex/context/base/strc-num.mkiv
index 9c08693be..52e4960fa 100644
--- a/tex/context/base/strc-num.mkiv
+++ b/tex/context/base/strc-num.mkiv
@@ -507,22 +507,18 @@
 % \m_strc_counters_last_registered_attribute
 % \m_strc_counters_last_registered_synchronize
 
-\newconditional\hascountercaption
-\newconditional\hascountertitle
-\newconditional\hascounternumber
-
 \unexpanded\def\strc_counters_register_component#1#2#3#4#5#6#7[#8][#9]% maybe also nolist
   {\begingroup
    %
    #2[\s!haslevel=1,#8]%
-   \edef\hascounterlevel  {#3\s!haslevel}%
-   \edef\hascountercaption{#3\s!hascaption}%
-   \edef\hascountertitle  {#3\s!hastitle}%
-   \edef\hascounternumber {#3\s!hasnumber}%
+   \edef\p_haslevel  {#3\s!haslevel}%
+   \edef\p_hascaption{#3\s!hascaption}%
+   \edef\p_hastitle  {#3\s!hastitle}%
+   \edef\p_hasnumber {#3\s!hasnumber}%
    %
-   \edef\askedprefixsegments{#3\c!prefixsegments}%
-   \ifx\askedprefixsegments\v!auto
-     \edef\askedprefixsegments{\autostructureprefixsegments#3}%
+   \edef\p_prefixsegments{#3\c!prefixsegments}%
+   \ifx\p_prefixsegments\v!auto
+     \edef\p_prefixsegments{\autostructureprefixsegments#3}%
    \fi
    %
    \edef\currentname{#3\c!name}%
@@ -534,7 +530,7 @@
      \let\currentcounter\currentname
    \fi
    %
-   \ifx\hascountercaption\v!yes
+   \ifx\p_hascaption\v!yes
      \xdef\currentstructurecomponentname           {#3\c!name}%
      \xdef\currentstructurecomponentlevel          {#3\c!level}%
      \edef\currentstructurecomponentexpansion      {#3\c!expansion}%
@@ -613,7 +609,7 @@
           list     = \!!bs\detokenize\expandafter{\currentstructurecomponentlist}\!!es,
         \fi
         },
-    \ifx\hascounternumber\v!yes
+    \ifx\p_hasnumber\v!yes
         prefixdata = {
             prefix        = "#3\c!prefix",
             separatorset  = "#3\c!prefixseparatorset",
@@ -621,7 +617,7 @@
             conversionset = "#3\c!prefixconversionset",
             set           = "#3\c!prefixset",
         %   segments      = "#3\c!prefixsegments",
-            segments      = "\askedprefixsegments",
+            segments      = "\p_prefixsegments",
             connector     = \!!bs#3\c!prefixconnector\!!es,
         },
         numberdata = {
@@ -637,7 +633,7 @@
         userdata = \!!bs\detokenize{#9}\!!es % will be converted to table at the lua end
        }
      }}%
-     \xdef\m_strc_counters_last_registered_attribute  {\ctxlua        {tex.write(structures.references.setinternalreference(nil,nil,\nextinternalreference))}}%
+     \xdef\m_strc_counters_last_registered_attribute  {\ctxcommand    {setinternalreference(nil,nil,\nextinternalreference)}}%
      \xdef\m_strc_counters_last_registered_synchronize{\ctxlatecommand{enhancelist(\m_strc_counters_last_registered_index)}}%
    \else
      \glet\m_strc_counters_last_registered_index      \relax
diff --git a/tex/context/base/strc-pag.mkiv b/tex/context/base/strc-pag.mkiv
index e3828464c..cb7cd8b23 100644
--- a/tex/context/base/strc-pag.mkiv
+++ b/tex/context/base/strc-pag.mkiv
@@ -123,8 +123,10 @@
     \savecurrentpagestate
 \to \everyshipout
 
-\def\pushpagestate{\setxvalue{\??nm:\s!userpage:\c!state}{\counterparameter\s!userpage\c!state}}
-\def\poppagestate {\normalexpanded{\setuppagenumber[\c!state=\getvalue{\??nm:\s!userpage:\c!state}]}}
+\installcorenamespace{pagestatestack} % no level yet
+
+\unexpanded\def\pushpagestate{\setxvalue{\??pagestatestack\c!state}{\counterparameter\s!userpage\c!state}}
+\unexpanded\def\poppagestate {\normalexpanded{\setuppagenumber[\c!state=\getvalue{\??pagestatestack\c!state}]}}
 
 \setuppagenumber
   [\c!way=\v!by\v!text,
@@ -249,25 +251,28 @@
 
 % Page numbers: (can move to lua) ... inconsistent names
 
+\installcorenamespace{pagenumberinc}
+\installcorenamespace{pagenumberdec}
+
 \def\dodecrementpagenumber {\global\userpageno\strc_counters_decremented\s!userpage\relax}
 \def\doincrementpagenumber {\global\userpageno\strc_counters_incremented\s!userpage\relax}
 
 \def\decrementsubpagenumber{\global\subpageno \strc_counters_decremented\s!subpage \relax}
 \def\incrementsubpagenumber{\global\subpageno \strc_counters_incremented\s!subpage \relax}
 
-\def\dosynchronizepagenumber{\global\let\@@pnstate\v!start}
+\def\dosynchronizepagenumber{\global\userpagenumberstate\plustwo} % start and visible
 
-\def\decrementpagenumber{\csname\??pn-\counterparameter\s!userpage\c!state\endcsname}
-\def\incrementpagenumber{\csname\??pn+\counterparameter\s!userpage\c!state\endcsname}
+\def\decrementpagenumber{\csname\??pagenumberdec\counterparameter\s!userpage\c!state\endcsname}
+\def\incrementpagenumber{\csname\??pagenumberinc\counterparameter\s!userpage\c!state\endcsname}
 
-\letvalue{\??pn-\v!start}\dodecrementpagenumber
-\letvalue{\??pn-\v!none }\dodecrementpagenumber
-\letvalue{\??pn-\v!empty}\dodecrementpagenumber
+\letvalue{\??pagenumberdec\v!start}\dodecrementpagenumber
+\letvalue{\??pagenumberdec\v!none }\dodecrementpagenumber
+\letvalue{\??pagenumberdec\v!empty}\dodecrementpagenumber
 
-\letvalue{\??pn+\v!start}\doincrementpagenumber
-\letvalue{\??pn+\v!none }\doincrementpagenumber
-\setvalue{\??pn+\v!empty}{\doincrementpagenumber\dosynchronizepagenumber}
-\letvalue{\??pn+\v!keep }\dosynchronizepagenumber
+\letvalue{\??pagenumberinc\v!start}\doincrementpagenumber
+\letvalue{\??pagenumberinc\v!none }\doincrementpagenumber
+\setvalue{\??pagenumberinc\v!empty}{\doincrementpagenumber\dosynchronizepagenumber}
+\letvalue{\??pagenumberinc\v!keep }\dosynchronizepagenumber
 
 % Control:
 
@@ -281,18 +286,14 @@
 
 % Setup general page numbering
 
-\newtoks\everysetuppagenumbering
-
-\unexpanded\def\setuppagenumbering
-  {\dosingleempty\dosetuppagenumbering}
+\installcorenamespace{pagenumbering}
 
-\def\dosetuppagenumbering[#1]%
-  {\getparameters[\??nm][#1]\the\everysetuppagenumbering}
+\installdirectcommandhandler \??pagenumbering {pagenumbering}
 
 \appendtoks
    \singlesidedfalse \setfalse\layoutisdoublesided
    \doublesidedfalse \setfalse\layoutissinglesided
-   \normalexpanded{\noexpand\processallactionsinset[\@@nmalternative]}
+   \normalexpanded{\processallactionsinset[\directpagenumberingparameter\c!alternative]}
      [ \v!singlesided=>\singlesidedtrue\settrue\layoutissinglesided,
        \v!doublesided=>\doublesidedtrue\settrue\layoutisdoublesided]%
    \ifdefined\trackingmarginnotestrue
@@ -314,8 +315,13 @@
     \let\dosetpagenumberlocation\relax
 \fi
 
-\def\flushfinallayoutpage
-  {\doifsomething\@@nmpage{\doifnot\@@nmpage\v!no{\page[\@@nmpage]}}}
+\unexpanded\def\flushfinallayoutpage
+  {\edef\p_page_numbering_page{\directpagenumberingparameter\c!page}%
+   \ifx\p_page_numbering_page\empty \else
+     \ifx\p_page_numbering_page\v!no \else
+       \page[\p_page_numbering_page]
+     \fi
+   \fi}
 
 % The numbered location handler is there because we need to be downward
 % compatible. So, in fact there can be multiple handlers active at the
@@ -326,11 +332,13 @@
 \unexpanded\def\placelocationpagenumber
   {\ifnum\userpagenumberstate=\plustwo
      \ifnum\overallpagenumberstate=\plusone
-        \doif\@@nmstrut\v!yes\strut
+        \doif{\directpagenumberingparameter\c!strut}\v!yes\strut
         \begingroup
-        \dousestyleparameter\@@nmstyle
-        \dousecolorparameter\@@nmcolor
-        \@@nmcommand{\@@nmleft\labeltexts\v!pagenumber{\prefixedpagenumber}\@@nmright}%
+        \usepagenumberingstyleandcolor\c!style\c!color
+        \directpagenumberingparameter\c!command
+          {\directpagenumberingparameter\c!left
+           \labeltexts\v!pagenumber\prefixedpagenumber
+           \directpagenumberingparameter\c!right}%
         \endgroup
      \fi
    \fi}
@@ -338,7 +346,9 @@
 \unexpanded\def\completepagenumber
   {\ifnum\userpagenumberstate=\plustwo
      \ifnum\overallpagenumberstate=\plusone
-        \@@nmleft\labeltexts\v!pagenumber\prefixedpagenumber\@@nmright
+        \directpagenumberingparameter\c!left
+        \labeltexts\v!pagenumber\prefixedpagenumber
+        \directpagenumberingparameter\c!right
      \fi
    \fi}
 
@@ -382,7 +392,7 @@
 \to \everysetupsubpagenumber
 
 \appendtoks % todo: set state: none, start, stop, reset
-    \doifelse\@@nmstate\v!start
+    \doifelse{\directpagenumberingparameter\c!state}\v!start
       {\overallpagenumberstate\plusone  }%
       {\overallpagenumberstate\zerocount}%
 \to \everysetuppagenumbering
diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua
index 2d6e0a1fe..16cb91373 100644
--- a/tex/context/base/strc-ref.lua
+++ b/tex/context/base/strc-ref.lua
@@ -1670,7 +1670,6 @@ function references.setandgetattribute(kind,prefix,tag,data,view) -- maybe do in
     return attr
 end
 
-commands.setinternalreference  = references.setinternalreference
 commands.setreferenceattribute = references.setandgetattribute
 
 function references.getinternalreference(n) -- n points into list (todo: registers)
diff --git a/tex/context/base/strc-ref.mkvi b/tex/context/base/strc-ref.mkvi
index 760a6babb..c11b49bd3 100644
--- a/tex/context/base/strc-ref.mkvi
+++ b/tex/context/base/strc-ref.mkvi
@@ -118,10 +118,10 @@
 
 %D These are implemented in a low level form as:
 
-\def\strc_references_text_reference          [#labels]{\strc_references_set_named_reference\s!text{#labels}{}}
-\def\strc_references_page_reference          [#labels]{\strc_references_set_named_reference\s!page{#labels}{}{}}
-\def\strc_references_full_reference          [#labels]{\strc_references_set_named_reference\s!full{#labels}{}}
-\def\strc_references_set_reference[#labels][#settings]{\strc_references_set_named_reference\s!user{#labels}{#settings}{}}
+\unexpanded\def\strc_references_text_reference          [#labels]{\strc_references_set_named_reference\s!text{#labels}{}}
+\unexpanded\def\strc_references_page_reference          [#labels]{\strc_references_set_named_reference\s!page{#labels}{}{}}
+\unexpanded\def\strc_references_full_reference          [#labels]{\strc_references_set_named_reference\s!full{#labels}{}}
+\unexpanded\def\strc_references_set_reference[#labels][#settings]{\strc_references_set_named_reference\s!user{#labels}{#settings}{}}
 
 %D Actually there is not much difference between a text and a
 %D full reference, but it's the concept that counts. The low
@@ -138,7 +138,7 @@
 
 \def\dofinishsomereference#kind{\executeifdefined{dofinish#{kind}reference}\gobbletwoarguments}
 
-\def\strc_references_set_named_reference
+\unexpanded\def\strc_references_set_named_reference
   {\ifreferencing
       \expandafter\strc_references_set_named_reference_indeed
    \else
@@ -1449,14 +1449,18 @@
 %D
 %D \showsetup{setupurl}
 
-\unexpanded\def\setupurl
-  {\dodoubleargument\getparameters[\??ur]}
+\installcorenamespace{url}
+
+\installdirectcommandhandler \??url {url}
+
+\setupurl
+  [\c!style=\v!type,
+   \c!color=]
 
 \unexpanded\def\url[#label]% move \hyphenatedurl to lua end (is already lua)
   {\dontleavehmode
    \begingroup
-   \dousestyleparameter\@@urstyle
-   \dousecolorparameter\@@urcolor
+   \useurlstyleandcolor\c!style\c!color
    \hyphenatedurl{\ctxcommand{geturl("#label")}}%
    \endgroup}
 
@@ -1526,8 +1530,9 @@
 
 % also lua, like urls and files
 
-\unexpanded\def\setupprograms
-  {\dodoubleargument\getparameters[\??pr]}
+\installcorenamespace{programs}
+
+\installdirectcommandhandler \??programs {programs}
 
 \unexpanded\def\defineprogram
   {\dotripleargument\strc_references_define_program}
@@ -1538,9 +1543,8 @@
 \def\program[#name]% incompatible, more consistent, hardy used anyway
   {\dontleavehmode
    \begingroup
-   \dousestyleparameter\@@prstyle
-   \dousecolorparameter\@@prcolor
-   \ctxcommand{getprogram("#name","\@@pralternative","\@@prspace")}%
+   \useprogramsstyleandcolor\c!style\c!color
+   \ctxcommand{getprogram("#name","\directprogramsparameter\c!alternative","\directprogramsparameter\c!space")}%
    \endgroup}
 
 %D As we can see, we directly use the special reference
@@ -1665,10 +1669,6 @@
    \c!separator=\nonbreakablespace,
    \c!export=\v!no]
 
-\setupurl
-  [\c!style=\v!type,
-   \c!color=]
-
 \setupprograms
   [\c!directory=,
    \c!style=\v!type,
diff --git a/tex/context/base/strc-reg.mkiv b/tex/context/base/strc-reg.mkiv
index e36556949..7ac21761d 100644
--- a/tex/context/base/strc-reg.mkiv
+++ b/tex/context/base/strc-reg.mkiv
@@ -47,7 +47,7 @@
 %  \index[pageclass::key]{textclass::entry}
 
 %D Parameters ... we set up levels so we need a slightly different command handler here .. okay, we
-%D can use the childs for that ... but then we need to tweak the name in order to distinguis:
+%D can use the childs for that ... but then we need to tweak the name in order to distinguish:
 %D register -> register:1 (i.e. prefix)
 
 \let\currentregister\empty
diff --git a/tex/context/base/strc-tag.mkiv b/tex/context/base/strc-tag.mkiv
index 84d6fb2d3..b84efc92c 100644
--- a/tex/context/base/strc-tag.mkiv
+++ b/tex/context/base/strc-tag.mkiv
@@ -332,4 +332,12 @@
 \unexpanded\def\settaggedmetadata[#1]%
   {\ctxlua{structures.tags.registermetadata(\!!bs#1\!!es)}}
 
+%D An overload:
+
+\let\strc_tagged_saved_bpar\bpar
+\let\strc_tagged_saved_epar\epar
+
+\unexpanded\def\bpar{\dostarttagged\t!paragraph\empty\strc_tagged_saved_bpar}
+\unexpanded\def\epar{\strc_tagged_saved_epar\dostoptagged}
+
 \protect
diff --git a/tex/context/base/supp-mat.mkiv b/tex/context/base/supp-mat.mkiv
index 21871e80d..0c2402671 100644
--- a/tex/context/base/supp-mat.mkiv
+++ b/tex/context/base/supp-mat.mkiv
@@ -91,7 +91,12 @@
 %D
 %D An example of usage of the following can be found in the MathML module:
 
-\unexpanded\def\displaymathematics#1{\relax\ifmmode#1\else\dostartformula{}#1\dostopformula\fi}
+\ifdefined\strc_formulas_start_formula \else
+    \def\strc_formulas_start_formula{\normalstartdmath}
+    \def\strc_formulas_stop_formula {\normalstopdmath }
+\fi
+
+\unexpanded\def\displaymathematics#1{\relax\ifmmode#1\else\strc_formulas_start_formula{}#1\strc_formulas_stop_formula\fi}
 \unexpanded\def\inlinemathematics   {\dontleavehmode\mathematics}
 \unexpanded\def\automathematics     {\relax\ifhmode\expandafter\inlinemathematics\else\expandafter\displaymathematics\fi}
 
diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv
index 092b5b227..0de742bd3 100644
--- a/tex/context/base/syst-aux.mkiv
+++ b/tex/context/base/syst-aux.mkiv
@@ -60,12 +60,12 @@
 
 %D As we don't have namespace definers yet, we use a special one:
 
-\newcount\c_syst_helpers_n_of_namespaces
+\newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes
 
 \def\v_interfaces_prefix_template_system{\number    \c_syst_helpers_n_of_namespaces>>}
 %def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet
 
-\unexpanded\def\installsystemnamespace#1%
+\unexpanded\def\installsystemnamespace#1% maybe move this to syst-ini
   {\ifcsname ??#1\endcsname
      \writestatus\m!system{duplicate system namespace '#1'}\wait
    \else
@@ -2428,37 +2428,37 @@
      {\syst_helpers_seventuple_empty_one_yes#1}%
      {\syst_helpers_seventuple_empty_one_nop#1}}
 
-\def\syst_helpers_seventuple_empty_one#1[#2]%
+\def\syst_helpers_seventuple_empty_one_yes#1[#2]%
   {\firstargumenttrue
    \doifnextoptionalelse
      {\syst_helpers_seventuple_empty_two_yes#1{#2}}%
      {\syst_helpers_seventuple_empty_two_nop#1{#2}}}
 
-\def\syst_helpers_seventuple_empty_two#1#2[#3]%
+\def\syst_helpers_seventuple_empty_two_yes#1#2[#3]%
   {\secondargumenttrue
    \doifnextoptionalelse
      {\syst_helpers_seventuple_empty_three_yes#1{#2}{#3}}%
      {\syst_helpers_seventuple_empty_three_nop#1{#2}{#3}}}
 
-\def\syst_helpers_seventuple_empty_three#1#2#3[#4]%
+\def\syst_helpers_seventuple_empty_three_yes#1#2#3[#4]%
   {\thirdargumenttrue
    \doifnextoptionalelse
      {\syst_helpers_seventuple_empty_four_yes#1{#2}{#3}{#4}}%
      {\syst_helpers_seventuple_empty_four_nop#1{#2}{#3}{#4}}}
 
-\def\syst_helpers_seventupleempty_four#1#2#3#4[#5]%
+\def\syst_helpers_seventupleempty_four_yes#1#2#3#4[#5]%
   {\fourthargumenttrue
    \doifnextoptionalelse
      {\syst_helpers_seventuple_empty_five_yes#1{#2}{#3}{#4}{#5}}%
      {\syst_helpers_seventuple_empty_five_nop#1{#2}{#3}{#4}{#5}}}
 
-\def\syst_helpers_seventuple_empty_five#1#2#3#4#5[#6]%
+\def\syst_helpers_seventuple_empty_five_yes#1#2#3#4#5[#6]%
   {\fifthargumenttrue
    \doifnextoptionalelse
      {\syst_helpers_seventuple_empty_six_yes#1{#2}{#3}{#4}{#5}{#6}}%
      {\syst_helpers_seventuple_empty_six_nop#1{#2}{#3}{#4}{#5}{#6}}}
 
-\def\syst_helpers_seventuple_empty_six#1#2#3#4#5#6[#7]%
+\def\syst_helpers_seventuple_empty_six_yes#1#2#3#4#5#6[#7]%
   {\sixthargumenttrue
    \doifnextoptionalelse
      {\seventhargumenttrue#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}]}%
@@ -2537,18 +2537,18 @@
      \expandafter\syst_helpers_seventuple_empty_seven_normal
    \fi}
 
-\def\syst_helpers_seventuple_empty_spaced_two            #1#2{#1[{#2}][][][][][][] }
-\def\syst_helpers_seventuple_empty_normal_two            #1#2{#1[{#2}][][][][][][]}
-\def\syst_helpers_seventuple_empty_spaced_three        #1#2#3{#1[{#2}][{#3}][][][][][] }
-\def\syst_helpers_seventuple_empty_normal_three        #1#2#3{#1[{#2}][{#3}][][][][][]}
-\def\syst_helpers_seventuple_empty_spaced_four       #1#2#3#4{#1[{#2}][{#3}][{#4}][][][][] }
-\def\syst_helpers_seventuple_empty_normal_four       #1#2#3#4{#1[{#2}][{#3}][{#4}][][][][]}
-\def\syst_helpers_seventuple_empty_spaced_five     #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][][][] }
-\def\syst_helpers_seventuple_empty_normal_five     #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][][][]}
-\def\syst_helpers_seventuple_empty_spaced_six    #1#2#3#4#5#6{#1[{#2}][{#3}][{#4}][{#5}][{#6}][][] }
-\def\syst_helpers_seventuple_empty_normal_six    #1#2#3#4#5#6{#1[{#2}][{#3}][{#4}][{#5}][{#6}][][]}
-\def\syst_helpers_seventuple_empty_spaced_seven#1#2#3#4#5#6#7{#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}][] }
-\def\syst_helpers_seventuple_empty_normal_seven#1#2#3#4#5#6#7{#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}][]}
+\def\syst_helpers_seventuple_empty_two_spaced            #1#2{#1[{#2}][][][][][][] }
+\def\syst_helpers_seventuple_empty_two_normal            #1#2{#1[{#2}][][][][][][]}
+\def\syst_helpers_seventuple_empty_three_spaced        #1#2#3{#1[{#2}][{#3}][][][][][] }
+\def\syst_helpers_seventuple_empty_three_normal        #1#2#3{#1[{#2}][{#3}][][][][][]}
+\def\syst_helpers_seventuple_empty_four_spaced       #1#2#3#4{#1[{#2}][{#3}][{#4}][][][][] }
+\def\syst_helpers_seventuple_empty_four_normal       #1#2#3#4{#1[{#2}][{#3}][{#4}][][][][]}
+\def\syst_helpers_seventuple_empty_five_spaced     #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][][][] }
+\def\syst_helpers_seventuple_empty_five_normal     #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][][][]}
+\def\syst_helpers_seventuple_empty_six_spaced    #1#2#3#4#5#6{#1[{#2}][{#3}][{#4}][{#5}][{#6}][][] }
+\def\syst_helpers_seventuple_empty_six_normal    #1#2#3#4#5#6{#1[{#2}][{#3}][{#4}][{#5}][{#6}][][]}
+\def\syst_helpers_seventuple_empty_seven_spaced#1#2#3#4#5#6#7{#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}][] }
+\def\syst_helpers_seventuple_empty_seven_normal#1#2#3#4#5#6#7{#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}][]}
 
 %D \macros
 %D   {strippedcsname}
@@ -6592,6 +6592,39 @@
 
 \unexpanded\def\signalcharacter{\char\zerocount} % \zwj
 
+%D A few secial variants of commands defined here. Some more will be moved here (e.g.
+%D from table modules.
+
+\def\dodirectdoubleempty#1#2% used in math (lookahead issues)
+  {\ifx#2[%
+     \expandafter\syst_helpers_direct_double_empty_one_yes
+   \else
+     \expandafter\syst_helpers_direct_double_empty_one_nop
+   \fi#1#2}
+
+\def\syst_helpers_direct_double_empty_one_yes#1[#2]#3%
+  {\ifx#3[\else\expandafter\syst_helpers_direct_double_empty_two_nop\fi#1[#2]#3}
+
+\def\syst_helpers_direct_double_empty_one_nop#1{#1[][]}
+\def\syst_helpers_direct_double_empty_two_nop#1[#2]{#1[#2][]}
+
+%D Used in math definitions (in an type {\edef}):
+
+%D \startbuffer
+%D [\docheckedpair{}]
+%D [\docheckedpair{a}]
+%D [\docheckedpair{a,b}]
+%D [\docheckedpair{a,b,c}]
+%D \stopbuffer
+%D
+%D \typebuffer \startlines \getbuffer \stoplines
+
+\def\docheckedpair#1%
+  {\syst_helpers_checked_pair#1,,\_o_e_p_}
+
+\def\syst_helpers_checked_pair#1,#2,#3\_o_e_p_
+  {#1,#2}
+
 %D Here are some nasty helpers. They can be used to fill often expanded token
 %D lists efficiently (see tabulate for an example).
 
diff --git a/tex/context/base/syst-ini.mkiv b/tex/context/base/syst-ini.mkiv
index b459ffffd..4dcc134ea 100644
--- a/tex/context/base/syst-ini.mkiv
+++ b/tex/context/base/syst-ini.mkiv
@@ -376,14 +376,16 @@
 
 %D More allocations:
 
-\newskip \zeroskip      \zeroskip      = 0pt plus 0pt minus 0pt
-\newdimen\zeropoint     \zeropoint     = 0pt
-\newdimen\onepoint      \onepoint      = 1pt
-\newdimen\halfapoint    \halfapoint    = 0.5pt
-\newdimen\maxdimen      \maxdimen      = 16383.99999pt
-\newdimen\onebasepoint  \onebasepoint  = 1bp
-\newdimen\scaledpoint   \scaledpoint   = 1sp
-\newdimen\thousandpoint \thousandpoint = 1000pt
+\newskip  \zeroskip      \zeroskip      = 0pt plus 0pt minus 0pt
+\newdimen \zeropoint     \zeropoint     = 0pt
+\newdimen \onepoint      \onepoint      = 1pt
+\newdimen \halfapoint    \halfapoint    = 0.5pt
+\newdimen \maxdimen      \maxdimen      = 16383.99999pt
+\newdimen \onebasepoint  \onebasepoint  = 1bp
+\newdimen \scaledpoint   \scaledpoint   = 1sp
+\newdimen \thousandpoint \thousandpoint = 1000pt
+\newmuskip\zeromuskip    \zeromuskip    = 0mu
+\newmuskip\onemuskip     \onemuskip     = 1mu
 
 \let\points   \onepoint
 \let\halfpoint\halfapoint
@@ -822,7 +824,13 @@
 
 \def\begcsname#1\endcsname{\ifcsname#1\endcsname\csname#1\endcsname\fi}
 
-%D Now come a few macros that might be needed in successive loading:
+%D Now come a few macros that might be needed in successive loading. We redefine the
+%D \type {\par} primitive pretty soon so that we get the equivalents right.
+
+\newtoks\everyendpar
+
+\normalprotected\def\endpar{\the\everyendpar\normalpar}
+\normalprotected\def\par   {\endpar}
 
 \let\endgraf\par
 \let\endline\cr
diff --git a/tex/context/base/tabl-ntb.mkiv b/tex/context/base/tabl-ntb.mkiv
index 4d2f8cc15..fca724b71 100644
--- a/tex/context/base/tabl-ntb.mkiv
+++ b/tex/context/base/tabl-ntb.mkiv
@@ -157,7 +157,7 @@
 
 \newcount\c_tabl_level
 
-\def\tabl_ntb_table_push
+\unexpanded\def\tabl_ntb_table_push
   {\ifnum\m_tabl_tbl_level>\plusone
      \tabl_ntb_parameters_reset
      % we need a proper count push/pop
@@ -167,7 +167,7 @@
      \global\intabletrue
    \fi}
 
-\def\tabl_ntb_table_pop
+\unexpanded\def\tabl_ntb_table_pop
   {\ifnum\m_tabl_tbl_level>\plusone
      \globalpopmacro\m_tabl_ntb_saved_row\global\c_tabl_ntb_row\m_tabl_ntb_saved_row
      \globalpopmacro\m_tabl_ntb_saved_col\global\c_tabl_ntb_col\m_tabl_ntb_saved_col
@@ -175,11 +175,11 @@
      \global\intablefalse
    \fi}
 
-\def\tabl_tnb_next_level
+\unexpanded\def\tabl_tnb_next_level
   {\advance\c_tabl_level\plusone
    \edef\m_tabl_tbl_level{\the\c_tabl_level}}
 
-\def\tabl_tnb_prev_level
+\unexpanded\def\tabl_tnb_prev_level
   {\advance\c_tabl_level\minusone
    \edef\m_tabl_tbl_level{\the\c_tabl_level}}
 
diff --git a/tex/context/base/tabl-tab.mkiv b/tex/context/base/tabl-tab.mkiv
index b50be8531..20ea1d766 100644
--- a/tex/context/base/tabl-tab.mkiv
+++ b/tex/context/base/tabl-tab.mkiv
@@ -854,11 +854,8 @@
    \lineskiplimit\zeropoint
    \lineskip     \zeropoint
    \tabskip      \zeropoint
-   \doifelsenothing\@@titextwidth
-     {\halign}
-     {\doifelse\@@titextwidth\v!max
-        {\halign to \hsize}
-        {\halign to \@@titextwidth}}%
+   \edef\p_tabl_table_textwidth{\directtablesparameter\c!textwidth}%
+   \halign \ifx\p_tabl_table_textwidth\empty \else to \ifx\p_tabl_table_textwidth\v!max \hsize \else \p_tabl_table_textwidth \fi\fi
 %    \the\!taTableSpread
      \bgroup
      \span
@@ -1330,26 +1327,38 @@
 \newconditional\tablerepeathead
 \newconditional\tablerepeattail
 
-
 \unexpanded\def\starttable
   {\bgroup
    \dodoubleempty\dostarttable}
 
 \unexpanded\def\dostarttable[#1][#2]% preamble optional-settings
   {\ifsecondargument
-     \getparameters[\??ti][#2]%
+     \setupcurrenttables[#2]%
    \fi
    \let\stoptable\dostoptable
-   \doif\@@tisplit\v!auto
-     {\ifinsidesplitfloat\let\@@tisplit\v!yes\fi}%
-   \doifinsetelse\@@tisplit{\v!yes,\v!repeat}
-     {\unexpanded\def\stoptable{\stoptables\egroup}%
-      \starttables}
-     {\doifelsenothing\@@tiframe
-        {\ifinsidefloat\else\startbaselinecorrection\fi}
-        {\startframedcontent[\@@tiframe]}%
-      \postponenotes
-      \firststagestarttable}%
+   \edef\p_tabl_table_split{\directtablesparameter\c!split}%
+   \edef\p_tabl_table_frame{\directtablesparameter\c!frame}%
+   \ifx\p_tabl_table_split\v!auto
+     \ifinsidesplitfloat
+       \let\p_tabl_table_split\v!yes
+       \lettablesparameter\c!split\v!yes % might be used later, best make a proper mode
+     \fi
+   \fi
+   \ifx\p_tabl_table_split\v!yes
+     \unexpanded\def\stoptable{\stoptables\egroup}%
+     \starttables
+   \else\ifx\p_tabl_table_split\v!repeat
+     \unexpanded\def\stoptable{\stoptables\egroup}%
+     \starttables
+   \else
+     \ifx\p_tabl_table_frame\empty
+       \ifinsidefloat\else\startbaselinecorrection\fi
+     \else
+       \startframedcontent[\p_tabl_table_frame]%
+     \fi
+     \postponenotes
+     \firststagestarttable
+   \fi\fi
    [#1]}
 
 % We cannot define \unexpanded\def\dostoptable a ssomehow lookahead
@@ -1365,12 +1374,14 @@
      \globalletempty\dotabletail
    \stoptablenoalign
    \dofinishtable
-   \doifelsenothing\@@tiframe
-     {\ifinsidefloat\else
+   \ifx\p_tabl_table_frame\empty
+     \ifinsidefloat\else
         \stopbaselinecorrection
         \goodbreak % compensates all the nobreaks
-      \fi}
+     \fi
+   \else
      \stopframedcontent
+   \fi
    \egroup}
 
 %D Before we can grab the argument, we have to make sure that
@@ -1465,7 +1476,7 @@
 
 % \def\doverysimpletableHL % todo
 %   {\starttablenoalign
-%      \expandafter\donormaltablefullrule\@@tiHLheight
+%      \normalexpanded{\noexpand\donormaltablefullrule\m_tabl_table_HLheight}%
 %    \stoptablenoalign}
 
 \def\dorestarttable#1%
@@ -1565,9 +1576,14 @@
   {\bgroup
    \let\stoptables\dostoptables
    \splittablestrue
-   \doifelse\@@tisplit\v!repeat
-     {\settrue \tablerepeathead\settrue \tablerepeattail}
-     {\setfalse\tablerepeathead\setfalse\tablerepeattail}%
+   \edef\p_tabl_table_split{\directtablesparameter\c!split}%
+   \ifx\p_tabl_table_split\v!repeat
+     \settrue\tablerepeathead
+     \settrue\tablerepeattail
+   \else
+     \setfalse\tablerepeathead
+     \setfalse\tablerepeattail
+   \fi
    \flushnotes
    \setbox\tablecontentbox\vbox\bgroup
    \forgetall
@@ -1899,7 +1915,7 @@
 \def\dotablevrulecommand#1% global assignments
   {\doifnumberelse{#1}
      {\global\tablevrulethicknessfactor#1\relax
-      \global\multiply\tablevrulethicknessfactor\@@tiVLwidth\relax}
+      \global\multiply\tablevrulethicknessfactor\m_tabl_table_VLwidth\relax}
      {\xdef\tablecurrentvrulecolor{#1}}}
 
 \unexpanded\def\dotableVL
@@ -1909,7 +1925,7 @@
 
 \def\dodotableVL[#1]%
   {\global\let\tablecurrentvrulecolor\empty
-   \global\tablevrulethicknessfactor\@@tiVLwidth\relax
+   \global\tablevrulethicknessfactor\m_tabl_table_VLwidth\relax
    \iffirstargument
      \rawprocesscommalist[#1]\dotablevrulecommand
    \fi
@@ -1933,7 +1949,7 @@
 \def\dotablehrulecommand#1% global assignments
   {\doifnumberelse{#1}
      {\global\tablehrulethicknessfactor#1\relax
-      \global\multiply\tablehrulethicknessfactor\@@tiHLheight\relax}
+      \global\multiply\tablehrulethicknessfactor\m_tabl_table_HLheight\relax}
      {\xdef\tablecurrenthrulecolor{#1}}}
 
 \unexpanded\def\dotableHL
@@ -1953,7 +1969,7 @@
        \writestatus\m!TABLE{change \string\MR\space into \string\SR}%
      \fi\fi
      \bgroup
-       \global\tablehrulethicknessfactor\@@tiHLheight\relax
+       \global\tablehrulethicknessfactor\m_tabl_table_HLheight\relax
        \iffirstargument
          \global\let\tablecurrenthrulecolor\empty
          \rawprocesscommalist[#1]\dotablehrulecommand
@@ -2007,7 +2023,7 @@
    \dosingleempty\dotableTB}
 
 \def\dotableTB[#1]%
-  {\blank[\iffirstargument#1\else\@@tiNL\fi]%
+  {\blank[\iffirstargument#1\else\directtablesparameter\c!NL\fi]%
    \nobreak
    \stoptablenoalign}
 
@@ -2056,7 +2072,7 @@
         \global\tabledrulespan#1\relax
       \else
         \global\tablehrulethicknessfactor#1\relax
-        \global\multiply\tablehrulethicknessfactor\@@tiVLwidth\relax
+        \global\multiply\tablehrulethicknessfactor\m_tabl_table_VLwidth\relax
       \fi}
      {\xdef\tablecurrenthrulecolor{#1}}}
 
@@ -2074,7 +2090,7 @@
        \writestatus\m!TABLE{change \string\MR\space into \string\SR}%
      \fi\fi
      \dosettableaction\tableunknownstate
-     \global\tablehrulethicknessfactor\@@tiHLheight\relax
+     \global\tablehrulethicknessfactor\m_tabl_table_HLheight\relax
      \global\tabledrulespan\zerocount
      \iffirstargument
        \global\let\tablecurrenthrulecolor\empty
@@ -2136,17 +2152,28 @@
   \let\REF  \dotablereformat
 \to \localtabledefinitions
 
-\setvalue{\??ti:\c!distance:\v!none  }{\dotableOpenUp00\def\LOW{\Lower6 }}
-\setvalue{\??ti:\c!distance:\v!small }{\dotableOpenUp00\def\LOW{\Lower6 }} % == baseline
-\setvalue{\??ti:\c!distance:\v!medium}{\dotableOpenUp11\def\LOW{\Lower7 }}
-\setvalue{\??ti:\c!distance:\v!big   }{\dotableOpenUp22\def\LOW{\Lower8 }}
+\installcorenamespace{tables}
+\installcorenamespace{tabledistance}
+\installcorenamespace{tablealign}
+
+\installsetuponlycommandhandler \??tables {tables} % some day we can have named tables
+
+\setvalue{\??tabledistance\v!none  }{\dotableOpenUp00\def\LOW{\Lower6 }}
+\setvalue{\??tabledistance\v!small }{\dotableOpenUp00\def\LOW{\Lower6 }} % == baseline
+\setvalue{\??tabledistance\v!medium}{\dotableOpenUp11\def\LOW{\Lower7 }}
+\setvalue{\??tabledistance\v!big   }{\dotableOpenUp22\def\LOW{\Lower8 }}
 
 \appendtoks
-    \getvalue{\??ti:\c!distance:\@@tidistance}%
+    \expandcheckedcsname\??tabledistance{\directtablesparameter\c!distance}\v!medium
 \to \localtabledefinitions
 
+\setvalue{\??tablealign\v!right  }{\def\dotableparalignment{\raggedright}}
+\setvalue{\??tablealign\v!left   }{\def\dotableparalignment{\raggedleft}}
+\setvalue{\??tablealign\v!middle }{\def\dotableparalignment{\raggedcenter}}
+\setvalue{\??tablealign\s!unknown}{\def\dotableparalignment{\notragged}}
+
 \appendtoks
-  \doifelse\@@tidistance\v!none
+  \doifelse{\directtablesparameter\c!distance}\v!none
     {\tablerowfactor\zerocount}
     {\tablerowfactor\plustwo  }%
 \to \localtabledefinitions
@@ -2160,31 +2187,28 @@
      \@EAEAEA\dotextmodebar
    \fi\fi}
 
-\unexpanded\def\setuptables
-  {\dosingleargument\dosetuptables}
-
-\def\dosetuptables[#1]%
-  {\getparameters[\??ti][#1]%
-   \processaction % we have a command for this
-     [\@@tialign]
-     [  \v!right=>\def\dotableparalignment{\raggedright},
-         \v!left=>\def\dotableparalignment{\raggedleft},
-       \v!middle=>\def\dotableparalignment{\raggedcenter},
-      \s!default=>\def\dotableparalignment{\notragged},
-      \s!unknown=>\def\dotableparalignment{\notragged}]%
-   \assignalfadimension\@@tiVL\@@tiVLwidth 246%
-   \assignalfadimension\@@tiHL\@@tiHLheight246}
+\appendtoks
+   \expandcheckedcsname\??tablealign{\directtablesparameter\c!align}\s!unknown
+   \assignalfadimension{\directtablesparameter\c!VL}\m_tabl_table_VLwidth 246%
+   \assignalfadimension{\directtablesparameter\c!HL}\m_tabl_table_HLheight246%
+\to \everysetuptables
 
 \def\dolocaltablesetup
-  {\@@ticommands\relax
-   \doifsomething\@@tibodyfont{\switchtobodyfont[\@@tibodyfont]}%
-   \tablelinethicknessunit\dimexpr\@@tirulethickness/\tablelinethicknessfactor\relax
-   \doifelse\@@tiheight\v!strut
-     {\let\tablestrutheightfactor\tablestrutheightfactor}
-     {\let\tablestrutheightfactor\@@tiheight}%
-   \doifelse\@@tidepth\v!strut
-     {\let\tablestrutdepthfactor\tablestrutdepthfactor}
-     {\let\tablestrutdepthfactor\@@tidepth}%
+  {\directtablesparameter\c!commands\relax
+   \doifsomething{\directtablesparameter\c!bodyfont}{\switchtobodyfont[\directtablesparameter\c!bodyfont]}%
+   \tablelinethicknessunit\dimexpr\directtablesparameter\c!rulethickness/\tablelinethicknessfactor\relax
+   \edef\p_tabl_table_height{\directtablesparameter\c!height}%
+   \edef\p_tabl_table_depth{\directtablesparameter\c!depth}%
+   \ifx\p_tabl_table_height\v!strut
+     \let\tablestrutheightfactor\tablestrutheightfactor
+   \else
+     \let\tablestrutheightfactor\p_tabl_table_height
+   \fi
+   \ifx\p_tabl_table_depth\v!strut
+     \let\tablestrutdepthfactor\tablestrutdepthfactor
+   \else
+     \let\tablestrutdepthfactor\p_tabl_table_depth
+   \fi
    \edef\tablestrutheightfactor{\withoutpt\the\dimexpr10\dimexpr\tablestrutheightfactor\points}%
    \edef\tablestrutdepthfactor {\withoutpt\the\dimexpr10\dimexpr\tablestrutdepthfactor \points}%
    \tablestrutunit\dimexpr\normalbaselineskip/12\relax % 12 is default bodyfont
@@ -2243,9 +2267,9 @@
 %D \stopcombination
 
 \setuptables
-  [HL=\v!medium,
-   VL=\v!medium,
-   NL=\v!small,
+  [\c!HL=\v!medium,
+   \c!VL=\v!medium,
+   \c!NL=\v!small,
    \c!frame=,
    \c!align=\v!right,
    \c!depth=.40, % \v!strut
@@ -2256,8 +2280,8 @@
    \c!distance=\v!medium,
    \c!bodyfont=,
    \c!commands=,
-   \c!background=\v!screen,
-   \c!backgroundscreen=\@@rsscreen,
+   \c!background=\v!screen, % huh?
+   \c!backgroundscreen=\defaultbackgroundscreen,
    \c!backgroundcolor=,
    \c!split=\v!auto]
 
diff --git a/tex/context/base/tabl-tsp.mkiv b/tex/context/base/tabl-tsp.mkiv
index 34d3df780..5777059a5 100644
--- a/tex/context/base/tabl-tsp.mkiv
+++ b/tex/context/base/tabl-tsp.mkiv
@@ -98,7 +98,7 @@
    \def\splitfloatcommand{#2}%
    \global\settrue \onlyonesplitofffloat
    \global\setfalse\somenextsplitofffloat
-   \dopushsavedfloats
+   \page_floats_push_saved
    \floatsplittingparameter\c!before
    \let\next} % \bgroup
 
@@ -156,8 +156,8 @@
      \fi
    \else
      \floatsplittingparameter\c!after
-     \dopopsavedfloats
-     \doflushsavedfloats
+     \page_floats_pop_saved
+     \page_floats_flush_saved
    \fi
    \global\settrue\splitfloatfirstdone}
 
diff --git a/tex/context/base/typo-brk.mkiv b/tex/context/base/typo-brk.mkiv
index 029f4402f..62fd72fce 100644
--- a/tex/context/base/typo-brk.mkiv
+++ b/tex/context/base/typo-brk.mkiv
@@ -38,14 +38,14 @@
 
 \def\typo_breakpoints_define_character[#1][#2][#3]% name char settings
   {\begingroup
-   \getparameters[\??bp][\c!type=1,\c!nleft=3,\c!nright=3,\s!language=,\c!left=,\c!right=,\c!middle=,#3]%
-   \ctxcommand{definebreakpoint("#1", "#2", "\reallanguagetag\@@bplanguage", {
-          type =  \@@bptype,
-         nleft = "\@@bpnleft",
-        nright = "\@@bpnright",
-         right = "\@@bpright",
-          left = "\@@bpleft",
-        middle = "\@@bpmiddle"
+   \getdummyparameters[\c!type=1,\c!nleft=3,\c!nright=3,\s!language=,\c!left=,\c!right=,\c!middle=,#3]%
+   \ctxcommand{definebreakpoint("#1", "#2", "\reallanguagetag{\directdummyparameter\s!language}", { % maybe deal with #3 at the lua end
+          type =  \directdummyparameter\c!type,
+         nleft = "\directdummyparameter\c!nleft",
+        nright = "\directdummyparameter\c!nright",
+         right = "\directdummyparameter\c!right",
+          left = "\directdummyparameter\c!left",
+        middle = "\directdummyparameter\c!middle"
    } )}%
    \endgroup}
 
diff --git a/tex/context/base/typo-cap.mkiv b/tex/context/base/typo-cap.mkiv
index 28ced7c42..feab6b35d 100644
--- a/tex/context/base/typo-cap.mkiv
+++ b/tex/context/base/typo-cap.mkiv
@@ -183,21 +183,22 @@
 %D
 %D \showsetup{setupcapitals}
 
-\let\normalsmallcapped\smallcapped
+\installcorenamespace{capitals}
 
-\definesystemvariable{kk}
+\installsetuponlycommandhandler \??capitals {capitals}
 
-\unexpanded\def\setupcapitals
-  {\dosingleempty\typo_capitals_setup}
+\let\normalsmallcapped\smallcapped
 
-\def\typo_capitals_setup[#1]% todo: don't use grouping just a switch
-  {\getparameters[\??kk][#1]%
-   \doifelse\@@kktitle\v!yes
-     {\definealternativestyle[\v!capital  ][\normalsmallcapped][\normalsmallcapped]%
-      \definealternativestyle[\v!smallcaps][\sc               ][\sc               ]}
-     {\definealternativestyle[\v!capital  ][\normalsmallcapped][\normalWORD       ]%
-      \definealternativestyle[\v!smallcaps][\sc               ][\normalWORD       ]}%
-   \doifelse\@@kksc\v!yes\userealcaps\usepseudocaps}
+\appendtoks
+    \doifelse{\directcapitalsparameter\c!title}\v!yes
+      {\definealternativestyle[\v!capital  ][\normalsmallcapped][\normalsmallcapped]%
+       \definealternativestyle[\v!smallcaps][\sc               ][\sc               ]}
+      {\definealternativestyle[\v!capital  ][\normalsmallcapped][\normalWORD       ]%
+       \definealternativestyle[\v!smallcaps][\sc               ][\normalWORD       ]}%
+    \doifelse{\directcapitalsparameter\s!sc}\v!yes
+      \userealcaps
+      \usepseudocaps
+\to \everysetupcapitals
 
 \let\uppercased\normalWORD
 \let\lowercased\normalword
diff --git a/tex/context/base/typo-del.mkiv b/tex/context/base/typo-del.mkiv
index b2213db65..7c36ef3c8 100644
--- a/tex/context/base/typo-del.mkiv
+++ b/tex/context/base/typo-del.mkiv
@@ -17,14 +17,19 @@
 
 % THIS IS OBSOLETE:
 
-\unexpanded\def\setuphyphenmark
-  {\dodoubleargument\getparameters[\??kp]}
+\installcorenamespace{hyphenmarksign} % let's not waste a setuphandler (yet)
 
 \unexpanded\def\setuphyphenmark[#1]% sign=normal|wide
-  {\dodoubleargument\getparameters[\??kp][#1]%
-   \doifelse\@@kpsign {\v!normal}% was inset?
-     {\let\textmodehyphen\normalhyphen  \let\textmodehyphendiscretionary\normalhyphendiscretionary}
-     {\let\textmodehyphen\composedhyphen\let\textmodehyphendiscretionary\composedhyphendiscretionary}}
+  {\getdummyparameters[#1]%
+   \expandcheckedcsname\??hyphenmarksign{\dummyparameter\c!sign}\v!normal}
+
+\setvalue{\??hyphenmarksign\v!normal}%
+  {\let\textmodehyphen\normalhyphen
+   \let\textmodehyphendiscretionary\normalhyphendiscretionary}
+
+\setvalue{\??hyphenmarksign\v!wide}%
+  {\let\textmodehyphen\composedhyphen
+   \let\textmodehyphendiscretionary\composedhyphendiscretionary}
 
 \setuphyphenmark[\c!sign=\v!wide]
 
@@ -32,19 +37,19 @@
 \definesymbol[\c!righthyphen] [\languageparameter\c!righthyphen]
 \definesymbol[\c!hyphen]      [\languageparameter\c!hyphen]
 
-\def\normalhyphen
+\unexpanded\def\normalhyphen
   {\hbox{\directsymbol\empty\c!hyphen}}
 
-\def\composedhyphen
+\unexpanded\def\composedhyphen
   {\hbox{\directsymbol\empty\c!compoundhyphen}}
 
-\def\normalhyphendiscretionary
+\unexpanded\def\normalhyphendiscretionary
   {\discretionary
      {\hbox{\directsymbol\empty\c!righthyphen}}
      {\hbox{\directsymbol\empty\c!lefthyphen}}
      {\hbox{\directsymbol\empty\c!hyphen}}}
 
-\def\composedhyphendiscretionary
+\unexpanded\def\composedhyphendiscretionary
   {\discretionary
      {\hbox{\directsymbol\empty\c!rightcompoundhyphen}}
      {\hbox{\directsymbol\empty\c!leftcompoundhyphen}}
@@ -219,8 +224,10 @@
   [\c!middlespeech]
   [\leftboundarycharacter\c!middlespeech{speech}]
 
-\appendtoks\def\quotation#1{"#1"}\to\simplifiedcommands
-\appendtoks\def\quote    #1{'#1'}\to\simplifiedcommands
+\appendtoks
+    \def\quotation#1{"#1"}%
+    \def\quote    #1{'#1'}%
+\to \everysimplifycommands
 
 %D The next features was so desperately needed by Giuseppe
 %D Bilotta that he made a module for it. Since this is a
diff --git a/tex/context/base/typo-spa.mkiv b/tex/context/base/typo-spa.mkiv
index 0cfe44610..df2dab47c 100644
--- a/tex/context/base/typo-spa.mkiv
+++ b/tex/context/base/typo-spa.mkiv
@@ -25,7 +25,12 @@
 
 \installcorenamespace{characterspacing}
 
-\definesystemvariable{cs} % maybe a dummy namespace
+\installsetuponlycommandhandler \??characterspacing {_p_characterspacing} % private
+
+\setup_p_characterspacing
+  [\c!left=0,
+   \c!right=0,
+   \c!alternative=0]
 
 \unexpanded\def\definecharacterspacing[#1]%
   {\ctxcommand{definecharacterspacing("#1")}}
@@ -35,11 +40,11 @@
 
 \def\typo_characterspacing_setup[#1][#2][#3]% todo: #2 list
   {\begingroup
-   \getparameters[\??cs][\c!left=0,\c!right=0,\c!alternative=0,#3]%
-   \ctxcommand{setupcharacterspacing("#1",\number#2, {
-      left        = \@@csleft,
-      right       = \@@csright,
-      alternative = \@@csalternative
+   \setupcurrent_p_characterspacing[#3]%
+   \ctxcommand{setupcharacterspacing("#1",\number#2, { % todo: just pass #3 to the lua end
+      left        = \direct_p_characterspacingparameter\c!left,
+      right       = \direct_p_characterspacingparameter\c!right,
+      alternative = \direct_p_characterspacingparameter\c!alternative
     })}%
    \endgroup}
 
diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua
index 609b93658..5d05b55fe 100644
--- a/tex/generic/context/luatex/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
 -- merged file : luatex-fonts-merged.lua
 -- parent file : luatex-fonts.lua
--- merge date  : 06/30/12 12:32:51
+-- merge date  : 07/04/12 10:42:10
 
 do -- begin closure to overcome local limits and interference
 
-- 
cgit v1.2.3